Example #1
0
__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;
}
Example #3
0
__inline bool is_last_in_bucket(memmap_free_t* mmap) {
    return get_next_free(mmap) == mmap;
}