// Trace Server.cpp : Defines the entry point for the DLL application.
|
//
|
|
#define IMPLEMENT_DLL_INTERFACE
|
|
#include "stdafx.h"
|
|
#include <jni.h>
|
#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();
|
}
|