blob: 42aafaac3b2ee336faed0acd13221e8879c98a7b [file] [log] [blame]
Index: nspr-4.8.6/mozilla/nsprpub/pr/src/md/unix/uxproces.c
===================================================================
--- nspr-4.8.6.orig/mozilla/nsprpub/pr/src/md/unix/uxproces.c
+++ nspr-4.8.6/mozilla/nsprpub/pr/src/md/unix/uxproces.c
@@ -459,6 +459,29 @@ _MD_CreateUnixProcess(
#define PID_HASH_MASK ((pid_t) (NBUCKETS - 1))
static pr_PidRecord *
+CreatePidRecord(void)
+{
+ pr_PidRecord *pRec;
+ pRec = PR_NEWZAP(pr_PidRecord);
+ pRec->reapedCV = PR_NewCondVar(pr_wp.ml);
+ if (NULL == pRec->reapedCV) {
+ PR_DELETE(pRec);
+ pRec = NULL;
+ }
+ return pRec;
+}
+
+static void
+DeletePidRecord(pr_PidRecord *pRec)
+{
+ if (pRec->reapedCV) {
+ PR_DestroyCondVar(pRec->reapedCV);
+ pRec->reapedCV = NULL;
+ }
+ PR_DELETE(pRec);
+}
+
+static pr_PidRecord *
FindPidTable(pid_t pid)
{
pr_PidRecord *pRec;
@@ -533,18 +556,17 @@ ProcessReapedChildInternal(pid_t pid, in
pRec = FindPidTable(pid);
if (NULL == pRec) {
- pRec = PR_NEW(pr_PidRecord);
+ pRec = CreatePidRecord();
+ PR_ASSERT(pRec);
pRec->pid = pid;
pRec->state = _PR_PID_REAPED;
pRec->exitStatus = ExtractExitStatus(status);
- pRec->reapedCV = NULL;
InsertPidTable(pRec);
} else {
PR_ASSERT(pRec->state != _PR_PID_REAPED);
if (_PR_PID_DETACHED == pRec->state) {
- PR_ASSERT(NULL == pRec->reapedCV);
DeletePidTable(pRec);
- PR_DELETE(pRec);
+ DeletePidRecord(pRec);
} else {
PR_ASSERT(_PR_PID_WAITING == pRec->state);
PR_ASSERT(NULL != pRec->reapedCV);
@@ -793,7 +815,7 @@ PRStatus _MD_DetachUnixProcess(PRProcess
PR_Lock(pr_wp.ml);
pRec = FindPidTable(process->md.pid);
if (NULL == pRec) {
- pRec = PR_NEW(pr_PidRecord);
+ pRec = CreatePidRecord();
if (NULL == pRec) {
PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
retVal = PR_FAILURE;
@@ -801,7 +823,6 @@ PRStatus _MD_DetachUnixProcess(PRProcess
}
pRec->pid = process->md.pid;
pRec->state = _PR_PID_DETACHED;
- pRec->reapedCV = NULL;
InsertPidTable(pRec);
} else {
PR_ASSERT(_PR_PID_REAPED == pRec->state);
@@ -809,9 +830,8 @@ PRStatus _MD_DetachUnixProcess(PRProcess
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
retVal = PR_FAILURE;
} else {
- DeletePidTable(pRec);
- PR_ASSERT(NULL == pRec->reapedCV);
- PR_DELETE(pRec);
+ DeletePidTable(pRec);
+ DeletePidRecord(pRec);
}
}
PR_DELETE(process);
@@ -832,7 +852,7 @@ PRStatus _MD_WaitUnixProcess(
PR_Lock(pr_wp.ml);
pRec = FindPidTable(process->md.pid);
if (NULL == pRec) {
- pRec = PR_NEW(pr_PidRecord);
+ pRec = CreatePidRecord();
if (NULL == pRec) {
PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
retVal = PR_FAILURE;
@@ -840,12 +860,6 @@ PRStatus _MD_WaitUnixProcess(
}
pRec->pid = process->md.pid;
pRec->state = _PR_PID_WAITING;
- pRec->reapedCV = PR_NewCondVar(pr_wp.ml);
- if (NULL == pRec->reapedCV) {
- PR_DELETE(pRec);
- retVal = PR_FAILURE;
- goto done;
- }
InsertPidTable(pRec);
while (!interrupted && _PR_PID_REAPED != pRec->state) {
if (PR_WaitCondVar(pRec->reapedCV,
@@ -863,16 +877,14 @@ PRStatus _MD_WaitUnixProcess(
retVal = PR_FAILURE;
}
DeletePidTable(pRec);
- PR_DestroyCondVar(pRec->reapedCV);
- PR_DELETE(pRec);
+ DeletePidRecord(pRec);
} else {
PR_ASSERT(_PR_PID_REAPED == pRec->state);
- PR_ASSERT(NULL == pRec->reapedCV);
DeletePidTable(pRec);
if (exitCode) {
*exitCode = pRec->exitStatus;
}
- PR_DELETE(pRec);
+ DeletePidRecord(pRec);
}
PR_DELETE(process);