X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fos-common.c;h=3fdf92518ad4cb3c6721e003039da0b2b3d447b8;hb=bd455348d39bee562296741689882dcb97c46ba3;hp=842781ace248b375d22b9d155bc311dd602be611;hpb=28a6fdf5f4ef6c63e1631b27e2650d928b9ba62e;p=sbcl.git diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 842781a..3fdf925 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -22,11 +22,38 @@ * instead. See hpux-os.c for some useful restrictions on actual * usage. */ -/* FIXME: this should be turned into a pure inline memset where it is used. */ void os_zero(os_vm_address_t addr, os_vm_size_t length) { - memset(addr, 0, length); + os_vm_address_t block_start; + os_vm_size_t block_size; + +#ifdef DEBUG + fprintf(stderr,";;; os_zero: addr: 0x%08x, len: 0x%08x\n",addr,length); +#endif + + block_start = os_round_up_to_page(addr); + + length -= block_start-addr; + block_size = os_trunc_size_to_page(length); + + if (block_start > addr) + bzero((char *)addr, block_start-addr); + if (block_size < length) + bzero((char *)block_start+block_size, length-block_size); + + if (block_size != 0) { + /* Now deallocate and allocate the block so that it faults in + * zero-filled. */ + + os_invalidate(block_start, block_size); + addr = os_validate(block_start, block_size); + + if (addr == NULL || addr != block_start) + lose("os_zero: block moved! 0x%08x ==> 0x%08x\n", + block_start, + addr); + } } os_vm_address_t @@ -35,51 +62,12 @@ 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) -{ - return os_validate(addr, len); -} - void os_deallocate(os_vm_address_t addr, os_vm_size_t len) { os_invalidate(addr,len); } -/* (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) -{ - 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; - } -} - int os_get_errno(void) {