Greetings! Making calls to brk toward the end of accessible memory, then releasing same to a much lower value, fragments the memory causing failures for subsequent operations as detailed below. This output is stored also at http://paste.debian.net/15783/ for easier reference.
Take care, ============================================================================= (sid)camm@exodar:~/acl2-6.1$ cat t.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <assert.h> #include <string.h> long log_maxpage_bound=sizeof(long)*8-1,real_maxpage,phys_pages,available_pages; unsigned long mb; #define PAGESIZE (1L<<12) #define page(x) (((unsigned long)x)>>12) #define massert(a_) ({errno=0;if (!(a_)) {fprintf(stderr,"%s at %d of %s in %s failed, errno %d\n",#a_,__LINE__,__FILE__,__FUNCTION__,errno);exit(-1);};}) inline int mbrk(void *v) { unsigned long uv=(unsigned long)v,uc=(unsigned long)sbrk(0),ux,um; long m=((1UL<<(sizeof(long)*8-1))-1); if ((unsigned long)v>=mb) return -1; if (uv<uc) { um=uv; ux=uc; } else { um=uc; ux=uv; } if (((long)(ux-um))<0) return mbrk((void *)uc+(uv<uc ? -m : m)) || mbrk(v); return uc==(unsigned long)sbrk(uv-uc) ? 0 : -1; } int update_real_maxpage(void) { unsigned long i,j; void *end,*cur; #ifdef __MINGW32__ static long n; if (!n) { init_shared_memory(); n=1; } #endif massert(cur=sbrk(0)); for (i=0,j=(1L<<log_maxpage_bound);j>PAGESIZE;j>>=1) if ((end=cur+i+j-PAGESIZE)>cur) if (!mbrk(end)) { real_maxpage=page(end); i+=j; } massert(!mbrk(cur)); #ifdef HAVE_SYSCONF_PHYS_PAGES phys_pages=sysconf(_SC_PHYS_PAGES); #ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION if (real_maxpage>phys_pages) real_maxpage=phys_pages; #endif #endif /* available_pages=real_maxpage-first_data_page-resv_pages; */ /* for (i=t_start;i<t_other;i++) */ /* available_pages-=tm_table[i].tm_type==t_relocatable ? 2*tm_table[i].tm_npage : tm_table[i].tm_maxpage; */ return 0; } int main(int argc,char * argv[]) { int l,m; void *b,*b1; struct stat ss; unsigned long x; long i,c; sscanf(argv[4],"%ld",&c); sscanf(argv[3],"%lx",&mb); update_real_maxpage(); sscanf(argv[2],"%lx",&x); massert(!brk((void *)x)); massert(!close(0)); massert(!close(1)); /* massert(!close(2)); */ massert((l=open(argv[1],O_RDONLY))>=0); massert(!fstat(l,&ss)); if (c>=0) { c=c ? c : ss.st_size; massert((b=mmap(NULL,ss.st_size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0))!=(void *)-1); errno=0; for (i=0;i*c<ss.st_size;i++) massert(read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c)); } else { massert((b=mmap(NULL,ss.st_size,PROT_READ,MAP_SHARED,l,0))!=(void *)-1); massert((m = open ("tst", O_RDWR | O_CREAT, 0666))>=0); massert(!ftruncate (m, ss.st_size)); massert((b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1); memcpy(b1,b,ss.st_size); } return 0; } (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x9000000 0 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000 0 || echo failed read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in main failed, errno 268455948 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000 0 || echo failed read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in main failed, errno 268455948 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x70000000 0 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000 0 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000 0 || echo failed read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in main failed, errno 268455948 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000 11000000 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000 11000000 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000 11000000 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000 11000000 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b0000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a0000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x780000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x78000000 -1 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000 -1 || echo failed (sid)camm@exodar:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000 -1 || echo failed (b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void *)-1 at 108 of t.c in main failed, errno 1073741836 failed (sid)camm@exodar:~/acl2-6.1$ ============================================================================= -- Camm Maguire c...@maguirefamily.org ========================================================================== "The earth is but one country, and mankind its citizens." -- Baha'u'llah