/* * proc_exit callback to tear down the JVM */ static void _destroyJavaVM(int status, Datum dummy) { if(s_javaVM != 0) { Invocation ctx; #ifdef USE_PLJAVA_SIGHANDLERS #if PG_VERSION_NUM >= 90300 TimeoutId tid; #else pqsigfunc saveSigAlrm; #endif Invocation_pushInvocation(&ctx, false); if(sigsetjmp(recoverBuf, 1) != 0) { elog(DEBUG2, "needed to forcibly shut down the Java virtual machine"); s_javaVM = 0; return; } #if PG_VERSION_NUM >= 90300 InitializeTimeouts(); /* establishes SIGALRM handler */ tid = RegisterTimeout(USER_TIMEOUT, terminationTimeoutHandler); #else saveSigAlrm = pqsignal(SIGALRM, terminationTimeoutHandler); enable_sig_alarm(5000, false); #endif elog(DEBUG2, "shutting down the Java virtual machine"); JNI_destroyVM(s_javaVM); #if PG_VERSION_NUM >= 90300 disable_timeout(tid, false); #else disable_sig_alarm(false); pqsignal(SIGALRM, saveSigAlrm); #endif #else Invocation_pushInvocation(&ctx, false); elog(DEBUG2, "shutting down the Java virtual machine"); JNI_destroyVM(s_javaVM); #endif elog(DEBUG2, "done shutting down the Java virtual machine"); s_javaVM = 0; currentInvocation = 0; } }
void InstallHelper_groundwork() { Invocation ctx; Invocation_pushInvocation(&ctx, false); ctx.function = Function_INIT_WRITER; PG_TRY(); { char const *lpt = LOADPATH_TBL_NAME; char const *lptq = quote_identifier(lpt); jstring pljlp = String_createJavaStringFromNTS(pljavaLoadPath); jstring jlpt = String_createJavaStringFromNTS(lpt); jstring jlptq = String_createJavaStringFromNTS(lptq); if ( lptq != lpt ) pfree((void *)lptq); JNI_callStaticVoidMethod( s_InstallHelper_class, s_InstallHelper_groundwork, pljlp, jlpt, jlptq, pljavaLoadingAsExtension ? JNI_TRUE : JNI_FALSE, extensionExNihilo ? JNI_TRUE : JNI_FALSE); JNI_deleteLocalRef(pljlp); JNI_deleteLocalRef(jlpt); JNI_deleteLocalRef(jlptq); Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); }
static void _endOfSetCB(Datum arg) { Invocation topCall; bool saveInExprCtxCB; CallContextData* ctxData = (CallContextData*)DatumGetPointer(arg); if(currentInvocation == 0) Invocation_pushInvocation(&topCall, ctxData->trusted); saveInExprCtxCB = currentInvocation->inExprContextCB; currentInvocation->inExprContextCB = true; _closeIteration(ctxData); currentInvocation->inExprContextCB = saveInExprCtxCB; }
static Datum internalCallHandler(bool trusted, PG_FUNCTION_ARGS) { Invocation ctx; Datum retval = 0; if ( IS_COMPLETE != initstage ) { /* * Just in case it could be helpful in offering diagnostics later, hang * on to an Oid that is known to refer to PL/Java (because it got here). * It's cheap, and can be followed back to the right language and * handler function entries later if needed. */ *(trusted ? &pljavaTrustedOid : &pljavaUntrustedOid) = fcinfo->flinfo->fn_oid; initsequencer( initstage, false); /* Force initial setting */ s_currentTrust = !trusted; } Invocation_pushInvocation(&ctx, trusted); PG_TRY(); { Function function = Function_getFunction(fcinfo); if(CALLED_AS_TRIGGER(fcinfo)) { /* Called as a trigger procedure */ retval = Function_invokeTrigger(function, fcinfo); } else { /* Called as a function */ retval = Function_invoke(function, fcinfo); } Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); return retval; }
void InstallHelper_groundwork() { Invocation ctx; Invocation_pushInvocation(&ctx, false); ctx.function = Function_INIT_WRITER; PG_TRY(); { jstring pljlp = String_createJavaStringFromNTS(pljavaLoadPath); JNI_callStaticVoidMethod( s_InstallHelper_class, s_InstallHelper_groundwork, pljlp, pljavaLoadingAsExtension ? JNI_TRUE : JNI_FALSE, extensionExNihilo ? JNI_TRUE : JNI_FALSE); Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); }
static Datum internalCallHandler(bool trusted, PG_FUNCTION_ARGS) { Invocation ctx; Datum retval = 0; #ifdef USE_PLJAVA_SIGHANDLERS /* * Substitute SIGUSR1 handler CatchupInterruptHandler with new local * handler PLCatchupInterruptHandler, which will strictly let main * thread of GPDB to process the signal rather than any other threads. * * Resolving possible lwlock releasing crash caused by SIGUSR1. * MPP-23735 */ if(!s_handlerSubstituted) { s_mainThreadIdForHandler = pthread_self(); s_oldHandlerFunc = pqsignal(SIGUSR1, PLCatchupInterruptHandler); s_handlerSubstituted = true; } #endif /* * Just in case it could be helpful in offering diagnostics later, hang * on to an Oid that is known to refer to PL/Java (because it got here). * It's cheap, and can be followed back to the right language and * handler function entries later if needed. */ *(trusted ? &pljavaTrustedOid : &pljavaUntrustedOid) = fcinfo->flinfo->fn_oid; if ( IS_COMPLETE != initstage ) { initsequencer( initstage, false); /* Force initial setting */ s_currentTrust = !trusted; } Invocation_pushInvocation(&ctx, trusted); PG_TRY(); { Function function = Function_getFunction(fcinfo); if(CALLED_AS_TRIGGER(fcinfo)) { /* Called as a trigger procedure */ retval = Function_invokeTrigger(function, fcinfo); } else { /* Called as a function */ retval = Function_invoke(function, fcinfo); } Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); return retval; }