Changeset 23892 in vbox
- Timestamp:
- Oct 20, 2009 8:55:51 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53679
- Location:
- trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/init.cpp
r23871 r23892 42 42 # ifndef RT_OS_OS2 43 43 # include <pthread.h> 44 # include <signal.h>45 # include <errno.h>46 # define IPRT_USE_SIG_CHILD_DUMMY47 44 # endif 48 45 #endif … … 207 204 } 208 205 209 210 #ifdef IPRT_USE_SIG_CHILD_DUMMY211 /**212 * Dummy SIGCHILD handler.213 *214 * Assigned on rtR3Init only when SIGCHILD handler is set SIGIGN or SIGDEF to215 * ensure waitpid works properly for the terminated processes.216 */217 static void rtR3SigChildHandler(int iSignal)218 {219 NOREF(iSignal);220 }221 #endif /* IPRT_USE_SIG_CHILD_DUMMY */222 223 224 206 /** 225 207 * rtR3Init worker. … … 314 296 atexit(rtR3ExitCallback); 315 297 316 #ifdef IPRT_USE_SIG_CHILD_DUMMY317 /*318 * SIGCHLD must not be ignored (that's default), otherwise posix compliant waitpid319 * implementations won't work right.320 */321 for (;;)322 {323 struct sigaction saOld;324 rc = sigaction(SIGCHLD, 0, &saOld); AssertMsg(rc == 0, ("%d/%d\n", rc, errno));325 if ( rc != 0326 || (saOld.sa_flags & SA_SIGINFO)327 || ( saOld.sa_handler != SIG_IGN328 && saOld.sa_handler != SIG_DFL)329 )330 break;331 332 /* Try install dummy handler. */333 struct sigaction saNew = saOld;334 saNew.sa_flags = SA_NOCLDSTOP | SA_RESTART;335 saNew.sa_handler = rtR3SigChildHandler;336 rc = sigemptyset(&saNew.sa_mask); AssertMsg(rc == 0, ("%d/%d\n", rc, errno));337 struct sigaction saOld2;338 rc = sigaction(SIGCHLD, &saNew, &saOld2); AssertMsg(rc == 0, ("%d/%d\n", rc, errno));339 if ( rc != 0340 || ( saOld2.sa_handler == saOld.sa_handler341 && !(saOld2.sa_flags & SA_SIGINFO))342 )343 break;344 345 /* Race during dynamic load, restore and try again... */346 sigaction(SIGCHLD, &saOld2, NULL);347 RTThreadYield();348 }349 #endif /* IPRT_USE_SIG_CHILD_DUMMY */350 351 298 #ifdef IPRT_WITH_ALIGNMENT_CHECKS 352 299 /* -
trunk/src/VBox/Runtime/r3/posix/process-posix.cpp
r23869 r23892 110 110 /* 111 111 * Spawn the child. 112 *113 * HACK ALERT! Put the process into a new process group with pgid = pid114 * to make sure it differs from that of the parent process to ensure that115 * the IPRT waipit call doesn't race anyone (read XPCOM) doing group wide116 * waits.117 112 */ 118 113 pid_t pid; … … 120 115 if (!(fFlags & RTPROC_FLAGS_DAEMONIZE)) 121 116 { 122 posix_spawnattr_t Attr;123 124 rc = posix_spawnattr_init(&Attr);117 /** @todo check if it requires any of those two attributes, don't remember atm. */ 118 rc = posix_spawn(&pid, pszExec, NULL, NULL, (char * const *)papszArgs, 119 (char * const *)papszEnv); 125 120 if (!rc) 126 121 { 127 # ifndef RT_OS_OS2 /* We don't need this on OS/2 and I don't recall if it's actually implemented. */ 128 rc = posix_spawnattr_setflags(&Attr, POSIX_SPAWN_SETPGROUP); 129 Assert(rc == 0); 130 if (!rc) 131 { 132 rc = posix_spawnattr_setpgroup(&Attr, 0 /* pg == child pid */); 133 Assert(rc == 0); 134 } 135 # endif 136 if (!rc) 137 { 138 /** @todo check if it requires any mandatory attributes or something, don't 139 * remember atm. */ 140 rc = posix_spawn(&pid, pszExec, NULL, &Attr, (char * const *)papszArgs, 141 (char * const *)papszEnv); 142 if (!rc) 143 { 144 int rc2 = posix_spawnattr_destroy(&Attr); Assert(rc2 == 0); NOREF(rc2); 145 if (pProcess) 146 *pProcess = pid; 147 return VINF_SUCCESS; 148 } 149 } 150 int rc2 = posix_spawnattr_destroy(&Attr); Assert(rc2 == 0); NOREF(rc2); 122 if (pProcess) 123 *pProcess = pid; 124 return VINF_SUCCESS; 151 125 } 152 126 } … … 157 131 if (!pid) 158 132 { 159 setpgid(0, 0); /* see comment above */160 161 133 if (fFlags & RTPROC_FLAGS_DAEMONIZE) 162 134 { -
trunk/src/libs/xpcom18a4/nsprpub/pr/src/md/unix/uxproces.c
r23869 r23892 674 674 while (1) { 675 675 do { 676 #ifdef VBOX677 /*678 * make sure we wait only for child of our group679 * to ensure we do not interfere with RT680 */681 pid = waitpid((pid_t) 0, &status, 0);682 #else683 676 pid = waitpid((pid_t) -1, &status, 0); 684 #endif685 677 } while ((pid_t) -1 == pid && EINTR == errno); 686 678 … … 772 764 while (1) { 773 765 do { 774 #ifdef VBOX775 /*776 * make sure we wait only for child of our group777 * to ensure we do not interfere with RT778 */779 pid = waitpid((pid_t) 0, &status, WNOHANG);780 #else781 766 pid = waitpid((pid_t) -1, &status, WNOHANG); 782 #endif783 767 } while ((pid_t) -1 == pid && EINTR == errno); 784 768 if (0 == pid) break;
Note:
See TracChangeset
for help on using the changeset viewer.