예제 #1
0
파일: tst2.c 프로젝트: koujinogaku/helloos
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");
}
예제 #2
0
파일: shm.c 프로젝트: WareX97/aPlus
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;
}
예제 #3
0
/* 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");
}
예제 #4
0
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);
}