void tst_shm2(void) { int r; int shmid; syscall_wait(10); shmid=shm_lookup(SHRMEMNAME); display_puts("shm2 lookup="); sint2dec(shmid,s); display_puts(s); r=shm_map(shmid,(void*)SHRMEMADDR); display_puts(" shm2 map="); sint2dec(r,s); display_puts(s); // display_puts("\n"); syscall_wait(50); syscall_mtx_lock((int*)SHRMEMADDR); memcpy(s,(void*)(SHRMEMADDR+sizeof(int)),4); syscall_mtx_unlock((int*)SHRMEMADDR); s[4]=0; display_puts(" shm2 shrstr="); display_puts(s); // display_puts("\n"); r=shm_unmap(shmid); display_puts(" shm2 unmap="); sint2dec(r,s); display_puts(s); display_puts("\n"); }
int shm_release(const char* path) { KASSERT(path); shm_node_t* tmp, *t2; if(strcmp(shm_queue->path, path) == 0) { t2 = shm_queue; shm_queue = shm_queue->next; shm_unmap(t2); pmm_free_frames(t2->physaddr, t2->size / MM_BLOCKSZ); kfree(t2->path); kfree(t2); return 0; } else { for(tmp = shm_queue; tmp->next; tmp = tmp->next) { t2 = tmp->next; if(strcmp(t2->path, path) == 0) { tmp->next = t2->next; shm_unmap(t2); pmm_free_frames(t2->physaddr, t2->size / MM_BLOCKSZ); kfree(t2->path); kfree(t2); return 0; } } } return -1; }
/* munmaps and unlinks the shared memory */ void shm_destroy(char *fname, void *p, size_t size) { shm_unmap(p, size); if (shm_unlink(fname) == -1) fail_en("shm_unlink"); }
int syscall_shm_unmap(int shmid, void *vmem) { if((unsigned long)vmem < CFG_MEM_KERNELMAX) return ERRNO_NOTEXIST; return shm_unmap(shmid, page_get_current_pgd(), vmem); }