--- ray/src/rt/RdataShareMap.cpp 2024/10/29 00:36:54 2.1 +++ ray/src/rt/RdataShareMap.cpp 2025/03/20 17:59:10 2.4 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: RdataShareMap.cpp,v 2.1 2024/10/29 00:36:54 greg Exp $"; +static const char RCSid[] = "$Id: RdataShareMap.cpp,v 2.4 2025/03/20 17:59:10 greg Exp $"; #endif /* * RdataShareMap.cpp @@ -36,25 +36,24 @@ RdataShareMap::RdataShareMap(const char *name, int fla error(CONSISTENCY, "bad RDSextend in RdataShareMap()"); return; } - int mmprot = PROT_NONE; - int oflags = 0; + int oflags, mmprot; switch (flags & (RDSread|RDSwrite)) { case RDSread|RDSwrite: - mmprot |= PROT_READ|PROT_WRITE; - oflags |= O_RDWR; + mmprot = PROT_READ|PROT_WRITE; + oflags = O_RDWR|O_CREAT; break; - case RDSread: - mmprot |= PROT_READ; - oflags |= O_RDONLY; - break; case RDSwrite: - mmprot |= PROT_WRITE; - oflags |= O_WRONLY; + mmprot = PROT_WRITE; + oflags = O_RDWR|O_CREAT; // XXX system limitation break; + case RDSread: + mmprot = PROT_READ; + oflags = O_RDONLY; + break; } int fd = -1; if (name) { // opening a shared file - if (flags & RDSexcl) oflags |= O_CREAT|O_EXCL; + if (flags & RDSexcl) oflags |= O_EXCL; else if (flags & RDSextend && !siz) oflags |= O_TRUNC; fd = open(name, oflags, 0666); if (fd < 0) { @@ -69,7 +68,7 @@ RdataShareMap::RdataShareMap(const char *name, int fla else if (fstat(fd, &sbuf) >= 0) siz = sbuf.st_size; else { - sprintf(errmsg, "cannot stat '%s'", chName); + sprintf(errmsg, "cannot stat '%s'", name); error(SYSTEM, errmsg); close(fd); return; @@ -81,7 +80,7 @@ RdataShareMap::RdataShareMap(const char *name, int fla return; } } - mmorg = (void *)mmap(NULL, siz, mmprot, + if (siz) mmorg = (void *)mmap(NULL, siz, mmprot, MAP_SHARED|(name ? MAP_FILE : MAP_ANON), fd, 0); close(fd); if (mmorg == MAP_FAILED) { @@ -108,8 +107,6 @@ RdataShareMap::~RdataShareMap() size_t RdataShareMap::Resize(size_t new_siz) { - if (!mmorg) - return 0; if (new_siz > 0) { if (new_siz == osiz) return osiz; @@ -156,7 +153,7 @@ RdataShareMap::Resize(size_t new_siz) close(fd); return 0; } - munmap(mmorg, osiz); + if (mmorg) munmap(mmorg, osiz); mmorg = mmap(NULL, new_siz, mode&RDSread ? PROT_READ|PROT_WRITE : PROT_WRITE, MAP_SHARED|MAP_FILE, fd, 0);