/*---------- stupid mmap workaround ----------*/
-static Byte resaddrbuf[1024*1024], *resaddrbegin;
+static Byte resaddrbuf[1024*1024];
static long pagesize;
static unsigned long resaddruse;
#define RESADDR_DIEFMT "(persist mapping parameters:" \
" %p+0x%lx%%0x%lx->%p+0x%lx)"
#define RESADDR_DIEARGS resaddrbuf,(unsigned long)sizeof(resaddrbuf), \
- pagesize, resaddrbegin,resaddruse
+ pagesize, mapbase,resaddruse
static void resaddrdiee(const char *why) {
diee("%s " RESADDR_DIEFMT, why, RESADDR_DIEARGS);
}
-static void showmaps(int lno) {
- FILE *f;
- int c;
- fprintf(stderr,"=======%d======\n",lno);
- f= fopen("/proc/self/maps","r"); if (!f) diee("open maps");
- while ((c=getc(f)) != EOF)
- fputc(c,stderr);
- if (ferror(f)) diee("read maps");
- fclose(f);
-system("grep Committed_AS /proc/meminfo");
-}
-
-#define SHOWMAPS showmaps(__LINE__);
-
void persist_map_veryearly(void) {
int r;
-SHOWMAPS
-
errno= 0; pagesize= sysconf(_SC_PAGE_SIZE);
if (pagesize<=0) diee("could not find pagesize");
if (pagesize & (pagesize-1)) return;
if (pagesize > sizeof(resaddrbuf)/2) return;
- resaddrbegin= (void*)(((unsigned long)resaddrbuf + pagesize - 1) &
- ~(pagesize - 1UL));
+ mapbase= (void*)(((unsigned long)resaddrbuf + pagesize - 1) &
+ ~(pagesize - 1UL));
resaddruse= sizeof(resaddrbuf) - pagesize;
- r= mprotect(resaddrbegin,resaddruse,PROT_READ);
+ r= mprotect(mapbase,resaddruse,PROT_READ);
if (r) resaddrdiee("mprotect reserve buffer");
-
-SHOWMAPS
}
-static void *mapmem(int fd, int datalen, int prot) {
+static void mapmem(int fd, int datalen, int prot) {
void *rv;
int r;
if (datalen > resaddruse)
die("data length %d too large " RESADDR_DIEFMT, datalen, RESADDR_DIEARGS);
- r= munmap(resaddrbegin, resaddruse);
+ r= munmap(mapbase, resaddruse);
if (r) resaddrdiee("munmap reserve buffer");
- rv= mmap(resaddrbegin, datalen, prot, MAP_SHARED|MAP_FIXED, fd, 0);
+ rv= mmap(mapbase, datalen, prot, MAP_SHARED|MAP_FIXED, fd, 0);
if (rv == MAP_FAILED)
resaddrdiee(prot==(PROT_READ|PROT_WRITE) ? "map data rw" :
prot==PROT_READ ? "map data ro" : "map data badly");
- assert(rv == resaddrbegin);
-
-SHOWMAPS
- return rv;
+ assert(rv == mapbase);
}
/*---------- installing of our data as the current one ----------*/
fd= fileno(data);
- mapbase= mapmem(fd, datalen, PROT_READ|PROT_WRITE);
+ mapmem(fd, datalen, PROT_READ|PROT_WRITE);
return mapbase;
}
if (memcmp(actual, expected, sz)) die("header magic check failed");
}
-static void *persist_mapread(void) {
+static void persist_mapread(void) {
struct stat stab;
int offset=0, r;
- void *rv;
r= fstat(0, &stab); if (r) diee("could not fstat persist data file");
if (!(stab.st_mode & 0111)) die("persist data file is not executable");
#define PHI_LOAD(x) phi_load(&(x), sizeof(x), &offset);
DO_PERSIST_HEADER_ITEMS(PHI_CHECK, PHI_LOAD, PHI_LOAD)
- rv= mapmem(0, datalen, PROT_READ|PROT_WRITE);
- return rv;
+ mapmem(0, datalen, PROT_READ);
}
void persist_entrails_run_converter(void) {
Train *tra; int tran;
Segment *seg; const SegmentInfo *segi; int segn;
- void *realbase;
- ptrdiff_t adjust;
-
- realbase= persist_mapread();
- adjust= (Byte*)realbase - (Byte*)mapbase;
- assert(!adjust);
-#define CP(lvalue) \
- ((lvalue)= (lvalue) ? (void*)((Byte*)(lvalue) + adjust) : 0);
-
-#define PHI_IGNORE(x) /*nothing*/
- DO_PERSIST_HEADER_ITEMS(PHI_IGNORE, PHI_IGNORE, CP)
+ persist_mapread();
for (tran=0, tra=trains; tran<n_trains; tran++, tra++) {
- CP(tra->pname);
- CP(tra->foredetect);
-
if (!tra->pname || !tra->foredetect ||
!tra->foredetect->i || !tra->foredetect->i->pname)
continue;
}
for (segn=0, seg=segments, segi=info_segments; segn<info_nsegments;
segn++, seg++, segi++) {
- CP(seg->owner);
if (seg->i != segi || !segi->pname ||
!seg->owner || !seg->owner->pname)