--- sharelite.c~ 2000-04-14 14:24:00 +0400 +++ sharelite.c 2005-10-02 14:07:41 +0400 @@ -284,10 +284,10 @@ /* garbage collection -- remove unused segments */ if (node->shmaddr->next_shmid >= 0) { shmid = node->shmaddr->next_shmid; - if (_detach_segments(node->next) < 0) - return -1; if (_remove_segments(shmid) < 0) return -1; + if (_detach_segments(node->next) < 0) + return -1; node->shmaddr->next_shmid = -1; node->next = NULL; share->tail = node; @@ -446,16 +446,18 @@ } semid = share->head->shmid; - if (_detach_segments(share->head) < 0) - return -1; if (rmid) { if (_remove_segments(semid) < 0) return -1; semctl_arg.val = 0; + if (_detach_segments(share->head) < 0) + return -1; if (semctl(share->semid, 0, IPC_RMID, semctl_arg) < 0) return -1; } else { + if (_detach_segments(share->head) < 0) + return -1; if (RM_EX_LOCK(share->semid) < 0) return -1; }