int HeapBlockDevice::deinit() { if (!_is_initialized) { return BD_ERROR_OK; } uint32_t val = core_util_atomic_decr_u32(&_init_ref_count, 1); if (val) { return BD_ERROR_OK; } MBED_ASSERT(_blocks != NULL); // Memory is lazily cleaned up in destructor to allow // data to live across de/reinitialization _is_initialized = false; return BD_ERROR_OK; }
int ChainingBlockDevice::deinit() { if (!_is_initialized) { return BD_ERROR_OK; } uint32_t val = core_util_atomic_decr_u32(&_init_ref_count, 1); if (val) { return BD_ERROR_OK; } for (size_t i = 0; i < _bd_count; i++) { int err = _bds[i]->deinit(); if (err) { return err; } } _is_initialized = false; return BD_ERROR_OK; }
void *core_util_atomic_decr_ptr(void **valuePtr, ptrdiff_t delta) { return (void *)core_util_atomic_decr_u32((uint32_t *)valuePtr, (uint32_t)delta); }