Home | History | Annotate | Download | only in deutil

Lines Matching full:process

21  * \brief Process abstraction.
65 printf("Process launch failed: %s\n", message);
137 deProcess* process = (deProcess*)deCalloc(sizeof(deProcess));
138 if (!process)
141 process->state = PROCESSSTATE_NOT_STARTED;
143 return process;
146 static void deProcess_cleanupHandles (deProcess* process)
148 if (process->standardIn)
149 deFile_destroy(process->standardIn);
151 if (process->standardOut)
152 deFile_destroy(process->standardOut);
154 if (process->standardErr)
155 deFile_destroy(process->standardErr);
157 process->pid = 0;
158 process->standardIn = DE_NULL;
159 process->standardOut = DE_NULL;
160 process->standardErr = DE_NULL;
163 void deProcess_destroy (deProcess* process)
166 if (deProcess_isRunning(process))
168 deProcess_kill(process);
169 deProcess_waitForFinish(process);
172 deProcess_cleanupHandles(process);
173 deFree(process->lastError);
174 deFree(process);
177 const char* deProcess_getLastError (const deProcess* process)
179 return process->lastError ? process->lastError : "No error";
182 int deProcess_getExitCode (const deProcess* process)
184 return process->exitCode;
187 static deBool deProcess_setError (deProcess* process, const char* error)
189 if (process->lastError)
191 deFree(process->lastError);
192 process->lastError = DE_NULL;
195 process->lastError = deStrdup(error);
196 return process->lastError != DE_NULL;
199 static deBool deProcess_setErrorFromErrno (deProcess* process, const char* message)
204 return deProcess_setError(process, message);
215 deBool deProcess_start (deProcess* process, const char* commandLine, const char* workingDirectory)
223 if (process->state == PROCESSSTATE_RUNNING)
225 deProcess_setError(process, "Process already running");
228 else if (process->state == PROCESSSTATE_FINISHED)
230 deProcess_cleanupHandles(process);
231 process->state = PROCESSSTATE_NOT_STARTED;
236 deProcess_setErrorFromErrno(process, "pipe() failed");
250 deProcess_setErrorFromErrno(process, "fork() failed");
262 /* Child process. */
297 /* Parent process. */
333 deProcess_setError(process, errBuf);
343 process->pid = pid;
344 process->state = PROCESSSTATE_RUNNING;
351 process->standardIn = deFile_createFromHandle(pipeIn[1]);
352 process->standardOut = deFile_createFromHandle(pipeOut[0]);
353 process->standardErr = deFile_createFromHandle(pipeErr[0]);
355 if (!process->standardIn)
358 if (!process->standardOut)
361 if (!process->standardErr)
368 deBool deProcess_isRunning (deProcess* process)
370 if (process->state == PROCESSSTATE_RUNNING)
374 if (waitpid(process->pid, &status, WNOHANG) == 0)
380 process->state = PROCESSSTATE_FINISHED;
390 deBool deProcess_waitForFinish (deProcess* process)
395 if (process->state != PROCESSSTATE_RUNNING)
397 deProcess_setError(process, "Process is not running");
402 while ((waitResult = waitpid(process->pid, &status, 0)) != process->pid)
405 if (waitResult != process->pid)
407 deProcess_setErrorFromErrno(process, "waitpid() failed");
413 deProcess_setErrorFromErrno(process, "waitpid() failed");
417 process->exitCode = WEXITSTATUS(status);
418 process->state = PROCESSSTATE_FINISHED;
422 static deBool deProcess_sendSignal (deProcess* process, int sigNum)
424 if (process->state != PROCESSSTATE_RUNNING)
426 deProcess_setError(process, "Process is not running");
430 if (kill(process->pid, sigNum) == 0)
434 deProcess_setErrorFromErrno(process, "kill() failed");
439 deBool deProcess_terminate (deProcess* process)
441 return deProcess_sendSignal(process, SIGTERM);
444 deBool deProcess_kill (deProcess* process)
446 return deProcess_sendSignal(process, SIGKILL);
449 deFile* deProcess_getStdIn (deProcess* process)
451 return process->standardIn;
454 deFile* deProcess_getStdOut (deProcess* process)
456 return process->standardOut;
459 deFile* deProcess_getStdErr (deProcess* process)
461 return process->standardErr;
464 deBool deProcess_closeStdIn (deProcess* process)
466 if (process->standardIn)
468 deFile_destroy(process->standardIn);
469 process->standardIn = DE_NULL;
476 deBool deProcess_closeStdOut (deProcess* process)
478 if (process->standardOut)
480 deFile_destroy(process->standardOut);
481 process->standardOut = DE_NULL;
488 deBool deProcess_closeStdErr (deProcess* process)
490 if (process->standardErr)
492 deFile_destroy(process->standardErr);
493 process->standardErr = DE_NULL;
528 static deBool deProcess_setError (deProcess* process, const char* error)
530 if (process->lastError)
532 deFree(process->lastError);
533 process->lastError = DE_NULL;
536 process->lastError = deStrdup(error);
537 return process->lastError != DE_NULL;
540 static deBool deProcess_setErrorFromWin32 (deProcess* process, const char* msg)
555 return deProcess_setError(process, errBuf);
561 return deProcess_setError(process, errBuf);
567 deProcess* process = (deProcess*)deCalloc(sizeof(deProcess));
568 if (!process)
571 process->state = PROCESSSTATE_NOT_STARTED;
573 return process;
576 void deProcess_cleanupHandles (deProcess* process)
578 DE_ASSERT(!deProcess_isRunning(process));
580 if (process->standardErr)
581 deFile_destroy(process->standardErr);
583 if (process->standardOut)
584 deFile_destroy(process->standardOut);
586 if (process->standardIn)
587 deFile_destroy(process->standardIn);
589 if (process->procInfo.hProcess)
590 CloseHandle(process->procInfo.hProcess);
592 if (process->procInfo.hThread)
593 CloseHandle(process->procInfo.hThread);
595 process->standardErr = DE_NULL;
596 process->standardOut = DE_NULL;
597 process->standardIn = DE_NULL;
598 process->procInfo.hProcess = DE_NULL;
599 process->procInfo.hThread = DE_NULL;
602 void deProcess_destroy (deProcess* process)
604 if (deProcess_isRunning(process))
606 deProcess_kill(process);
607 deProcess_waitForFinish(process);
610 deProcess_cleanupHandles(process);
611 deFree(process->lastError);
612 deFree(process);
615 const char* deProcess_getLastError (const deProcess* process)
617 return process->lastError ? process->lastError : "No error";
620 int deProcess_getExitCode (const deProcess* process)
622 return process->exitCode;
625 deBool deProcess_start (deProcess* process, const char* commandLine, const char* workingDirectory)
638 if (process->state == PROCESSSTATE_RUNNING)
640 deProcess_setError(process, "Process already running");
643 else if (process->state == PROCESSSTATE_FINISHED)
645 /* Process finished, clean up old cruft. */
646 deProcess_cleanupHandles(process);
647 process->state = PROCESSSTATE_NOT_STARTED;
662 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
671 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
682 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
699 if (!CreateProcess(DE_NULL, (LPTSTR)commandLine, DE_NULL, DE_NULL, TRUE /* inherit handles */, 0, DE_NULL, workingDirectory, &startInfo, &process->procInfo))
702 deProcess_setErrorFromWin32(process, "CreateProcess() failed");
715 process->state = PROCESSSTATE_RUNNING;
723 process->standardIn = deFile_createFromHandle((deUintptr)stdInWrite);
724 process->standardOut = deFile_createFromHandle((deUintptr)stdOutRead);
725 process->standardErr = deFile_createFromHandle((deUintptr)stdErrRead);
730 deBool deProcess_isRunning (deProcess* process)
732 if (process->state == PROCESSSTATE_RUNNING)
735 BOOL result = GetExitCodeProcess(process->procInfo.hProcess, (LPDWORD)&exitCode);
739 deProcess_setErrorFromWin32(process, "GetExitCodeProcess() failed");
748 process->exitCode = exitCode;
749 process->state = PROCESSSTATE_FINISHED;
757 deBool deProcess_waitForFinish (deProcess* process)
759 if (process->state == PROCESSSTATE_RUNNING)
761 if (WaitForSingleObject(process->procInfo.hProcess, INFINITE) != WAIT_OBJECT_0)
763 deProcess_setErrorFromWin32(process, "WaitForSingleObject() failed");
766 return !deProcess_isRunning(process);
770 deProcess_setError(process, "Process is not running");
775 static deBool stopProcess (deProcess* process, deBool kill)
777 if (process->state == PROCESSSTATE_RUNNING)
779 if (!TerminateProcess(process->procInfo.hProcess, kill ? -1 : 0))
781 deProcess_setErrorFromWin32(process, "TerminateProcess() failed");
789 deProcess_setError(process, "Process is not running");
794 deBool deProcess_terminate (deProcess* process)
796 return stopProcess(process, DE_FALSE);
799 deBool deProcess_kill (deProcess* process)
801 return stopProcess(process, DE_TRUE);
804 deFile* deProcess_getStdIn (deProcess* process)
806 return process->standardIn;
809 deFile* deProcess_getStdOut (deProcess* process)
811 return process->standardOut;
814 deFile* deProcess_getStdErr (deProcess* process)
816 return process->standardErr;
819 deBool deProcess_closeStdIn (deProcess* process)
821 if (process->standardIn)
823 deFile_destroy(process->standardIn);
824 process->standardIn = DE_NULL;
831 deBool deProcess_closeStdOut (deProcess* process)
833 if (process->standardOut)
835 deFile_destroy(process->standardOut);
836 process->standardOut = DE_NULL;
843 deBool deProcess_closeStdErr (deProcess* process)
845 if (process->standardErr)
847 deFile_destroy(process->standardErr);
848 process->standardErr = DE_NULL;