ITransferBuffer* TransferBufferManager::create(const TransferBufferManagerKey& key) { if (key.isEmpty()) { UAVCAN_ASSERT(0); return UAVCAN_NULLPTR; } remove(key); TransferBufferManagerEntry* tbme = TransferBufferManagerEntry::instantiate(allocator_, max_buf_size_); if (tbme == UAVCAN_NULLPTR) { return UAVCAN_NULLPTR; // Epic fail. } buffers_.insert(tbme); UAVCAN_TRACE("TransferBufferManager", "Buffer created [num=%u], %s", getNumBuffers(), key.toString().c_str()); if (tbme != UAVCAN_NULLPTR) { UAVCAN_ASSERT(tbme->isEmpty()); tbme->reset(key); } return tbme; }
TransferBufferManager::~TransferBufferManager() { TransferBufferManagerEntry* dyn = buffers_.get(); while (dyn) { TransferBufferManagerEntry* const next = dyn->getNextListNode(); buffers_.remove(dyn); TransferBufferManagerEntry::destroy(dyn, allocator_); dyn = next; } }
/* * TransferBufferManager */ TransferBufferManagerEntry* TransferBufferManager::findFirst(const TransferBufferManagerKey& key) { TransferBufferManagerEntry* dyn = buffers_.get(); while (dyn) { UAVCAN_ASSERT(!dyn->isEmpty()); if (dyn->getKey() == key) { return dyn; } dyn = dyn->getNextListNode(); } return UAVCAN_NULLPTR; }
ITransferBuffer* TransferBufferManagerImpl::create(const TransferBufferManagerKey& key) { if (key.isEmpty()) { assert(0); return NULL; } remove(key); TransferBufferManagerEntry* tbme = findFirstStatic(TransferBufferManagerKey()); if (tbme == NULL) { DynamicTransferBufferManagerEntry* dyn = DynamicTransferBufferManagerEntry::instantiate(allocator_, max_buf_size_); tbme = dyn; if (dyn == NULL) { return NULL; // Epic fail. } dynamic_buffers_.insert(dyn); UAVCAN_TRACE("TransferBufferManager", "Dynamic buffer created [st=%u, dyn=%u], %s", getNumStaticBuffers(), getNumDynamicBuffers(), key.toString().c_str()); } else { UAVCAN_TRACE("TransferBufferManager", "Static buffer created [st=%u, dyn=%u], %s", getNumStaticBuffers(), getNumDynamicBuffers(), key.toString().c_str()); } if (tbme) { assert(tbme->isEmpty()); tbme->reset(key); } return tbme; }