70 size_t mm_try_join(
size_t *ptr) {
71 size_t *next=ptr+*ptr+1;
78 return (*ptr)+=increase;
103 void mm_update_first_free(
size_t *start) {
117 size_t *current,*next;
134 *current=(int)(((-(
int) current)-2)>>1);
144 void *
malloc(
size_t size) {
160 *(ptr-1)=(
size_t)
ctid;
174 mm_update_first_free(ptr+*ptr+1);
179 return (
void*) (ptr+1);
198 void free(
void *the_ptr) {
204 if(ptr==
NULL || (((
size_t)ptr)&1) )
233 mm_update_first_free(ptr);
243 void *
calloc(
size_t nmemb,
size_t size) {
245 size_t original_size = size;
247 if (nmemb == 0 || size == 0)
253 if (size/nmemb != original_size)
271 if(*ptr==(
size_t)
ctid)
int mm_free_mem(void)
how many bytes of memory are free?
Interface: string functions.
void free(void *ptr)
return the allocated memory to memory management.
Interface: kernel level critical sections.
void * calloc(size_t nmemb, size_t size)
allocate and return pointer to initialized memory
void mm_reaper()
free all blocks allocated by the current process
#define LEAVE_KERNEL_CRITICAL_SECTION()
#define NULL
null pointer value
#define ENTER_KERNEL_CRITICAL_SECTION()
#define MM_SPLIT_THRESH
split off if 8+ data bytes
signed int tid_t
task id type
Internal Interface: task management.
#define MM_FREE
marker: block free
#define MM_BLOCK_RESERVED(addr)
memory from addr on is reserved
Internal Interface: memory management.
tdata_t * ctid
ptr to current process data
void * malloc(size_t size)
allocate and return pointer to uninitialized memory
size_t mm_start
end of kernel code + data
size_t * mm_first_free
ptr to first free block.
#define MM_BLOCK_FREE(addr)
memory from addr on can be allocated
Interface: reduced standard C library.
void mm_init()
initialize memory management
void * memset(void *s, int c, size_t n)
fill memory block with a byte value.
#define MM_HEADER_SIZE
2 words header: pid, size