int HeapBlockDevice::init() { uint32_t val = core_util_atomic_incr_u32(&_init_ref_count, 1); if (val != 1) { return BD_ERROR_OK; } if (!_blocks) { _blocks = new uint8_t *[_count]; for (size_t i = 0; i < _count; i++) { _blocks[i] = 0; } } _is_initialized = true; return BD_ERROR_OK; }
void *core_util_atomic_incr_ptr(void **valuePtr, ptrdiff_t delta) { return (void *)core_util_atomic_incr_u32((uint32_t *)valuePtr, (uint32_t)delta); }
int ChainingBlockDevice::init() { int err; uint32_t val = core_util_atomic_incr_u32(&_init_ref_count, 1); if (val != 1) { return BD_ERROR_OK; } _read_size = 0; _program_size = 0; _erase_size = 0; _erase_value = -1; _size = 0; // Initialize children block devices, find all sizes and // assert that block sizes are similar. We can't do this in // the constructor since some block devices may need to be // initialized before they know their block size/count for (size_t i = 0; i < _bd_count; i++) { err = _bds[i]->init(); if (err) { goto fail; } bd_size_t read = _bds[i]->get_read_size(); if (i == 0 || (read >= _read_size && is_aligned(read, _read_size))) { _read_size = read; } else { MBED_ASSERT(_read_size > read && is_aligned(_read_size, read)); } bd_size_t program = _bds[i]->get_program_size(); if (i == 0 || (program >= _program_size && is_aligned(program, _program_size))) { _program_size = program; } else { MBED_ASSERT(_program_size > program && is_aligned(_program_size, program)); } bd_size_t erase = _bds[i]->get_erase_size(); if (i == 0 || (erase >= _erase_size && is_aligned(erase, _erase_size))) { _erase_size = erase; } else { MBED_ASSERT(_erase_size > erase && is_aligned(_erase_size, erase)); } int value = _bds[i]->get_erase_value(); if (i == 0 || value == _erase_value) { _erase_value = value; } else { _erase_value = -1; } _size += _bds[i]->size(); } _is_initialized = true; return BD_ERROR_OK; fail: _is_initialized = false; _init_ref_count = 0; return err; }