Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 63174 invoked from network); 12 Feb 2010 11:29:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 12 Feb 2010 11:29:00 -0000 Received: (qmail 95517 invoked by uid 500); 12 Feb 2010 11:28:59 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 95417 invoked by uid 500); 12 Feb 2010 11:28:59 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 95408 invoked by uid 99); 12 Feb 2010 11:28:59 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Feb 2010 11:28:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Feb 2010 11:28:57 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id ECAF22388A1C; Fri, 12 Feb 2010 11:28:35 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r909363 - in /commons/proper/daemon/trunk/src/native/nt/procrun: apps/prunsrv/prunsrv.c include/javajni.h src/javajni.c Date: Fri, 12 Feb 2010 11:28:35 -0000 To: commits@commons.apache.org From: mturk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100212112835.ECAF22388A1C@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mturk Date: Fri Feb 12 11:28:35 2010 New Revision: 909363 URL: http://svn.apache.org/viewvc?rev=909363&view=rev Log: Update fix for DAEMON-97 by making sure we don't block forewer if shutdown was executed Modified: commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c Modified: commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c?rev=909363&r1=909362&r2=909363&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c Fri Feb 12 11:28:35 2010 @@ -39,6 +39,7 @@ #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 +#define ONE_MINUTE (60 * 1000) #ifdef WIN64 #define KREG_WOW6432 KEY_WOW64_32KEY @@ -1276,11 +1277,10 @@ rv = apxHandleWait(gWorker, INFINITE, FALSE); apxLogWrite(APXLOG_MARK_DEBUG "Worker finished."); - reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); - /* This will cause to wait for all threads to exit - * TODO: Use some kind of timeout wait logic - */ - apxDestroyJvm(); + if (gShutdownEvent) { + } + else + apxDestroyJvm(INFINITE); apxLogWrite(APXLOG_MARK_DEBUG "JVM destroyed."); } else { @@ -1288,12 +1288,27 @@ goto cleanup; } if (gShutdownEvent) { + reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); /* Ensure that shutdown thread exits before us */ apxLogWrite(APXLOG_MARK_DEBUG "Waiting for ShutdownEvent"); - WaitForSingleObject(gShutdownEvent, 60 * 1000); + WaitForSingleObject(gShutdownEvent, ONE_MINUTE); apxLogWrite(APXLOG_MARK_DEBUG "ShutdownEvent signaled"); CloseHandle(gShutdownEvent); + /* This will cause to wait for all threads to exit + */ + apxLogWrite(APXLOG_MARK_DEBUG "Waiting 1 minute for all threads to exit"); + apxDestroyJvm(ONE_MINUTE); + } + else { + /* We came here without shutdown event + * Probably because main() returned without ensuring all threads + * have finished + */ + apxLogWrite(APXLOG_MARK_DEBUG "Waiting for all threads to exit"); + apxDestroyJvm(INFINITE); + reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); } + apxLogWrite(APXLOG_MARK_DEBUG "JVM destroyed."); reportServiceStatus(SERVICE_STOPPED, NO_ERROR, 0); return; Modified: commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h?rev=909363&r1=909362&r2=909363&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h Fri Feb 12 11:28:35 2010 @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + #ifndef _JAVAJNI_H_INCLUDED_ #define _JAVAJNI_H_INCLUDED_ @@ -43,7 +43,7 @@ LPCWSTR szFilename); DWORD apxJavaSetOptions(APXHANDLE hJava, DWORD dwOptions); -BOOL apxDestroyJvm(void); +BOOL apxDestroyJvm(DWORD dwTimeout); __APXEND_DECLS Modified: commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c?rev=909363&r1=909362&r2=909363&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c Fri Feb 12 11:28:35 2010 @@ -131,7 +131,7 @@ jint _iStatus; if (!_st_sys_jvm) - return FALSE; + return FALSE; _iStatus = (*(lpJava->lpJvm))->GetEnv(lpJava->lpJvm, (void **)&(lpJava->lpEnv), lpJava->iVersion); @@ -151,7 +151,7 @@ static __inline BOOL __apxJvmDetach(LPAPXJAVAVM lpJava) { if (!_st_sys_jvm) - return FALSE; + return FALSE; if ((*(lpJava->lpJvm))->DetachCurrentThread(lpJava->lpJvm) != JNI_OK) { lpJava->lpEnv = NULL; return FALSE; @@ -292,15 +292,34 @@ return hJava; } +static DWORD WINAPI __apxJavaDestroyThread(LPVOID lpParameter) +{ + JavaVM *lpJvm = (JavaVM *)lpParameter; + (*lpJvm)->DestroyJavaVM(lpJvm); + return 0; +} + BOOL -apxDestroyJvm() +apxDestroyJvm(DWORD dwTimeout) { if (_st_sys_jvm) { + DWORD tid; + HANDLE hWaiter; + BOOL rv = FALSE; JavaVM *lpJvm = _st_sys_jvm; + _st_sys_jvm = NULL; (*lpJvm)->DetachCurrentThread(lpJvm); - (*lpJvm)->DestroyJavaVM(lpJvm); - return TRUE; + hWaiter = CreateThread(NULL, 0, __apxJavaDestroyThread, + (void *)lpJvm, 0, &tid); + if (IS_INVALID_HANDLE(hWaiter)) { + apxLogWrite(APXLOG_MARK_SYSERR); + return FALSE; + } + if (WaitForSingleObject(hWaiter, dwTimeout) == WAIT_OBJECT_0) + rv = TRUE; + CloseHandle(hWaiter); + return rv; } else return FALSE;