void TransferBufferManager::remove(const TransferBufferManagerKey& key) { UAVCAN_ASSERT(!key.isEmpty()); TransferBufferManagerEntry* dyn = findFirst(key); if (dyn != UAVCAN_NULLPTR) { UAVCAN_TRACE("TransferBufferManager", "Buffer deleted, %s", key.toString().c_str()); buffers_.remove(dyn); TransferBufferManagerEntry::destroy(dyn, allocator_); } }
void TransferBufferManagerImpl::remove(const TransferBufferManagerKey& key) { assert(!key.isEmpty()); TransferBufferManagerEntry* const tbme = findFirstStatic(key); if (tbme) { UAVCAN_TRACE("TransferBufferManager", "Static buffer deleted, %s", key.toString().c_str()); tbme->reset(); optimizeStorage(); return; } DynamicTransferBufferManagerEntry* dyn = findFirstDynamic(key); if (dyn) { UAVCAN_TRACE("TransferBufferManager", "Dynamic buffer deleted, %s", key.toString().c_str()); dynamic_buffers_.remove(dyn); DynamicTransferBufferManagerEntry::destroy(dyn, allocator_); } }
/* * TransferListenerBase::TimedOutReceiverPredicate */ bool TransferListenerBase::TimedOutReceiverPredicate::operator()(const TransferBufferManagerKey& key, const TransferReceiver& value) const { if (value.isTimedOut(ts_)) { UAVCAN_TRACE("TransferListener", "Timed out receiver: %s", key.toString().c_str()); /* * TransferReceivers do not own their buffers - this helps the Map<> container to copy them * around quickly and safely (using default assignment operator). Downside is that we need to * destroy the buffers manually. * Maybe it is not good that the predicate has side effects, but I ran out of better ideas. */ parent_bufmgr_.remove(key); return true; } return false; }