mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-23 12:14:32 +08:00
sandbox: Improve/augment memory allocation functions
Implement realloc() and free() for sandbox, by adding a header to each block which contains the block size. Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Hung-ying Tyan <tyanh@chromium.org>
This commit is contained in:
parent
f4d8de48f5
commit
77595c6d9e
@ -27,6 +27,10 @@
|
||||
|
||||
/* Operating System Interface */
|
||||
|
||||
struct os_mem_hdr {
|
||||
size_t length; /* number of bytes in the block */
|
||||
};
|
||||
|
||||
ssize_t os_read(int fd, void *buf, size_t count)
|
||||
{
|
||||
return read(fd, buf, count);
|
||||
@ -128,8 +132,45 @@ void os_tty_raw(int fd)
|
||||
|
||||
void *os_malloc(size_t length)
|
||||
{
|
||||
return mmap(NULL, length, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
struct os_mem_hdr *hdr;
|
||||
|
||||
hdr = mmap(NULL, length + sizeof(*hdr), PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (hdr == MAP_FAILED)
|
||||
return NULL;
|
||||
hdr->length = length;
|
||||
|
||||
return hdr + 1;
|
||||
}
|
||||
|
||||
void *os_free(void *ptr)
|
||||
{
|
||||
struct os_mem_hdr *hdr = ptr;
|
||||
|
||||
hdr--;
|
||||
if (ptr)
|
||||
munmap(hdr, hdr->length + sizeof(*hdr));
|
||||
}
|
||||
|
||||
void *os_realloc(void *ptr, size_t length)
|
||||
{
|
||||
struct os_mem_hdr *hdr = ptr;
|
||||
void *buf = NULL;
|
||||
|
||||
hdr--;
|
||||
if (length != 0) {
|
||||
buf = os_malloc(length);
|
||||
if (!buf)
|
||||
return buf;
|
||||
if (ptr) {
|
||||
if (length > hdr->length)
|
||||
length = hdr->length;
|
||||
memcpy(buf, ptr, length);
|
||||
}
|
||||
}
|
||||
os_free(ptr);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
void os_usleep(unsigned long usec)
|
||||
|
29
include/os.h
29
include/os.h
@ -106,6 +106,35 @@ void os_tty_raw(int fd);
|
||||
*/
|
||||
void *os_malloc(size_t length);
|
||||
|
||||
/**
|
||||
* Free memory previous allocated with os_malloc()/os_realloc()
|
||||
*
|
||||
* This returns the memory to the OS.
|
||||
*
|
||||
* \param ptr Pointer to memory block to free
|
||||
*/
|
||||
void *os_free(void *ptr);
|
||||
|
||||
/**
|
||||
* Reallocate previously-allocated memory to increase/decrease space
|
||||
*
|
||||
* This works in a similar way to the C library realloc() function. If
|
||||
* length is 0, then ptr is freed. Otherwise the space used by ptr is
|
||||
* expanded or reduced depending on whether length is larger or smaller
|
||||
* than before.
|
||||
*
|
||||
* If ptr is NULL, then this is similar to calling os_malloc().
|
||||
*
|
||||
* This function may need to move the memory block to make room for any
|
||||
* extra space, in which case the new pointer is returned.
|
||||
*
|
||||
* \param ptr Pointer to memory block to reallocate
|
||||
* \param length New length for memory block
|
||||
* \return pointer to new memory block, or NULL on failure or if length
|
||||
* is 0.
|
||||
*/
|
||||
void *os_realloc(void *ptr, size_t length);
|
||||
|
||||
/**
|
||||
* Access to the usleep function of the os
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user