diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 4b8445542fce8..a5e8851a25287 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -688,8 +688,21 @@ TSRM_API int shmget(key_t key, size_t size, int flags) CloseHandle(shm_handle); return -1; } - shm->segment = shm_handle; - shm->descriptor = MapViewOfFileEx(shm->segment, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL); + if (NULL == shm->segment || INVALID_HANDLE_VALUE == shm->segment) { + shm->segment = shm_handle; + shm->created = created; + } + else if (TRUE == created) { + CloseHandle(shm->segment); + shm->segment = shm_handle; + shm->created = TRUE; + } + else { + CloseHandle(shm_handle); + } + if(NULL == shm->descriptor){ + shm->descriptor = MapViewOfFileEx(shm->segment, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL); + } if (NULL != shm->descriptor && created) { shm->descriptor->shm_perm.key = key; @@ -730,6 +743,7 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags) shm->descriptor->shm_atime = time(NULL); shm->descriptor->shm_lpid = getpid(); shm->descriptor->shm_nattch++; + shm->shm_nattch++; return shm->addr; }/*}}}*/ @@ -746,12 +760,22 @@ TSRM_API int shmdt(const void *shmaddr) shm->descriptor->shm_dtime = time(NULL); shm->descriptor->shm_lpid = getpid(); shm->descriptor->shm_nattch--; + shm->shm_nattch--; ret = 0; - if (shm->descriptor->shm_nattch <= 0) { - ret = UnmapViewOfFile(shm->descriptor) ? 0 : -1; - shm->descriptor = NULL; + if (shm->shm_nattch <= 0) { + shm->shm_nattch = 0; + if (NULL != shm->segment && INVALID_HANDLE_VALUE != shm->segment && FALSE == shm->created) { + if(NULL != shm->descriptor){ + ret = UnmapViewOfFile(shm->descriptor) ? 0 : -1; + } + shm->descriptor = NULL; + CloseHandle(shm->segment); + shm->segment = INVALID_HANDLE_VALUE; + shm->addr = NULL; + } } + return ret; }/*}}}*/ diff --git a/TSRM/tsrm_win32.h b/TSRM/tsrm_win32.h index c5bdc492be1b8..a7f6ada89620f 100644 --- a/TSRM/tsrm_win32.h +++ b/TSRM/tsrm_win32.h @@ -51,6 +51,8 @@ typedef struct { typedef struct { void *addr; HANDLE segment; + BOOL created; + int shm_nattch; struct shmid_ds *descriptor; } shm_pair;