Lines Matching refs:pProcess

49 static int                  gstcntlProcessLock(PVBOXSERVICECTRLPROCESS pProcess);
50 static int gstcntlProcessRequest(PVBOXSERVICECTRLPROCESS pProcess, const PVBGLR3GUESTCTRLCMDCTX pHostCtx, PFNRT pfnFunction, unsigned cArgs, ...);
52 static int gstcntlProcessUnlock(PVBOXSERVICECTRLPROCESS pProcess);
62 * @param pProcess Process to initialize.
67 static int gstcntlProcessInit(PVBOXSERVICECTRLPROCESS pProcess,
72 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
77 pProcess->hProcess = NIL_RTPROCESS;
78 pProcess->pSession = pSession;
79 pProcess->Node.pPrev = NULL;
80 pProcess->Node.pNext = NULL;
82 pProcess->fShutdown = false;
83 pProcess->fStarted = false;
84 pProcess->fStopped = false;
86 pProcess->uPID = 0; /* Don't have a PID yet. */
87 pProcess->cRefs = 0;
93 pProcess->uContextID = u32ContextID;
95 * Note: pProcess->ClientID will be assigned when thread is started;
100 int rc = RTCritSectInit(&pProcess->CritSect);
104 pProcess->hPollSet = NIL_RTPOLLSET;
105 pProcess->hPipeStdInW = NIL_RTPIPE;
106 pProcess->hPipeStdOutR = NIL_RTPIPE;
107 pProcess->hPipeStdErrR = NIL_RTPIPE;
108 pProcess->hNotificationPipeW = NIL_RTPIPE;
109 pProcess->hNotificationPipeR = NIL_RTPIPE;
111 rc = RTReqQueueCreate(&pProcess->hReqQueue);
115 memcpy(&pProcess->StartupInfo, pStartupInfo, sizeof(VBOXSERVICECTRLPROCSTARTUPINFO));
118 if ( pProcess->StartupInfo.uTimeLimitMS == UINT32_MAX
119 || pProcess->StartupInfo.uTimeLimitMS == 0)
120 pProcess->StartupInfo.uTimeLimitMS = RT_INDEFINITE_WAIT;
123 GstCntlProcessFree(pProcess);
129 * Frees a guest process. On success, pProcess will be
133 * @param pProcess Guest process to free.
135 int GstCntlProcessFree(PVBOXSERVICECTRLPROCESS pProcess)
137 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
140 pProcess->uPID, pProcess->cRefs);
141 Assert(pProcess->cRefs == 0);
146 if (RTCritSectIsInitialized(&pProcess->CritSect))
147 RTCritSectDelete(&pProcess->CritSect);
149 int rc = RTReqQueueDestroy(pProcess->hReqQueue);
155 AssertPtr(pProcess->pSession);
156 rc = GstCntlSessionProcessRemove(pProcess->pSession, pProcess);
162 RTMemFree(pProcess);
163 pProcess = NULL;
174 * @param pProcess Process to stop.
176 int GstCntlProcessStop(PVBOXSERVICECTRLPROCESS pProcess)
178 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
181 pProcess->uPID);
186 return GstCntlProcessHandleTerm(pProcess);
193 * @param pProcess Process to unlock.
195 void GstCntlProcessRelease(PVBOXSERVICECTRLPROCESS pProcess)
197 AssertPtrReturnVoid(pProcess);
201 int rc = RTCritSectEnter(&pProcess->CritSect);
204 Assert(pProcess->cRefs);
205 pProcess->cRefs--;
206 fShutdown = pProcess->fStopped; /* Has the process' thread been stopped? */
208 rc = RTCritSectLeave(&pProcess->CritSect);
213 GstCntlProcessFree(pProcess);
221 * @param pProcess Process to wait shutting down for.
225 int GstCntlProcessWait(const PVBOXSERVICECTRLPROCESS pProcess,
228 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
231 int rc = gstcntlProcessLock(pProcess);
235 pProcess->uPID, msTimeout);
237 AssertMsgReturn(pProcess->fStarted,
239 pProcess, pProcess->uPID), VERR_INVALID_PARAMETER);
242 if (!pProcess->fStopped)
245 rc = gstcntlProcessUnlock(pProcess);
250 Assert(pProcess->Thread != NIL_RTTHREAD);
251 rc = RTThreadWait(pProcess->Thread, msTimeout, &rcThread);
255 pProcess->uPID, rc);
260 pProcess->uPID, rcThread);
268 pProcess->uPID);
270 int rc2 = gstcntlProcessUnlock(pProcess);
276 pProcess->uPID, rc);
288 static int gstcntlProcessPollsetCloseInput(PVBOXSERVICECTRLPROCESS pProcess,
291 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
294 int rc = RTPollSetRemove(pProcess->hPollSet, VBOXSERVICECTRLPIPEID_STDIN);
337 * @param pProcess Process to handle pollset for.
341 static int gstcntlProcessPollsetOnInput(PVBOXSERVICECTRLPROCESS pProcess,
344 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
348 return gstcntlProcessPollsetCloseInput(pProcess, phStdInW);
356 * @param pProcess Process to handle pollset for.
362 static int gstcntlProcessHandleOutputError(PVBOXSERVICECTRLPROCESS pProcess,
365 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
372 pProcess->uPID, gstcntlProcessPollHandleToString(idPollHnd), fPollEvt);
376 int rc2 = RTPollSetRemove(pProcess->hPollSet, idPollHnd);
391 pProcess->uPID, gstcntlProcessPollHandleToString(idPollHnd), cbReadable);
402 pProcess->uPID, gstcntlProcessPollHandleToString(idPollHnd));
421 * @param pProcess Process to handle pollset for.
427 static int gstcntlProcessPollsetOnOutput(PVBOXSERVICECTRLPROCESS pProcess,
430 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
434 pProcess->uPID, phPipeR, gstcntlProcessPollHandleToString(idPollHnd), fPollEvt);
451 pProcess->uPID, cbReadable);
474 rc = gstcntlProcessHandleOutputError(pProcess,
485 * @param pProcess The guest process to handle.
487 static int gstcntlProcessProcLoop(PVBOXSERVICECTRLPROCESS pProcess)
489 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
498 RTMSINTERVAL const cMsPollBase = pProcess->hPipeStdInW != NIL_RTPIPE
508 rc = gstcntlProcessAssignPID(pProcess, pProcess->hProcess /* Opaque PID handle */);
512 pProcess->hProcess, rc);
521 pProcess->uPID, pProcess->StartupInfo.szCmd, pProcess->uContextID,
522 pProcess->StartupInfo.szUser, pProcess->StartupInfo.uTimeLimitMS);
523 VBGLR3GUESTCTRLCMDCTX ctxStart = { pProcess->uClientID, pProcess->uContextID };
525 pProcess->uPID, PROC_STS_STARTED, 0 /* u32Flags */,
531 pProcess->uPID, rc);
537 && RT_UNLIKELY(!pProcess->fShutdown))
544 rc2 = RTPollNoResume(pProcess->hPollSet, cMsPollCur, &fPollEvt, &idPollHnd);
545 if (pProcess->fShutdown)
555 rc = gstcntlProcessPollsetOnInput(pProcess, fPollEvt,
556 &pProcess->hPipeStdInW);
560 rc = gstcntlProcessPollsetOnOutput(pProcess, fPollEvt,
561 &pProcess->hPipeStdOutR, idPollHnd);
565 rc = gstcntlProcessPollsetOnOutput(pProcess, fPollEvt,
566 &pProcess->hPipeStdOutR, idPollHnd);
571 VBoxServiceVerbose(4, "[PID %RU32]: IPC notify\n", pProcess->uPID);
573 rc2 = gstcntlProcessLock(pProcess);
579 rc2 = RTPipeRead(pProcess->hNotificationPipeR,
586 pProcess->uPID);
587 Assert(pProcess->hReqQueue != NIL_RTREQQUEUE);
588 rc2 = RTReqQueueProcess(pProcess->hReqQueue,
594 int rc3 = gstcntlProcessUnlock(pProcess);
598 pProcess->uPID, rc2);
614 pProcess->uPID, rc2, RTPollSetGetCount(hPollSet), gstcntlProcessPollHandleToString(idPollHnd), rc, fProcessAlive, pProcess->fShutdown);
616 pProcess->uPID,
620 if (RT_UNLIKELY(pProcess->fShutdown))
628 rc2 = RTProcWaitNoResume(pProcess->hProcess, RTPROCWAIT_FLAGS_NOBLOCK, &ProcessStatus);
631 pProcess->uPID, rc2);
662 || ( pProcess->hPipeStdOutR == NIL_RTPIPE
663 && pProcess->hPipeStdErrR == NIL_RTPIPE)
674 if ( pProcess->StartupInfo.uTimeLimitMS != RT_INDEFINITE_WAIT
675 && pProcess->StartupInfo.uTimeLimitMS != 0)
679 if (cMsElapsed >= pProcess->StartupInfo.uTimeLimitMS)
689 pProcess->uPID, cMsElapsed, pProcess->StartupInfo.uTimeLimitMS);
691 rc2 = RTProcTerminate(pProcess->hProcess);
693 pProcess->uPID, rc2);
700 cMilliesLeft = pProcess->StartupInfo.uTimeLimitMS - (uint32_t)cMsElapsed;
712 pProcess->uPID, rc, pProcess->fShutdown, fProcessAlive, fProcessTimedOut, MsProcessKilled, MsProcessKilled);
714 pProcess->uPID,
715 pProcess->hPipeStdOutR == NIL_RTPIPE ? "closed" : "open",
716 pProcess->hPipeStdErrR == NIL_RTPIPE ? "closed" : "open");
719 ASMAtomicXchgBool(&pProcess->fShutdown, true);
729 pProcess->uPID);
732 rc2 = RTProcTerminate(pProcess->hProcess);
739 pProcess->uPID, rc2);
746 pProcess->uPID, i + 1);
747 rc2 = RTProcWait(pProcess->hProcess, RTPROCWAIT_FLAGS_NOBLOCK, &ProcessStatus);
751 pProcess->uPID, i + 1);
758 pProcess->uPID, i + 1);
759 rc2 = RTProcTerminate(pProcess->hProcess);
763 pProcess->uPID, rc2);
769 VBoxServiceError("[PID %RU32]: Could not be killed\n", pProcess->uPID);
774 * - Set the pProcess->fShutdown indicator to let others know we're
784 rc2 = gstcntlProcessLock(pProcess);
788 pProcess->uPID);
791 Assert(pProcess->hReqQueue != NIL_RTREQQUEUE);
792 rc2 = RTReqQueueProcess(pProcess->hReqQueue, 0 /* No timeout */);
796 pProcess->uPID, rc2);
799 pProcess->uPID, rc2);
801 rc2 = gstcntlProcessUnlock(pProcess);
817 pProcess->uPID);
823 pProcess->uPID);
826 else if (pProcess->fShutdown && (fProcessAlive || MsProcessKilled != UINT64_MAX))
829 pProcess->uPID);
831 uFlags = pProcess->StartupInfo.uFlags; /* Return handed-in execution flags back to the host. */
836 pProcess->uPID);
841 pProcess->uPID);
846 pProcess->uPID, ProcessStatus.iStatus);
854 pProcess->uPID, ProcessStatus.iStatus);
863 pProcess->uPID);
870 pProcess->uPID, ProcessStatus.enmReason);
873 pProcess->uPID, pProcess->uClientID, pProcess->uContextID, uStatus, uFlags);
875 VBGLR3GUESTCTRLCMDCTX ctxEnd = { pProcess->uClientID, pProcess->uContextID };
877 pProcess->uPID, uStatus, uFlags,
882 pProcess->uPID, rc2);
886 pProcess->uPID, rc);
1157 * @param pProcess Process to assign PID to.
1160 int gstcntlProcessAssignPID(PVBOXSERVICECTRLPROCESS pProcess, uint32_t uPID)
1162 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
1165 AssertPtr(pProcess->pSession);
1166 int rc = RTCritSectEnter(&pProcess->pSession->CritSect);
1176 RTListForEach(&pProcess->pSession->lstProcesses, pProcessCur, VBOXSERVICECTRLPROCESS, Node)
1180 Assert(pProcessCur != pProcess); /* can't happen */
1192 pProcess->uPID = uPID;
1194 rc = RTCritSectLeave(&pProcess->pSession->CritSect);
1428 static int gstcntlProcessProcessWorker(PVBOXSERVICECTRLPROCESS pProcess)
1430 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
1432 pProcess, pProcess->StartupInfo.szCmd);
1434 int rc = VbglR3GuestCtrlConnect(&pProcess->uClientID);
1438 pProcess->StartupInfo.szCmd, pProcess, rc);
1444 pProcess->StartupInfo.szCmd, pProcess->uClientID, pProcess->StartupInfo.uFlags);
1448 rc = VbglR3GuestCtrlMsgFilterSet(pProcess->uClientID, 0 /* Skip all */,
1456 rc = GstCntlSessionProcessAdd(pProcess->pSession, pProcess);
1460 pProcess->StartupInfo.szCmd, pProcess, rc);
1473 (pProcess->StartupInfo.uNumArgs > 0) ? pProcess->StartupInfo.szArgs : "", NULL);
1475 Assert(pProcess->StartupInfo.uNumArgs == uNumArgs);
1485 if (pProcess->StartupInfo.uNumEnvVars)
1487 papszEnv = (char **)RTMemAlloc(pProcess->StartupInfo.uNumEnvVars * sizeof(char*));
1489 uNumEnvVars = pProcess->StartupInfo.uNumEnvVars;
1491 const char *pszCur = pProcess->StartupInfo.szEnv;
1494 while (cbLen < pProcess->StartupInfo.cbEnv)
1497 if (i >= pProcess->StartupInfo.uNumEnvVars)
1511 Assert(i == pProcess->StartupInfo.uNumEnvVars);
1539 &hStdIn, &phStdIn, &pProcess->hPipeStdInW);
1544 rc = gstcntlProcessSetupPipe( (pProcess->StartupInfo.uFlags & EXECUTEPROCESSFLAG_WAIT_STDOUT)
1547 &hStdOut, &phStdOut, &pProcess->hPipeStdOutR);
1552 rc = gstcntlProcessSetupPipe( (pProcess->StartupInfo.uFlags & EXECUTEPROCESSFLAG_WAIT_STDERR)
1555 &hStdErr, &phStdErr, &pProcess->hPipeStdErrR);
1562 rc = RTPollSetCreate(&pProcess->hPollSet);
1572 rc = RTPollSetAddPipe(pProcess->hPollSet,
1573 pProcess->hPipeStdInW, RTPOLL_EVT_ERROR, VBOXSERVICECTRLPIPEID_STDIN);
1576 rc = RTPollSetAddPipe(pProcess->hPollSet,
1577 pProcess->hPipeStdOutR, uFlags, VBOXSERVICECTRLPIPEID_STDOUT);
1580 rc = RTPollSetAddPipe(pProcess->hPollSet,
1581 pProcess->hPipeStdErrR, uFlags, VBOXSERVICECTRLPIPEID_STDERR);
1584 rc = RTPipeCreate(&pProcess->hNotificationPipeR, &pProcess->hNotificationPipeW, 0 /* Flags */);
1586 rc = RTPollSetAddPipe(pProcess->hPollSet,
1587 pProcess->hNotificationPipeR, RTPOLL_EVT_READ, VBOXSERVICECTRLPIPEID_IPC_NOTIFY);
1590 AssertPtr(pProcess->pSession);
1591 bool fNeedsImpersonation = !(pProcess->pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_FORK);
1593 rc = gstcntlProcessCreateProcess(pProcess->StartupInfo.szCmd, papszArgs, hEnv, pProcess->StartupInfo.uFlags,
1595 fNeedsImpersonation ? pProcess->StartupInfo.szUser : NULL,
1596 fNeedsImpersonation ? pProcess->StartupInfo.szPassword : NULL,
1597 &pProcess->hProcess);
1624 rc = gstcntlProcessProcLoop(pProcess);
1632 if (RT_FAILURE(RTPollSetQueryHandle(pProcess->hPollSet,
1635 pProcess->hNotificationPipeR = NIL_RTPIPE;
1636 pProcess->hNotificationPipeW = NIL_RTPIPE;
1638 if (RT_FAILURE(RTPollSetQueryHandle(pProcess->hPollSet,
1640 pProcess->hPipeStdErrR = NIL_RTPIPE;
1641 if (RT_FAILURE(RTPollSetQueryHandle(pProcess->hPollSet,
1643 pProcess->hPipeStdOutR = NIL_RTPIPE;
1644 if (RT_FAILURE(RTPollSetQueryHandle(pProcess->hPollSet,
1646 pProcess->hPipeStdInW = NIL_RTPIPE;
1649 RTPollSetDestroy(pProcess->hPollSet);
1651 RTPipeClose(pProcess->hNotificationPipeR);
1652 pProcess->hNotificationPipeR = NIL_RTPIPE;
1653 RTPipeClose(pProcess->hNotificationPipeW);
1654 pProcess->hNotificationPipeW = NIL_RTPIPE;
1656 RTPipeClose(pProcess->hPipeStdErrR);
1657 pProcess->hPipeStdErrR = NIL_RTPIPE;
1662 RTPipeClose(pProcess->hPipeStdOutR);
1663 pProcess->hPipeStdOutR = NIL_RTPIPE;
1668 RTPipeClose(pProcess->hPipeStdInW);
1669 pProcess->hPipeStdInW = NIL_RTPIPE;
1676 if (pProcess->uClientID)
1680 VBGLR3GUESTCTRLCMDCTX ctx = { pProcess->uClientID, pProcess->uContextID };
1682 pProcess->uPID, PROC_STS_ERROR, rc,
1687 pProcess->uPID, rc2, rc);
1693 pProcess->uPID, pProcess->uClientID);
1694 VbglR3GuestCtrlDisconnect(pProcess->uClientID);
1695 pProcess->uClientID = 0;
1716 pProcess->uPID, pProcess->StartupInfo.szCmd, rc);
1719 ASMAtomicXchgBool(&pProcess->fStopped, true);
1725 static int gstcntlProcessLock(PVBOXSERVICECTRLPROCESS pProcess)
1727 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
1728 int rc = RTCritSectEnter(&pProcess->CritSect);
1744 PVBOXSERVICECTRLPROCESS pProcess = (VBOXSERVICECTRLPROCESS*)pvUser;
1745 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
1746 return gstcntlProcessProcessWorker(pProcess);
1750 static int gstcntlProcessUnlock(PVBOXSERVICECTRLPROCESS pProcess)
1752 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
1753 int rc = RTCritSectLeave(&pProcess->CritSect);
1779 PVBOXSERVICECTRLPROCESS pProcess = (PVBOXSERVICECTRLPROCESS)RTMemAlloc(sizeof(VBOXSERVICECTRLPROCESS));
1780 if (!pProcess)
1783 int rc = gstcntlProcessInit(pProcess, pSession, pStartupInfo, uContextID);
1789 rc = RTThreadCreateF(&pProcess->Thread, gstcntlProcessThread,
1790 pProcess /*pvUser*/, 0 /*cbStack*/,
1794 VBoxServiceError("Creating thread for guest process \"%s\" failed: rc=%Rrc, pProcess=%p\n",
1795 pStartupInfo->szCmd, rc, pProcess);
1797 GstCntlProcessFree(pProcess);
1804 rc = RTThreadUserWait(pProcess->Thread, 60 * 1000 /* 60 seconds max. */);
1806 if ( ASMAtomicReadBool(&pProcess->fShutdown)
1812 GstCntlProcessFree(pProcess);
1816 ASMAtomicXchgBool(&pProcess->fStarted, true);
2019 int gstcntlProcessRequestExV(PVBOXSERVICECTRLPROCESS pProcess, const PVBGLR3GUESTCTRLCMDCTX pHostCtx,
2023 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
2029 int rc = gstcntlProcessLock(pProcess);
2034 pProcess->uPID, fAsync, uTimeoutMS, cArgs);
2043 rc = RTReqQueueCallV(pProcess->hReqQueue, &pReq, uTimeoutMS, uFlags,
2049 Assert(pProcess->hNotificationPipeW != NIL_RTPIPE);
2051 rc = RTPipeWrite(pProcess->hNotificationPipeW, "i", 1, &cbWritten);
2056 pProcess->uPID, cbWritten);
2060 pProcess->uPID, rc);
2064 pProcess->uPID, rc);
2066 int rc2 = gstcntlProcessUnlock(pProcess);
2073 pProcess->uPID, rc);
2079 int gstcntlProcessRequestAsync(PVBOXSERVICECTRLPROCESS pProcess, const PVBGLR3GUESTCTRLCMDCTX pHostCtx,
2082 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
2088 int rc = gstcntlProcessRequestExV(pProcess, pHostCtx, true /* fAsync */, 0 /* uTimeoutMS */,
2096 int gstcntlProcessRequestWait(PVBOXSERVICECTRLPROCESS pProcess, const PVBGLR3GUESTCTRLCMDCTX pHostCtx,
2099 AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
2105 int rc = gstcntlProcessRequestExV(pProcess, pHostCtx, false /* fAsync */, uTimeoutMS,
2113 int GstCntlProcessHandleInput(PVBOXSERVICECTRLPROCESS pProcess, PVBGLR3GUESTCTRLCMDCTX pHostCtx,
2116 if (!ASMAtomicReadBool(&pProcess->fShutdown))
2117 return gstcntlProcessRequestAsync(pProcess, pHostCtx, (PFNRT)gstcntlProcessOnInput,
2118 5 /* cArgs */, pProcess, pHostCtx, fPendingClose, pvBuf, cbBuf);
2120 return gstcntlProcessOnInput(pProcess, pHostCtx, fPendingClose, pvBuf, cbBuf);
2124 int GstCntlProcessHandleOutput(PVBOXSERVICECTRLPROCESS pProcess, PVBGLR3GUESTCTRLCMDCTX pHostCtx,
2127 if (!ASMAtomicReadBool(&pProcess->fShutdown))
2128 return gstcntlProcessRequestAsync(pProcess, pHostCtx, (PFNRT)gstcntlProcessOnOutput,
2129 5 /* cArgs */, pProcess, pHostCtx, uHandle, cbToRead, uFlags);
2131 return gstcntlProcessOnOutput(pProcess, pHostCtx, uHandle, cbToRead, uFlags);
2135 int GstCntlProcessHandleTerm(PVBOXSERVICECTRLPROCESS pProcess)
2137 if (!ASMAtomicReadBool(&pProcess->fShutdown))
2138 return gstcntlProcessRequestAsync(pProcess, NULL /* pHostCtx */, (PFNRT)gstcntlProcessOnTerm,
2139 1 /* cArgs */, pProcess);
2141 return gstcntlProcessOnTerm(pProcess);