MemoryHeapBase与MemoryBase

    技术2022-05-20  45

    MemoryHeapBase

    MemroyHeapBase也是Android搞的一套基于Binder机制的对内存操作的类。既然是Binder机制,那么肯定有一个服务端(Bnxxx),一个代理端Bpxxx。看看MemoryHeapBase定义:

    class MemoryHeapBase : public virtual BnMemoryHeap

    {

      果然,从BnMemoryHeap派生,那就是Bn端。这样就和Binder挂上钩了

    //Bp端调用的函数最终都会调到Bn这来

    对Binder机制不了解的,可以参考:

    http://blog.csdn.net/Innost/archive/2011/01/08/6124685.aspx

      有好几个构造函数,我们看看我们使用的:

    MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name)

        : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags),

          mDevice(0), mNeedUnmap(false)

    {

        const size_t pagesize = getpagesize();

    size = ((size + pagesize-1) & ~(pagesize-1));

    //创建共享内存,ashmem_create_region这个是系统提供的,可以不管它

    //设备上打开的是/dev/ashmem设备,而Host上打开的是一个tmp文件

    int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size);

    mapfd(fd, size);//把刚才那个fd通过mmap方式得到一块内存

    //不明白得去man mmap看看

    mapfd完了后,mBase变量指向内存的起始位置, mSize是分配的内存大小,mFd是

    ashmem_create_region返回的文件描述符

     

    }

    MemoryHeapBase提供了一下几个函数,可以获取共享内存的大小和位置。

    getBaseID()--->返回mFd,如果为负数,表明刚才创建共享内存失败了

    getBase()->返回mBase,内存位置

      getSize()->返回mSize,内存大小

    有了MemoryHeapBase,又搞了一个MemoryBase,这又是一个和Binder机制挂钩的类。

    唉,这个估计是一个在MemoryHeapBase上的方便类吧?因为我看见了offset

    那么估计这个类就是一个能返回当前Buffer中写位置(就是offset)的方便类

    这样就不用用户到处去计算读写位置了。

    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;

    protected:

        size_t getSize() const { return mSize; }

        ssize_t getOffset() const { return mOffset; }

        const sp<IMemoryHeap>& getHeap() const { return mHeap; }

    };

    好了,明白上面两个MemoryXXX,我们可以猜测下大概的使用方法了。

    <!--[if !supportLists]-->l         <!--[endif]-->BnXXX端先分配BnMemoryHeapBase和BnMemoryBase,

    <!--[if !supportLists]-->l         <!--[endif]-->然后把BnMemoryBase传递到BpXXX

    <!--[if !supportLists]-->l         <!--[endif]-->BpXXX就可以使用BpMemoryBase得到BnXXX端分配的共享内存了。

    注 意,既然是进程间共享内存,那么Bp端肯定使用memcpy之类的函数来操作内存,这些函数是没有同步保护的,而且Android也不可能在系统内部为这 种共享内存去做增加同步保护。所以看来后续在操作这些共享内存的时候,肯定存在一个跨进程的同步保护机制。我们在后面讲实际播放的时候会碰到。

    另外,这里的SharedBuffer最终会在Bp端也就是AudioFlinger那用到。


    最新回复(0)