2. MemoryBase
文章开始时说过,MemoryBase接口是建立在MemoryHeapBase接口的基础上的,它们都可以作为一个Binder对象来在进程间进行数据共享,它们的关系如下所示:
MemoryBase类包含了一个成员变量mHeap,它的类型的IMemoryHeap,MemoryBase类所代表的匿名共享内存就是通过这个成员变量来实现的。
与MemoryHeapBase的分析过程一样,我们先来看MemoryBase类在Server端的实现,然后再来看它在Client端的实现。
MemoryBase在Server端实现的类图如下所示:
MemoryBase类在Server端的实现与MemoryHeapBase类在Server端的实现是类似的,这里只要把IMemory类换成IMemoryHeap类、把BnMemory类换成BnMemoryHeap类以及MemoryBase类换成MemoryHeapBase类就变成是MemoryHeapBase类在Server端的实现了,因此,我们这里只简单分析IMemory类和MemoryBase类的实现。
IMemory类定义了MemoryBase类所需要实现的接口,这个类定义在frameworks/base/include/binder/IMemory.h文件中:
-
class IMemory : public IInterface
-
{
-
public:
-
......
-
-
virtual sp<IMemoryHeap> getMemory(ssize_t* offset=0, size_t* size=0) const = 0;
-
-
......
-
void* pointer() const;
-
size_t size() const;
-
ssize_t offset() const;
-
};
成员函数getMemory用来获取内部的MemoryHeapBase对象的IMemoryHeap接口;成员函数pointer()用来获取内部所维护的匿名共享内存的基地址;成员函数size()用来获取内部所维护的匿名共享内存的大小;成员函数offset()用来获取内部所维护的这部分匿名共享内存在整个匿名共享内存中的偏移量。
IMemory类本身实现了pointer、size和offset三个成员函数,因此,它的子类,即MemoryBase类,只需要实现getMemory成员函数就可以了。IMemory类的实现定义在frameworks/base/libs/binder/IMemory.cpp文件中:
-
void* IMemory::pointer() const {
-
ssize_t offset;
-
sp<IMemoryHeap> heap = getMemory(&offset);
-
void* const base = heap!=0 ? heap->base() : MAP_FAILED;
-
if (base == MAP_FAILED)
-
return 0;
-
return static_cast<char*>(base) + offset;
-
}
-
-
size_t IMemory::size() const {
-
size_t size;
-
getMemory(NULL, &size);
-
return size;
-
}
-
-
ssize_t IMemory::offset() const {
-
ssize_t offset;
-
getMemory(&offset);
-
return offset;
-
}
MemoryBase类声明在frameworks/base/include/binder/MemoryBase.h文件中:
-
class MemoryBase : public BnMemory
-
{
-
public:
-
MemoryBase(const sp<IMemoryHeap>& heap, ssize_t offset, size_t size);
-
......
-
virtual sp<IMemoryHeap> getMemory(ssize_t* offset, size_t* size) const;
-
-
......
-
private:
-
size_t mSize;
-
ssize_t mOffset;
-
sp<IMemoryHeap> mHeap;
-
};
MemoryBase类实现在frameworks/base/libs/binder/MemoryBase.cpp文件中:
-
MemoryBase::MemoryBase(const sp<IMemoryHeap>& heap,
-
ssize_t offset, size_t size)
-
: mSize(size), mOffset(offset), mHeap(heap)
-
{
-
}
-
-
sp<IMemoryHeap> MemoryBase::getMemory(ssize_t* offset, size_t* size) const
-
{
-
if (offset) *offset = mOffset;
-
if (size) *size = mSize;
-
return mHeap;
-
}
在它的构造函数中,接受三个参数,参数heap指向的是一个MemoryHeapBase对象,真正的匿名共享内存就是由它来维护的,参数offset表示这个MemoryBase对象所要维护的这部分匿名共享内存在整个匿名共享内存块中的起始位置,参数size表示这个MemoryBase对象所要维护的这部分匿名共享内存的大小。
成员函数getMemory的实现很简单,只是简单地返回内部的MemoryHeapBase对象的IMemoryHeap接口,如果传进来的参数offset和size不为NULL,还会把其内部维护的这部分匿名共享内存在整个匿名共享内存块中的偏移位置以及这部分匿名共享内存的大小返回给调用者。
这里我们可以看出,MemoryBase在Server端的实现只是简单地封装了MemoryHeapBase的实现。1
本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966918,如需转载请自行联系原作者