// Trace Server.cpp : Defines the entry point for the DLL application. // #define IMPLEMENT_DLL_INTERFACE #include "stdafx.h" #include #include "../JavaTracer/com_cisco_avvid_trace_JavaTracer.h" #include "TraceServer.h" #include "CTraceServer.h" int Initialize(); int Uninitialize(); CTraceServer traceServer; int gCount(0); HINSTANCE TraceInstance; CRITICAL_SECTION g_csDllMutex; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: InitializeCriticalSection(&g_csDllMutex); TraceInstance = (HINSTANCE)hModule; gCount = 0; break; case DLL_PROCESS_DETACH: DeleteCriticalSection(&g_csDllMutex); break; default: break; } return TRUE; } DLLFUNCTION int InitializeTracing() { int result = Initialize(); // waits until the tracer thread has a message queue if (result >= 0) { EnterCriticalSection(&g_csDllMutex); result = ++gCount; LeaveCriticalSection(&g_csDllMutex); } return result; } DLLFUNCTION int UninitializeTracing() { int result = 0; EnterCriticalSection(&g_csDllMutex); result = --gCount; LeaveCriticalSection(&g_csDllMutex); if (result == 0) Uninitialize(); return result; } DLLFUNCTION int Trace(char *traceBuffer) { return traceServer.trace(traceBuffer); } DLLFUNCTION char * GetTraceBuffer() { return traceServer.getTraceBuffer(); } JNIEXPORT jint JNICALL Java_com_cisco_avvid_trace_JavaTracer_InitializeTracing (JNIEnv *, jobject) { return InitializeTracing(); } JNIEXPORT jint JNICALL Java_com_cisco_avvid_trace_JavaTracer_UninitializeTracing (JNIEnv *, jobject) { return UninitializeTracing(); } JNIEXPORT jint JNICALL Java_com_cisco_avvid_trace_JavaTracer_tracef (JNIEnv *env, jobject, jstring traceString) { char *traceBuffer = GetTraceBuffer(); // memset(traceBuffer, 0, TRACE_BUFFER_SIZE); if (traceBuffer) { const char *utf_string; jboolean isCopy; utf_string = env->GetStringUTFChars(traceString, &isCopy); // int bytesToCopy = strlen(utf_string); int bytesWritten = _snprintf(traceBuffer, TRACE_BUFFER_SIZE, "%s\n", utf_string); if (isCopy == JNI_TRUE) { env->ReleaseStringUTFChars(traceString, utf_string); } traceBuffer[TRACE_BUFFER_SIZE-1] = '\n'; } return Trace(traceBuffer); } int Initialize() { return traceServer.initialize(); } int Uninitialize() { return traceServer.uninitialize(); }