in src/native/windows/src/rprocess.c [504:563]
static BOOL __apxProcessCallback(APXHANDLE hObject, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
LPAPXPROCESS lpProc;
lpProc = APXHANDLE_DATA(hObject);
/* Call the user supplied callback first */
if (lpProc->fnUserCallback)
(*lpProc->fnUserCallback)(hObject, uMsg, wParam, lParam);
switch (uMsg) {
case WM_CLOSE:
/* Avoid processing the WM_CLOSE message multiple times */
if (lpProc->stProcInfo.hProcess == NULL) break;
if (lpProc->dwChildStatus & CHILD_RUNNING) {
apxLogWrite(APXLOG_MARK_DEBUG "__apxProcessCallback: CHILD_RUNNING");
__apxProcessClose(hObject);
/* Wait for all worker threads to exit */
WaitForMultipleObjects(3, lpProc->hWorkerThreads, TRUE, INFINITE);
apxLogWrite(APXLOG_MARK_DEBUG "__apxProcessCallback: CHILD_RUNNING DONE!");
}
SAFE_CLOSE_HANDLE(lpProc->stProcInfo.hProcess);
/* Close parent side of the pipes */
SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
SAFE_CLOSE_HANDLE(lpProc->hChildOutRd);
SAFE_CLOSE_HANDLE(lpProc->hChildErrRd);
SAFE_CLOSE_HANDLE(lpProc->hWorkerThreads[0]);
SAFE_CLOSE_HANDLE(lpProc->hWorkerThreads[1]);
SAFE_CLOSE_HANDLE(lpProc->hWorkerThreads[2]);
SAFE_CLOSE_HANDLE(lpProc->hUserToken);
apxFree(lpProc->szApplicationExec);
apxFree(lpProc->szCommandLine);
apxFree(lpProc->szWorkingPath);
RESTORE_STD_HANDLES(lpProc);
SAFE_CLOSE_HANDLE(lpProc->hCurrentProcess);
if (lpProc->lpEnvironment)
FreeEnvironmentStringsW(lpProc->lpEnvironment);
case WM_QUIT:
/* The process has finished
* This is a WorkerThread message
*/
lpProc->dwChildStatus &= ~CHILD_RUNNING;
break;
case WM_CHAR:
__apxProcessPutc(lpProc, (INT)lParam, lpProc->chSize);
break;
case WM_SETTEXT:
if (wParam)
__apxProcessWrite(lpProc, (LPCVOID)lParam, (DWORD)wParam);
else
__apxProcessPuts(lpProc, (LPCTSTR)lParam);
break;
default:
break;
}
return TRUE;
}