void shm_task_free(Task* t) { // print_info(">> task_free_shared_memory\n"); ASSERT(t == task_curr); while (t->shared_mem_list.size() > 0) { SharedMemDesc *d = t->shared_mem_list.front(); detach_shared_mem(d); /* hatirlatma: detach_shared_mem listeden siliyor */ } ASSERT(t->shared_mem_list.size() == 0); }
/* dettach shared memory from calling process addres space */ void sys_shmdt() { Trapframe *tf = task_curr->registers(); const void* shmaddr = (const void*)get_param2(tf); uint32_t eflags = eflags_read(); cli(); SharedMemList_t::iterator i = task_curr->shared_mem_list.begin(); SharedMemList_t::iterator end = task_curr->shared_mem_list.end(); for ( ; i != end ; i++) { if (i->value()->start == (uint32_t)shmaddr) { break; } } if (i == end) { eflags_load(eflags); return set_return(tf, -1); } detach_shared_mem(i->value()); eflags_load(eflags); return set_return(tf, 0); }
void MatrixDouble::detach() { detach_shared_mem(((size_t*)data)-2); }
void delete_shared_mem(void* ptr, int _shmid, const char* id) { detach_shared_mem(ptr); unlink(id); if(shmctl(_shmid, IPC_RMID, 0) < 0) throw "Unable to delete shared memory"; }