void BufferManager::deinitialize() { mInitialized = false; if (mBufferPool) { // unmap & delete all cached buffer mappers for (size_t i = 0; i < mBufferPool->getCacheSize(); i++) { BufferMapper *mapper = mBufferPool->getMapper(i); mapper->unmap(); delete mapper; } delete mBufferPool; mBufferPool = NULL; } for (size_t j = 0; j < mFrameBuffers.size(); j++) { BufferMapper *mapper = mFrameBuffers.valueAt(j); mapper->unmap(); delete mapper; } mFrameBuffers.clear(); if (mGralloc) { gralloc_close_img(mGralloc); mGralloc = NULL; } if (mDataBuffer) { delete mDataBuffer; mDataBuffer = NULL; } }
BufferMapper* BufferManager::map(DataBuffer& buffer) { bool ret; BufferMapper* mapper; CTRACE(); Mutex::Autolock _l(mLock); //try to get mapper from pool mapper = mBufferPool->getMapper(buffer.getKey()); if (mapper) { // increase mapper ref count mapper->incRef(); return mapper; } // create a new buffer mapper and add it to pool do { VLOGTRACE("new buffer, will add it"); mapper = createBufferMapper(buffer); if (!mapper) { ELOGTRACE("failed to allocate mapper"); break; } ret = mapper->map(); if (!ret) { ELOGTRACE("failed to map"); delete mapper; mapper = NULL; break; } ret = mBufferPool->addMapper(buffer.getKey(), mapper); if (!ret) { ELOGTRACE("failed to add mapper"); break; } // increase mapper ref count mapper->incRef(); return mapper; } while (0); // error handling if (mapper) { mapper->unmap(); delete mapper; } return NULL; }