Changeset 2844 for trunk/src/kmk
- Timestamp:
- Aug 29, 2016, 6:31:33 PM (9 years ago)
- Location:
- trunk/src/kmk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/Makefile.kmk
r2843 r2844 88 88 kmkbuiltin/setmode.c \ 89 89 kmkbuiltin/strmode.c \ 90 kmkbuiltin/kbuild_version.c \91 90 kmkbuiltin/kbuild_protection.c \ 92 91 getopt.c \ -
trunk/src/kmk/job.c
r2843 r2844 1318 1318 assert (*p2); 1319 1319 set_command_state (child->file, cs_running); 1320 child->deleted = 0; 1320 1321 child->pid = 0; 1321 1322 if (p2 != argv) 1322 rc = kmk_builtin_command (*p2, &argv_spawn, &child->pid, child);1323 rc = kmk_builtin_command (*p2, child, &argv_spawn, &child->pid); 1323 1324 else 1324 1325 { … … 1326 1327 while (argv[argc]) 1327 1328 argc++; 1328 rc = kmk_builtin_command_parsed (argc, argv, &argv_spawn, &child->pid, child);1329 rc = kmk_builtin_command_parsed (argc, argv, child, &argv_spawn, &child->pid); 1329 1330 } 1330 1331 … … 1334 1335 # endif 1335 1336 1336 /* synchronous command execution? */ 1337 if (!rc && !argv_spawn) 1338 goto next_command; 1339 1340 /* spawned a child? */ 1341 if (!rc && child->pid) 1337 if (!rc) 1342 1338 { 1343 ++job_counter; 1344 return; 1339 /* spawned a child? */ 1340 if (child->pid) 1341 { 1342 ++job_counter; 1343 return; 1344 } 1345 1346 /* synchronous command execution? */ 1347 if (!argv_spawn) 1348 goto next_command; 1345 1349 } 1346 1350 -
trunk/src/kmk/kmkbuiltin.h
r2843 r2844 35 35 #endif 36 36 37 #include "kbuild_version.h" 38 37 39 int kmk_builtin_command(const char *pszCmd, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned); 38 40 int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned); … … 69 71 extern char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname); 70 72 71 extern int kbuild_version(const char *);72 73 73 #endif 74 74 -
trunk/src/kmk/kmkbuiltin/kSubmit.c
r2843 r2844 52 52 #ifdef KBUILD_OS_WINDOWS 53 53 # include "sub_proc.h" 54 # include "quote_argv.h" 54 55 #endif 55 56 … … 366 367 if (pWorker->OverlappedRead.hEvent != NULL) 367 368 { 368 char szHandleArg[ 16];369 char szHandleArg[32]; 369 370 const char *apszArgs[4] = { szExecutable, "--pipe", szHandleArg, NULL }; 370 371 _snprintf(szHandleArg, sizeof(szHandleArg), "%p", hWorkerPipe); … … 557 558 const char *pszCwd, uint32_t *pcbMsg) 558 559 { 559 size_t i;560 560 size_t cbTmp; 561 uint32_t i; 561 562 uint32_t cbMsg; 563 uint32_t cArgs; 564 uint32_t cEnvVars; 562 565 uint8_t *pbMsg; 563 566 uint8_t *pbCursor; 567 568 /* 569 * Adjust input. 570 */ 571 if (!pszExecutable) 572 pszExecutable = papszArgs[0]; 564 573 565 574 /* … … 569 578 cbMsg += sizeof("JOB"); 570 579 cbMsg += strlen(pszExecutable) + 1; 571 580 cbMsg += strlen(pszCwd) + 1; 581 582 cbMsg += sizeof(cArgs); 572 583 for (i = 0; papszArgs[i] != NULL; i++) 573 cbMsg += strlen(papszArgs[i]) + 1; 574 cbMsg += 1; 575 584 cbMsg += 1 + strlen(papszArgs[i]) + 1; 585 cArgs = i; 586 587 cbMsg += sizeof(cArgs); 576 588 for (i = 0; papszEnvVars[i] != NULL; i++) 577 589 cbMsg += strlen(papszEnvVars[i]) + 1; 578 cbMsg += 1; 579 580 cbMsg += strlen(pszCwd) + 1; 590 cEnvVars = i; 591 581 592 582 593 /* … … 594 605 pbCursor += cbTmp; 595 606 607 cbTmp = strlen(pszCwd) + 1; 608 memcpy(pbCursor, pszCwd, cbTmp); 609 pbCursor += cbTmp; 610 611 memcpy(pbCursor, &cArgs, sizeof(cArgs)); 612 pbCursor += sizeof(cArgs); 596 613 for (i = 0; papszArgs[i] != NULL; i++) 597 614 { 615 *pbCursor++ = 0; /* Argument expansion flags (MSC, EMX). */ 598 616 cbTmp = strlen(papszArgs[i]) + 1; 599 617 memcpy(pbCursor, papszArgs[i], cbTmp); 600 618 pbCursor += cbTmp; 601 619 } 602 *pbCursor++ = '\0'; 603 620 assert(i == cArgs); 621 622 memcpy(pbCursor, &cEnvVars, sizeof(cEnvVars)); 623 pbCursor += sizeof(cEnvVars); 604 624 for (i = 0; papszEnvVars[i] != NULL; i++) 605 625 { … … 608 628 pbCursor += cbTmp; 609 629 } 610 *pbCursor++ = '\0'; 611 612 cbTmp = strlen(pszCwd) + 1; 613 memcpy(pbCursor, pszCwd, cbTmp); 614 pbCursor += cbTmp; 630 assert(i == cEnvVars); 615 631 616 632 assert(pbCursor - pbMsg == (size_t)cbMsg); … … 780 796 /** 781 797 * Used by 782 * @returns 0 if we got the whole result, -1 if I/O is pending, windows last798 * @returns 0 if we got the whole result, -1 if I/O is pending, and windows last 783 799 * error on ReadFile failure. 784 800 * @param pWorker The worker instance. … … 806 822 DWORD dwErr = GetLastError(); 807 823 if (dwErr == ERROR_IO_PENDING) 808 return 1;809 return kSubmitWinReadFailed(pWorker, GetLastError());824 return -1; 825 return kSubmitWinReadFailed(pWorker, dwErr); 810 826 } 811 827 … … 849 865 if (rc == -1) 850 866 { 851 if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker ) == 0)867 if (process_kmk_register_submit(pWorker->OverlappedRead.hEvent, (intptr_t)pWorker, pPidSpawned) == 0) 852 868 { /* likely */ } 853 869 else … … 873 889 */ 874 890 pWorker->pBusyWith = pChild; 891 #ifndef KBUILD_OS_WINDOWS 875 892 *pPidSpawned = pWorker->pid; 893 #endif 876 894 877 895 kSubmitListUnlink(&g_IdleList, pWorker); … … 977 995 PWORKERINSTANCE apWorkers[MAXIMUM_WAIT_OBJECTS]; 978 996 HANDLE ahHandles[MAXIMUM_WAIT_OBJECTS]; 979 DWORD cHandles ;997 DWORD cHandles = 0; 980 998 981 999 for (pWorker = g_IdleList.pHead; pWorker != NULL; pWorker = pWorker->pNext) … … 1329 1347 1330 1348 papszEnv = pChild->environment; 1331 if ( papszEnv)1349 if (!papszEnv) 1332 1350 pChild->environment = papszEnv = target_environment(pChild->file); 1333 1351 cEnvVars = 0; … … 1495 1513 if (pWorker) 1496 1514 { 1515 #ifdef KBUILD_OS_WINDOWS 1516 /* Quote the argv elements, but first we need unquoted pszExecute. */ 1517 char *pszFreeExec = NULL; 1518 if (!pszExecutable) 1519 pszExecutable = pszFreeExec = xstrdup(argv[0]); 1520 quote_argv(argc, argv, fWatcomBrainDamage, 1 /*fFreeOrLeak*/); 1521 #endif 1522 1497 1523 rcExit = kSubmitSendJobMessage(pWorker, pvMsg, cbMsg, 0 /*fNoRespawning*/, cVerbosity); 1498 1524 if (rcExit == 0) … … 1502 1528 if (atexit(kSubmitAtExitCallback) == 0) 1503 1529 g_fAtExitRegistered = 1; 1530 1531 #ifdef KBUILD_OS_WINDOWS 1532 free(pszFreeExec); 1533 #endif 1504 1534 } 1505 1535 else -
trunk/src/kmk/w32/include/sub_proc.h
r2843 r2844 49 49 EXTERN_DECL(int process_used_slots, (VOID_DECL)); 50 50 #ifdef KMK 51 EXTERN_DECL(int process_kmk_register_submit, (HANDLE hEvent, intptr_t clue ));51 EXTERN_DECL(int process_kmk_register_submit, (HANDLE hEvent, intptr_t clue, pid_t *pPid)); 52 52 #endif 53 53 -
trunk/src/kmk/w32/subproc/sub_proc.c
r2843 r2844 206 206 * @param hEvent The event semaphore to wait on. 207 207 * @param clue The clue to base. 208 * @param pPid Where to return the pid that job.c expects. 208 209 */ 209 210 int 210 process_kmk_register_submit(HANDLE hEvent, intptr_t clue )211 process_kmk_register_submit(HANDLE hEvent, intptr_t clue, pid_t *pPid) 211 212 { 212 213 if (proc_index < MAXIMUM_WAIT_OBJECTS) { … … 217 218 218 219 proc_array[proc_index++] = pSubProc; 220 *pPid = (HANDLE)pSubProc; 219 221 return 0; 220 222 }
Note:
See TracChangeset
for help on using the changeset viewer.