X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fos-common.c;h=fa845bfcac1e6e49d19db5cb0fb2a6d72b73d712;hb=0285aa5ff8416027932daa001b84429be2ca559b;hp=017dc4f3e1ada3dce6bc737897e1f538bb196c07;hpb=79cc569a97e444389350ea3f5b1017374fe16bec;p=sbcl.git diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 017dc4f..fa845bf 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -50,7 +50,7 @@ os_zero(os_vm_address_t addr, os_vm_size_t length) addr = os_validate(block_start, block_size); if (addr == NULL || addr != block_start) - lose("os_zero: block moved! 0x%08x ==> 0x%08x", + lose("os_zero: block moved! 0x%08x ==> 0x%08x\n", block_start, addr); } @@ -62,53 +62,52 @@ os_allocate(os_vm_size_t len) return os_validate((os_vm_address_t)NULL, len); } -os_vm_address_t -os_allocate_at(os_vm_address_t addr, os_vm_size_t len) +void +os_deallocate(os_vm_address_t addr, os_vm_size_t len) +{ + os_invalidate(addr,len); +} + +int +os_get_errno(void) { - return os_validate(addr, len); + return errno; } + +#if defined(LISP_FEATURE_SB_THREAD) && !defined(CANNOT_USE_POSIX_SEM_T) + void -os_deallocate(os_vm_address_t addr, os_vm_size_t len) +os_sem_init(os_sem_t *sem, unsigned int value) { - os_invalidate(addr,len); + if (-1==sem_init(sem, 0, value)) + lose("os_sem_init(%p, %u): %s", sem, value, strerror(errno)); + FSHOW((stderr, "os_sem_init(%p, %u)\n", sem, value)); } -/* (This function once tried to grow the chunk by asking os_validate - * whether the space was available, but that really only works under - * Mach.) */ -os_vm_address_t -os_reallocate(os_vm_address_t addr, os_vm_size_t old_len, os_vm_size_t len) +void +os_sem_wait(os_sem_t *sem, char *what) { - addr=os_trunc_to_page(addr); - len=os_round_up_size_to_page(len); - old_len=os_round_up_size_to_page(old_len); - - if (addr==NULL) - return os_allocate(len); - else{ - long len_diff=len-old_len; - - if (len_diff<0) - os_invalidate(addr+len,-len_diff); - else{ - if (len_diff!=0) { - os_vm_address_t new=os_allocate(len); - - if(new!=NULL){ - bcopy(addr,new,old_len); - os_invalidate(addr,old_len); - } - - addr=new; - } - } - return addr; - } + FSHOW((stderr, "%s: os_sem_wait(%p) ...\n", what, sem)); + while (-1 == sem_wait(sem)) + if (EINTR!=errno) + lose("%s: os_sem_wait(%p): %s", what, sem, strerror(errno)); + FSHOW((stderr, "%s: os_sem_wait(%p) => ok\n", what, sem)); } -int -os_get_errno(void) +void +os_sem_post(sem_t *sem, char *what) { - return errno; + if (-1 == sem_post(sem)) + lose("%s: os_sem_post(%p): %s", what, sem, strerror(errno)); + FSHOW((stderr, "%s: os_sem_post(%p)\n", what, sem)); } + +void +os_sem_destroy(os_sem_t *sem) +{ + if (-1==sem_destroy(sem)) + lose("os_sem_destroy(%p): %s", sem, strerror(errno)); +} + +#endif