diff --git a/core/org.eclipse.cdt.core.win32.x86/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core.win32.x86/META-INF/MANIFEST.MF index 7bed843e1b9..b06e557696c 100644 --- a/core/org.eclipse.cdt.core.win32.x86/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core.win32.x86/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %fragmentName.win32.x86 Bundle-SymbolicName: org.eclipse.cdt.core.win32.x86;singleton:=true -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %providerName Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[5.7.0,6.0.0)" Bundle-Localization: plugin diff --git a/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/spawner.dll b/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/spawner.dll index 0608730ebe6..b2977f380cb 100644 Binary files a/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/spawner.dll and b/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/spawner.dll differ diff --git a/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/starter.exe b/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/starter.exe index a6f4256bc81..3683873d834 100644 Binary files a/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/starter.exe and b/core/org.eclipse.cdt.core.win32.x86/os/win32/x86/starter.exe differ diff --git a/core/org.eclipse.cdt.core.win32.x86/pom.xml b/core/org.eclipse.cdt.core.win32.x86/pom.xml index 09721c4c8ca..b8fcc49983a 100644 --- a/core/org.eclipse.cdt.core.win32.x86/pom.xml +++ b/core/org.eclipse.cdt.core.win32.x86/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.cdt.core.win32.x86 eclipse-plugin diff --git a/core/org.eclipse.cdt.core.win32.x86_64/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core.win32.x86_64/META-INF/MANIFEST.MF index ac5b0d5c7a1..02e9288100c 100644 --- a/core/org.eclipse.cdt.core.win32.x86_64/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core.win32.x86_64/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %fragmentName.win32.x86_64 Bundle-SymbolicName: org.eclipse.cdt.core.win32.x86_64;singleton:=true -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[5.7.0,6.0.0)" Eclipse-PlatformFilter: (&(osgi.os=win32)(osgi.arch=x86_64)) Bundle-Vendor: %providerName diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll index d1e2113f7ce..e56edefdd2a 100644 Binary files a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll and b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll differ diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe index a73cf033c01..8fb5e055350 100644 Binary files a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe and b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe differ diff --git a/core/org.eclipse.cdt.core.win32.x86_64/pom.xml b/core/org.eclipse.cdt.core.win32.x86_64/pom.xml index c1fed867e53..aefa9ad3e8c 100644 --- a/core/org.eclipse.cdt.core.win32.x86_64/pom.xml +++ b/core/org.eclipse.cdt.core.win32.x86_64/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.cdt.core.win32.x86_64 eclipse-plugin diff --git a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c index 577114a1361..d1988c171a5 100644 --- a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c +++ b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2011 QNX Software Systems and others. + * Copyright (c) 2002, 2015 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -30,7 +30,7 @@ #define PIPE_NAME_LENGTH 100 // Size of pipe name buffer #define PIPE_TIMEOUT 10000 // Default time-out value, in milliseconds. -#define MAX_PROCS (100) // Maximum number of simultaneiously runnig processes +#define MAX_PROCS (100) // Maximum number of simultaneously running processes // Process description block. Should be created for each launched process @@ -53,7 +53,7 @@ static int procCounter = 0; // Number of running processes // This is a VM helper void ThrowByName(JNIEnv *env, const char *name, const char *msg); -// Creates _procInfo block for every launched procss +// Creates _procInfo block for every launched process pProcInfo_t createProcInfo(); // Find process description for this pid @@ -62,7 +62,7 @@ pProcInfo_t findProcInfo(int pid); // We launch separate thread for each project to trap it termination void _cdecl waitProcTermination(void* pv) ; -// This is a helper function to prevent losing of quotatin marks +// This is a helper function to prevent losing of quotation marks static int copyTo(wchar_t * target, const wchar_t * source, int cpyLenght, int availSpace); // Use this function to clean project descriptor and return it to the pool of available blocks. @@ -89,7 +89,7 @@ static HMODULE hVM = NULL; // VM handler static pProcInfo_t pInfo = NULL; -static int nCounter = 0; // We use it to build unique synchronisation object names +static int nCounter = 0; // We use it to build unique synchronization object names ///////////////////////////////////////////////////////////////////////////////////// // Launcher; launchess process and traps its termination @@ -148,7 +148,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 pProcInfo_t pCurProcInfo; // This needs to be big enough to contain the name of the event used when calling CreateEventW bellow. - // It is made of a prefix (7 characters max) plus the value of a pointer that gets outputed in characters. + // It is made of a prefix (7 characters max) plus the value of a pointer that gets output in characters. // This will be bigger in the case of 64 bit. static const int MAX_EVENT_NAME_LENGTH = 50; wchar_t eventBreakName[MAX_EVENT_NAME_LENGTH]; @@ -224,13 +224,18 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 } // Construct starter's command line - swprintf(eventBreakName, L"SABreak%p", pCurProcInfo); - swprintf(eventWaitName, L"SAWait%p", pCurProcInfo); - swprintf(eventTerminateName, L"SATerm%p", pCurProcInfo); - swprintf(eventKillName, L"SAKill%p", pCurProcInfo); - swprintf(eventCtrlcName, L"SACtrlc%p", pCurProcInfo); + swprintf(eventBreakName, L"SABreak%010i", nLocalCounter); + swprintf(eventWaitName, L"SAWait%010i", nLocalCounter); + swprintf(eventTerminateName, L"SATerm%010i", nLocalCounter); + swprintf(eventKillName, L"SAKill%010i", nLocalCounter); + swprintf(eventCtrlcName, L"SACtrlc%010i", nLocalCounter); pCurProcInfo->eventBreak = CreateEventW(NULL, FALSE, FALSE, eventBreakName); + if(NULL == pCurProcInfo->eventBreak || GetLastError() == ERROR_ALREADY_EXISTS) + { + ThrowByName(env, "java/io/IOException", "Cannot create event"); + return 0; + } pCurProcInfo->eventWait = CreateEventW(NULL, TRUE, FALSE, eventWaitName); pCurProcInfo->eventTerminate = CreateEventW(NULL, FALSE, FALSE, eventTerminateName); pCurProcInfo->eventKill = CreateEventW(NULL, FALSE, FALSE, eventKillName); @@ -273,7 +278,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 szCmdLine[nPos] = _T('\0'); #ifdef DEBUG_MONITOR - swprintf(buffer, _T("There are %i environment variables \n"), nEnvVars); + swprintf(buffer, _T("There are %i environment variables \n"), nEnvVars); OutputDebugStringW(buffer); #endif // Prepare environment block @@ -687,7 +692,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise #endif SetEvent(pCurProcInfo -> eventTerminate); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Spawner signalled TERM event\n")); + OutputDebugStringW(_T("Spawner signaled TERM event\n")); #endif ret = 0; break; @@ -700,7 +705,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise #endif SetEvent(pCurProcInfo -> eventKill); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Spawner signalled KILL event\n")); + OutputDebugStringW(_T("Spawner signaled KILL event\n")); #endif ret = 0; break; @@ -886,10 +891,10 @@ void cleanUpProcBlock(pProcInfo_t pCurProcInfo) } ///////////////////////////////////////////////////////////////////////////////////// -// Running in separae thread and waiting for the process termination +// Running in separate thread and waiting for the process termination // Arguments: -// pv - (int)pv is a pid -// Return : always 0 +// pv - pointer to PROCESS_INFORMATION struct +// Return : no ///////////////////////////////////////////////////////////////////////////////////// void _cdecl waitProcTermination(void* pv) { @@ -909,8 +914,7 @@ void _cdecl waitProcTermination(void* pv) cleanUpProcBlock(pInfo + i); #ifdef DEBUG_MONITOR swprintf(buffer, _T("waitProcTermination: set PID %i to 0\n"), - pInfo[i].pid, - GetLastError()); + pi->dwProcessId); OutputDebugStringW(buffer); #endif } @@ -953,12 +957,12 @@ int copyTo(wchar_t * target, const wchar_t * source, int cpyLength, int availSpa else if(wcschr(source, _T(' ')) == NULL) { - // No reason to quotate term becase it doesn't have embedded spaces + // No reason to quote term because it doesn't have embedded spaces nQuotationMode = QUOTATION_NONE; } else { - // Needs to be quotated + // Needs to be quoted nQuotationMode = QUOTATION_DO; *target = _T('\"'); ++j; diff --git a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp index 1746cea2c36..485871da845 100644 --- a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2010 QNX Software Systems and others. + * Copyright (c) 2002, 2015 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -252,7 +252,7 @@ int main() { return -1;; } -#ifdef DEBUG_MONITOR +#ifdef DEBUG_MONITOR_DETAILS wchar_t * lpvEnv = GetEnvironmentStringsW(); // If the returned pointer is NULL, exit. @@ -277,10 +277,31 @@ int main() { #endif // Create job object HANDLE hJob = CreateJobObject(NULL, NULL); - + if (hJob != NULL) { + // Configure job to + // - terminate all associated processes when the last handle to it is closed + // - allow child processes to break away from the job. + JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; + ZeroMemory(&jobInfo, sizeof(jobInfo)); + jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK; + if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) { +#ifdef DEBUG_MONITOR + OutputDebugStringW(_T("Cannot set job information\n")); + DisplayErrorMessage(); +#endif + } + } else { +#ifdef DEBUG_MONITOR + OutputDebugStringW(_T("Cannot create job object\n")); + DisplayErrorMessage(); +#endif + } // Spawn the other processes as part of this Process Group + // If this process is already part of a job, the flag CREATE_BREAKAWAY_FROM_JOB + // makes the child process detach from the job, such that we can assign it + // to our own job object. BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, - 0, NULL, NULL, &si, &pi); + CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi); // We don't need them any more CloseHandle(stdHandles[0]); @@ -292,7 +313,7 @@ int main() { swprintf(buffer, _T("Process %i started\n"), pi.dwProcessId); OutputDebugStringW(buffer); #endif - SetEvent(waitEvent); // Means thar process has been spawned + SetEvent(waitEvent); // Means that process has been spawned CloseHandle(pi.hThread); h[1] = pi.hProcess;