Index: third_party/mozprocess/tests/proclaunch.c |
=================================================================== |
--- third_party/mozprocess/tests/proclaunch.c (revision 0) |
+++ third_party/mozprocess/tests/proclaunch.c (revision 0) |
@@ -0,0 +1,156 @@ |
+/* This Source Code Form is subject to the terms of the Mozilla Public |
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
+ |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include "iniparser.h" |
+ |
+#ifdef _WIN32 |
+#include <windows.h> |
+#include <tchar.h> |
+ |
+extern int iniparser_getint(dictionary *d, char *key, int notfound); |
+extern char *iniparser_getstring(dictionary *d, char *key, char *def); |
+ |
+// This is the windows launcher function |
+int launchWindows(int children, int maxtime) { |
+ _TCHAR cmdline[50]; |
+ STARTUPINFO startup; |
+ PROCESS_INFORMATION procinfo; |
+ BOOL rv = 0; |
+ |
+ _stprintf(cmdline, _T("proclaunch.exe %d %d"), children, maxtime); |
+ ZeroMemory(&startup, sizeof(STARTUPINFO)); |
+ startup.cb = sizeof(STARTUPINFO); |
+ |
+ ZeroMemory(&procinfo, sizeof(PROCESS_INFORMATION)); |
+ |
+ printf("Launching process!\n"); |
+ rv = CreateProcess(NULL, |
+ cmdline, |
+ NULL, |
+ NULL, |
+ FALSE, |
+ 0, |
+ NULL, |
+ NULL, |
+ &startup, |
+ &procinfo); |
+ |
+ if (!rv) { |
+ DWORD dw = GetLastError(); |
+ printf("error: %d\n", dw); |
+ } |
+ CloseHandle(procinfo.hProcess); |
+ CloseHandle(procinfo.hThread); |
+ return 0; |
+} |
+#endif |
+ |
+int main(int argc, char **argv) { |
+ int children = 0; |
+ int maxtime = 0; |
+ int passedtime = 0; |
+ dictionary *dict = NULL; |
+ |
+ // Command line handling |
+ if (argc == 1 || (0 == strcmp(argv[1], "-h")) || (0 == strcmp(argv[1], "--help"))) { |
+ printf("ProcLauncher takes an ini file. Specify the ini file as the only\n"); |
+ printf("parameter of the command line:\n"); |
+ printf("proclauncher my.ini\n\n"); |
+ printf("The ini file has the form:\n"); |
+ printf("[main]\n"); |
+ printf("children=child1,child2 ; These comma separated values are sections\n"); |
+ printf("maxtime=60 ; Max time this process lives\n"); |
+ printf("[child1] ; Here is a child section\n"); |
+ printf("children=3 ; You can have grandchildren: this spawns 3 of them for child1\n"); |
+ printf("maxtime=30 ; Max time, note it's in seconds. If this time\n"); |
+ printf(" ; is > main:maxtime then the child process will be\n"); |
+ printf(" ; killed when the parent exits. Also, grandchildren\n"); |
+ printf("[child2] ; inherit this maxtime and can't change it.\n"); |
+ printf("maxtime=25 ; You can call these sections whatever you want\n"); |
+ printf("children=0 ; as long as you reference them in a children attribute\n"); |
+ printf("....\n"); |
+ return 0; |
+ } else if (argc == 2) { |
+ // This is ini file mode: |
+ // proclauncher <inifile> |
+ dict = iniparser_load(argv[1]); |
+ |
+ } else if (argc == 3) { |
+ // Then we've been called in child process launching mode: |
+ // proclauncher <children> <maxtime> |
+ children = atoi(argv[1]); |
+ maxtime = atoi(argv[2]); |
+ } |
+ |
+ if (dict) { |
+ /* Dict operation */ |
+ char *childlist = iniparser_getstring(dict, "main:children", NULL); |
+ maxtime = iniparser_getint(dict, (char*)"main:maxtime", 10);; |
+ if (childlist) { |
+ int c = 0, m = 10; |
+ char childkey[50], maxkey[50]; |
+ char cmd[25]; |
+ char *token = strtok(childlist, ","); |
+ |
+ while (token) { |
+ // Reset defaults |
+ memset(childkey, 0, 50); |
+ memset(maxkey, 0, 50); |
+ memset(cmd, 0, 25); |
+ c = 0; |
+ m = 10; |
+ |
+ sprintf(childkey, "%s:children", token); |
+ sprintf(maxkey, "%s:maxtime", token); |
+ c = iniparser_getint(dict, childkey, 0); |
+ m = iniparser_getint(dict, maxkey, 10); |
+ |
+ // Launch the child process |
+ #ifdef _WIN32 |
+ launchWindows(c, m); |
+ #else |
+ sprintf(cmd, "./proclaunch %d %d &", c, m); |
+ system(cmd); |
+ #endif |
+ |
+ // Get the next child entry |
+ token = strtok(NULL, ","); |
+ } |
+ } |
+ iniparser_freedict(dict); |
+ } else { |
+ // Child Process operation - put on your recursive thinking cap |
+ char cmd[25]; |
+ // This is launching grandchildren, there are no great grandchildren, so we |
+ // pass in a 0 for the children to spawn. |
+ #ifdef _WIN32 |
+ while(children > 0) { |
+ launchWindows(0, maxtime); |
+ children--; |
+ } |
+ #else |
+ sprintf(cmd, "./proclaunch %d %d &", 0, maxtime); |
+ printf("Launching child process: %s\n", cmd); |
+ while (children > 0) { |
+ system(cmd); |
+ children--; |
+ } |
+ #endif |
+ } |
+ |
+ /* Now we have launched all the children. Let's wait for max time before returning |
+ This does pseudo busy waiting just to appear active */ |
+ while (passedtime < maxtime) { |
+#ifdef _WIN32 |
+ Sleep(1000); |
+#else |
+ sleep(1); |
+#endif |
+ passedtime++; |
+ } |
+ exit(0); |
+ return 0; |
+} |
Property changes on: third_party/mozprocess/tests/proclaunch.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |