__inline void remove_free_block(memmap_free_t* mmap) { memmap_t* mmap_alloc = (memmap_t*)mmap; U8 index = get_free_bucket_index(get_block_size(mmap_alloc)); if (!is_last_in_bucket(mmap)) { if (!is_first_in_bucket(mmap)) { set_next_free(get_prev_free(mmap), get_next_free(mmap)); set_prev_free(get_next_free(mmap), get_prev_free(mmap)); } else { mprgmmap[index] = get_next_free(mmap); set_prev_free(get_next_free(mmap), get_next_free(mmap)); } } else { if (!is_first_in_bucket(mmap)) { set_next_free(get_prev_free(mmap), get_prev_free(mmap)); } else { mprgmmap[index] = NULL; } } // "Isolating" the block set_prev_free(mmap, mmap); set_next_free(mmap, mmap); }
int allocate_pid(void){ int pid = -1; int offset,page,mask; if(pidmanager == 0) return -1; pthread_mutex_lock(&alloc_mutex); pid = pidmanager->last_pid; pidmanager->last_pid++; if(pidmanager->last_pid>MAX_PID){ pthread_mutex_unlock(&alloc_mutex); return -1; //no more free } page = pid / BITS_PER_PAGE; offset = pid % BITS_PER_PAGE; mask = 1 << offset; if((pidmanager->map[page].page & mask) == 0){ pidmanager->map[page].page = pidmanager->map[page].page | mask; pidmanager->map[page].num_free--; }else{ pid = get_next_free(); page = pid / BITS_PER_PAGE; offset = pid % BITS_PER_PAGE; mask = 1 << offset; pidmanager->map[page].page = pidmanager->map[page].page | mask; pidmanager->map[page].num_free--; pidmanager->last_pid = pid + 1; } pthread_mutex_unlock(&alloc_mutex); return pid; }
__inline bool is_last_in_bucket(memmap_free_t* mmap) { return get_next_free(mmap) == mmap; }