Skip to content

Feature: query requested size from block (with recipe) #32

@paniq

Description

@paniq

For a port of TLSF to our systems programming language, I had the requirement to be able to recover the requested size from a block, rather than the adjusted size. I implemented it in my port, and so far it turns out to work well, with no new spatial overhead added. I thought I'd let you know how it works, in case you (maintainer or user) are interested in replicating it:

  1. block.size now stores the requested size shifted by two bits - for 64-bit that's no problem, but for 32-bit we'd truncate two bits (though I see the implementation has a 30-bit limit there anyway).
  2. block_set_size() now accepts the requested size rather than the adjusted size.
  3. block_size() transparently aligns the returned size by ALIGN_SIZE; since in all previous adjustments, adjust == align_up(size, ALIGN_SIZE), this effectively has block_size() work as it did before.
  4. block_absorb() uses block_set_size(block_size(prev) + block_size(block) + block_header_overhead) rather than offsetting prev.size directly, which fixes the operation for the new format and also quantizes the block size of free blocks.
  5. block_split() receives both adjusted and requested size; adjust is used for all calculations; request is passed to block_set_size().
  6. likewise, block_trim_free(), block_trim_used(), block_prepare_used() forward the requested size along with the adjusted size.
  7. block_trim_free_leading() just passes the same remaining size to both adjusted and requested size.
  8. malloc() and memalign() pass the requested size to block_prepare_used() along with the adjusted size.
  9. tlsf_realloc() passes the requested size to block_trim_used() along with the adjusted size.
  10. a new API function tlsf_block_request_size() retrieves the requested size from block.size, without aligning it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions