Comments and pointers style format changed to comply to kernel code standard.
[lttv.git] / ltt / jni_interface.c
CommitLineData
f22ebb30 1
1202b93d 2/* Important to get consistent size_t type */
f22ebb30
WB
3#define _FILE_OFFSET_BITS 64
4
2b752eed 5#include <jni.h>
f22ebb30 6
2b752eed
WB
7#include <ltt/trace.h>
8#include <ltt/time.h>
9#include <ltt/marker.h>
10#include <glib.h>
11
12#include <stdlib.h>
13#include <stdio.h>
14#include <string.h>
15#include <stdint.h>
f22ebb30 16
1202b93d
WB
17/*
18***FIXME***
19***HACK***
20 We've got hell of a problem passing "unsigned int64" to java, as there is no equivalent type
21 The closer we can use is "long" which is signed, so only 32 (or 63?) bits are valid
22 Plus, even if we are within the "32 bits" capacity, java sometime screw itself trying to convert "unsigned 64 -> signed 64"
23 This happen especially often when RETURNING a jlong
24 So when returning a jlong, we should convert it like this : "unsigned 64"->"signed 64"->jlong
25*/
f22ebb30
WB
26#define CONVERT_UINT64_TO_JLONG(n) (jlong)(gint64)(n)
27#define CONVERT_INT64_TO_JLONG(n) (jlong)(gint64)(n)
28
1202b93d 29/* To ease calcul involving nano */
f22ebb30
WB
30#define BILLION 1000000000
31
32
2b752eed
WB
33#if __WORDSIZE == 64
34 #define CONVERT_JLONG_TO_PTR(p) (p)
20521615 35 #define CONVERT_PTR_TO_JLONG(p) (jlong)(p)
1202b93d 36 /* Define the "gint" type we should use for pointer. */
20521615 37 #define GINT_TYPE_FOR_PTR gint64
2b752eed 38#else
1202b93d 39 /* Conversion to int first to save warning */
2b752eed
WB
40 #define CONVERT_JLONG_TO_PTR(p) (int)(p)
41 #define CONVERT_PTR_TO_JLONG(p) (jlong)(int)(p)
1202b93d 42 /* Define the "gint" type we should use for pointer. */
20521615 43 #define GINT_TYPE_FOR_PTR gint32
2b752eed 44#endif
f22ebb30 45
1202b93d 46/* Structure to encapsulate java_data to pass as arguments */
f22ebb30
WB
47struct java_calling_data
48{
1202b93d 49 JNIEnv *env;
f22ebb30
WB
50 jobject jobj;
51};
52
1202b93d
WB
53/* ***TODO***
54 All these struct are used to call g_datalist_foreach()
55 Find a better way! This is ugly!
56*/
f22ebb30
WB
57struct addMarkersArgs
58{
1202b93d
WB
59 struct java_calling_data *java_args;
60 struct marker_data *mdata;
f22ebb30
WB
61};
62
472656e5
WB
63struct saveTimeArgs
64{
1202b93d 65 GArray *saveTimeArray;
472656e5
WB
66};
67
68struct saveTimeAndTracefile
69{
70 LttTime time;
1202b93d 71 LttTracefile *tracefile;
472656e5
WB
72};
73
74
1202b93d
WB
75/*
76### COMMON Methods ###
77#
78Empty method to turn off the debug (debug waste time while printing) */
79void ignore_and_drop_message(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) {
58907341
WB
80}
81
82
1202b93d
WB
83/* JNI method to call printf from the java side */
84JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_Jni_1C_1Common_ltt_1printC(JNIEnv *env, jobject jobj, jstring new_string) {
85 const char *c_msg = (*env)->GetStringUTFChars(env, new_string, 0);
58907341
WB
86
87 printf("%s", c_msg );
88
89 (*env)->ReleaseStringUTFChars(env, new_string, c_msg);
f22ebb30 90}
1202b93d
WB
91/*
92#
93#### */
f22ebb30
WB
94
95
1202b93d
WB
96/*
97### TRACE methods ###
98#
99JNI mapping of < LttTrace *ltt_trace_open(const gchar *pathname) > (trace.h) */
100JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1openTrace(JNIEnv *env, jobject jobj, jstring pathname, jboolean show_debug) {
58907341
WB
101
102 if ( !show_debug) {
1202b93d 103 /* Make sure we don't use any debug (speed up the read) */
58907341
WB
104 g_log_set_handler(NULL, G_LOG_LEVEL_INFO, ignore_and_drop_message, NULL);
105 g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, ignore_and_drop_message, NULL);
106 }
107
1202b93d
WB
108 const char *c_pathname = (*env)->GetStringUTFChars(env, pathname, 0);
109 LttTrace *newPtr = ltt_trace_open( c_pathname );
f22ebb30
WB
110
111 (*env)->ReleaseStringUTFChars(env, pathname, c_pathname);
112
113 return CONVERT_PTR_TO_JLONG(newPtr);
114}
115
1202b93d
WB
116/* JNI mapping of < void ltt_trace_close(LttTrace *t) > (trace.h) */
117JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1closeTrace(JNIEnv *env, jobject jobj, jlong trace_ptr){
f22ebb30 118
1202b93d 119 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
120
121 ltt_trace_close(newPtr);
122}
123
1202b93d
WB
124/* Get the tracepath */
125JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getTracepath(JNIEnv *env, jobject jobj, jlong trace_ptr) {
126 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
127
128 return (*env)->NewStringUTF(env, g_quark_to_string( newPtr->pathname) );
129}
130
131
1202b93d
WB
132/* Get of num_cpu */
133JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getCpuNumber(JNIEnv *env, jobject jobj, jlong trace_ptr) {
134 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
135
136 return (jint)newPtr->num_cpu;
137}
138
1202b93d
WB
139/* Get of arch_type */
140JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchType(JNIEnv *env, jobject jobj, jlong trace_ptr) {
141 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
142
143 return (jlong)newPtr->arch_type;
144}
145
1202b93d
WB
146/* Get of arch_variant */
147JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchVariant(JNIEnv *env, jobject jobj, jlong trace_ptr) {
148 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
149
150 return (jlong)newPtr->arch_variant;
151}
152
1202b93d
WB
153/* Get of arch_size */
154JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchSize(JNIEnv *env, jobject jobj, jlong trace_ptr) {
155 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
156
157 return (jshort)newPtr->arch_size;
158}
159
1202b93d
WB
160/* Get of ltt_major_version */
161JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getLttMajorVersion(JNIEnv *env, jobject jobj, jlong trace_ptr) {
162 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
163
164 return (jshort)newPtr->ltt_major_version;
165}
166
1202b93d
WB
167/* Get of ltt_minor_version */
168JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getLttMinorVersion(JNIEnv *env, jobject jobj, jlong trace_ptr) {
169 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
170
171 return (jshort)newPtr->ltt_minor_version;
172}
173
1202b93d
WB
174/* Get of flight_recorder */
175JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getFlightRecorder(JNIEnv *env, jobject jobj, jlong trace_ptr) {
176 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
177
178 return (jshort)newPtr->flight_recorder;
179}
180
1202b93d
WB
181/* Get of freq_scale */
182JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getFreqScale(JNIEnv *env, jobject jobj, jlong trace_ptr) {
183 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
184
185 return (jlong)newPtr->freq_scale;
186}
187
1202b93d
WB
188/* Get of start_freq */
189JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartFreq(JNIEnv *env, jobject jobj, jlong trace_ptr) {
190 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
191
192 return CONVERT_UINT64_TO_JLONG(newPtr->start_freq);
193}
194
1202b93d
WB
195/* Get of start_tsc */
196JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartTimestampCurrentCounter(JNIEnv *env, jobject jobj, jlong trace_ptr) {
197 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
198
199 return CONVERT_UINT64_TO_JLONG(newPtr->start_tsc);
200}
201
1202b93d
WB
202/* Get of start_monotonic */
203JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartMonotonic(JNIEnv *env, jobject jobj, jlong trace_ptr) {
204 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
205
206 return CONVERT_UINT64_TO_JLONG(newPtr->start_monotonic);
207}
208
1202b93d
WB
209/* Access to start_time */
210/* Note that we are calling the setTimeFromC function in Jaf_Time from here */
211JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedStartTime(JNIEnv *env, jobject jobj, jlong trace_ptr, jobject time_jobj) {
212 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
213
214 jclass accessClass = (*env)->GetObjectClass(env, time_jobj);
215 jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "setTimeFromC", "(J)V");
216
217 jlong fullTime = (CONVERT_UINT64_TO_JLONG(newPtr->start_time.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(newPtr->start_time.tv_nsec);
218
219 (*env)->CallVoidMethod(env, time_jobj, accessFunction, fullTime );
220}
221
1202b93d
WB
222/* Access to start_time_from_tsc */
223/* Note that we are calling the setTimeFromC function in Jaf_Time from here */
224JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedStartTimeFromTimestampCurrentCounter(JNIEnv *env, jobject jobj, jlong trace_ptr, jobject time_jobj) {
225 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
226
227 jclass accessClass = (*env)->GetObjectClass(env, time_jobj);
228 jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "setTimeFromC", "(J)V");
229
230 jlong fullTime = (CONVERT_UINT64_TO_JLONG(newPtr->start_time_from_tsc.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(newPtr->start_time_from_tsc.tv_nsec);
231
232 (*env)->CallVoidMethod(env, time_jobj, accessFunction, fullTime);
233}
234
235
1202b93d 236/* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getAllTracefiles */
f22ebb30 237void g_datalist_foreach_addTracefilesOfTrace(GQuark name, gpointer data, gpointer user_data) {
1202b93d 238 struct java_calling_data *args = (struct java_calling_data*)user_data;
f22ebb30
WB
239
240 jclass accessClass = (*args->env)->GetObjectClass(args->env, args->jobj);
241 jmethodID accessFunction = (*args->env)->GetMethodID(args->env, accessClass, "addTracefileFromC", "(Ljava/lang/String;J)V");
242
1202b93d
WB
243 GArray *tracefile_array = (GArray*)data;
244 LttTracefile *tracefile;
f22ebb30
WB
245 jlong newPtr;
246
247 unsigned int i;
472656e5
WB
248 for (i=0; i<tracefile_array->len; i++) {
249 tracefile = &g_array_index(tracefile_array, LttTracefile, i);
f22ebb30
WB
250
251 newPtr = CONVERT_PTR_TO_JLONG(tracefile);
252
253 (*args->env)->CallVoidMethod(args->env, args->jobj, accessFunction, (*args->env)->NewStringUTF(args->env, g_quark_to_string(tracefile->name) ), newPtr );
254 }
255}
256
1202b93d
WB
257/* Function to fill up the java map with the event type found in tracefile (the name) */
258JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedAllTracefiles(JNIEnv *env, jobject jobj, jlong trace_ptr) {
259 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
260
261 struct java_calling_data args = { env, jobj };
262
263 g_datalist_foreach(&newPtr->tracefiles, &g_datalist_foreach_addTracefilesOfTrace, &args);
264}
265
472656e5 266
1202b93d
WB
267/* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedTracefileTimeRange */
268/* used to save the current timestamp for each tracefile */
472656e5 269void g_datalist_foreach_saveTracefilesTime(GQuark name, gpointer data, gpointer user_data) {
1202b93d 270 struct saveTimeArgs *args = (struct saveTimeArgs*)user_data;
472656e5 271
1202b93d
WB
272 GArray *tracefile_array = (GArray*)data;
273 GArray *save_array = args->saveTimeArray;
472656e5 274
1202b93d
WB
275 LttTracefile *tracefile;
276 struct saveTimeAndTracefile *savedData;
472656e5
WB
277
278 unsigned int i;
279 for (i=0; i<tracefile_array->len; i++) {
280 tracefile = &g_array_index(tracefile_array, LttTracefile, i);
281
1202b93d 282 /* Allocate a new LttTime for each tracefile (so it won't change if the tracefile seek somewhere else) */
472656e5
WB
283 savedData = (struct saveTimeAndTracefile*)malloc( sizeof(struct saveTimeAndTracefile) );
284 savedData->time.tv_sec = tracefile->event.event_time.tv_sec;
285 savedData->time.tv_nsec = tracefile->event.event_time.tv_nsec;
286 savedData->tracefile = tracefile;
1202b93d 287 /* Append the saved data to the array */
472656e5
WB
288 g_array_append_val(save_array, savedData);
289 }
290}
291
292
1202b93d
WB
293/* Obtain the range of the trace (i.e. "start time" and "end time") */
294/* Note : This function, unlike ltt_trace_time_span_get, is assured to return all tracefiles to their correct position after operation */
295/* NOTE : this method is quite heavy to use!!! */
296JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedTracefileTimeRange(JNIEnv *env, jobject jobj, jlong trace_ptr, jobject jstart_time, jobject jend_time) {
297 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
58907341 298
1202b93d
WB
299 /* Allocate ourself a new array to save the data in */
300 GArray *savedDataArray = g_array_new(FALSE, FALSE, sizeof(struct saveTimeAndTracefile*) );
472656e5 301 struct saveTimeArgs args = { savedDataArray };
1202b93d 302 /* Call g_datalist_foreach_saveTracefilesTime for each element in the GData to save the time */
472656e5
WB
303 g_datalist_foreach(&newPtr->tracefiles, &g_datalist_foreach_saveTracefilesTime, &args);
304
1202b93d
WB
305 /* Call to ltt_trace_time_span_get to find the current start and end time */
306 /* NOTE : This WILL change the current block of the tracefile (i.e. its timestamp) */
58907341
WB
307 LttTime tmpStartTime = { 0, 0 };
308 LttTime tmpEndTime = { 0, 0 };
309 ltt_trace_time_span_get(newPtr, &tmpStartTime, &tmpEndTime);
310
1202b93d
WB
311 /* Seek back to the correct time for each tracefile and free the allocated memory */
312 struct saveTimeAndTracefile *savedData;
472656e5
WB
313 unsigned int i;
314 for (i=0; i<savedDataArray->len; i++) {
315 savedData = g_array_index(savedDataArray, struct saveTimeAndTracefile*, i);
1202b93d
WB
316 /* Seek back to the correct time */
317 /* Some time will not be consistent here (i.e. unitialized data) */
318 /* but the seek should work just fine with that */
472656e5
WB
319 ltt_tracefile_seek_time(savedData->tracefile, savedData->time);
320
1202b93d 321 /* Free the memory allocated for this saveTimeAndTracefile entry */
472656e5
WB
322 free( savedData );
323 }
1202b93d 324 /* Free the memory allocated for the GArray */
472656e5
WB
325 g_array_free(savedDataArray, TRUE);
326
1202b93d
WB
327 /* Send the start and end time back to the java */
328 /* We do it last to make sure a problem won't leave us with unfred memory */
58907341
WB
329 jclass startAccessClass = (*env)->GetObjectClass(env, jstart_time);
330 jmethodID startAccessFunction = (*env)->GetMethodID(env, startAccessClass, "setTimeFromC", "(J)V");
331 jlong startTime = (CONVERT_UINT64_TO_JLONG(tmpStartTime.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(tmpStartTime.tv_nsec);
332 (*env)->CallVoidMethod(env, jstart_time, startAccessFunction, startTime);
333
334 jclass endAccessClass = (*env)->GetObjectClass(env, jend_time);
335 jmethodID endAccessFunction = (*env)->GetMethodID(env, endAccessClass, "setTimeFromC", "(J)V");
336 jlong endTime = (CONVERT_UINT64_TO_JLONG(tmpEndTime.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(tmpEndTime.tv_nsec);
337 (*env)->CallVoidMethod(env, jend_time, endAccessFunction, endTime);
338}
f22ebb30 339
1202b93d
WB
340/* Function to print the content of a trace */
341JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1printTrace(JNIEnv *env, jobject jobj, jlong trace_ptr) {
f22ebb30 342
1202b93d 343 LttTrace *newPtr = (LttTrace*)CONVERT_JLONG_TO_PTR(trace_ptr);
f22ebb30
WB
344
345 printf("pathname : %s\n" ,g_quark_to_string(newPtr->pathname) );
346 printf("num_cpu : %u\n" ,(unsigned int)(newPtr->num_cpu) );
347 printf("arch_type : %u\n" ,(unsigned int)(newPtr->arch_type) );
348 printf("arch_variant : %u\n" ,(unsigned int)(newPtr->arch_variant) );
349 printf("arch_size : %u\n" ,(unsigned short)(newPtr->arch_size) );
350 printf("ltt_major_version : %u\n" ,(unsigned short)(newPtr->ltt_major_version) );
351 printf("ltt_minor_version : %u\n" ,(unsigned short)(newPtr->ltt_minor_version) );
352 printf("flight_recorder : %u\n" ,(unsigned short)(newPtr->flight_recorder) );
353 printf("freq_scale : %u\n" ,(unsigned int)(newPtr->freq_scale) );
2b752eed
WB
354 printf("start_freq : %lu\n" ,(long unsigned int)(newPtr->start_freq) );
355 printf("start_tsc : %lu\n" ,(long unsigned int)(newPtr->start_tsc) );
356 printf("start_monotonic : %lu\n" ,(long unsigned int)(newPtr->start_monotonic) );
20521615 357 printf("start_time ptr : %p\n" ,&newPtr->start_time);
2b752eed
WB
358 printf(" tv_sec : %lu\n" ,(long unsigned int)(newPtr->start_time.tv_sec) );
359 printf(" tv_nsec : %lu\n" ,(long unsigned int)(newPtr->start_time.tv_nsec) );
20521615 360 printf("start_time_from_tsc ptr : %p\n" ,&newPtr->start_time_from_tsc);
2b752eed
WB
361 printf(" tv_sec : %lu\n" ,(long unsigned int)(newPtr->start_time_from_tsc.tv_sec) );
362 printf(" tv_nsec : %lu\n" ,(long unsigned int)(newPtr->start_time_from_tsc.tv_nsec) );
20521615 363 printf("tracefiles ptr : %p\n" ,newPtr->tracefiles);
f22ebb30
WB
364 printf("\n");
365}
1202b93d
WB
366/*
367#
368### */
f22ebb30
WB
369
370
371
372
1202b93d
WB
373/*
374### TRACEFILE methods ###
375# */
58907341 376
1202b93d
WB
377/* Get of cpu_online */
378JNIEXPORT jboolean JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsCpuOnline(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
379 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
380
381 return (jboolean)newPtr->cpu_online;
382}
383
1202b93d
WB
384/* Get of long_name */
385JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracefilepath(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
386 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
387
388 return (*env)->NewStringUTF(env, g_quark_to_string(newPtr->long_name) );
389}
390
1202b93d
WB
391/* Get of name */
392JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracefilename(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
393 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
394
395 return (*env)->NewStringUTF(env, g_quark_to_string(newPtr->name) );
396}
397
1202b93d
WB
398/* Get of cpu_num */
399JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCpuNumber(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
400 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
401
402 return (jlong)newPtr->cpu_num;
403}
404
1202b93d
WB
405/* Get of tid */
406JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTid(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
407 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
408
409 return (jlong)newPtr->tid;
410}
411
1202b93d
WB
412/* Get of pgid */
413JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getPgid(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
414 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
415
416 return (jlong)newPtr->pgid;
417}
418
1202b93d
WB
419/* Get of creation */
420JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCreation(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
421 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
422
423 return CONVERT_UINT64_TO_JLONG(newPtr->creation);
424}
425
1202b93d
WB
426/* Get of trace */
427JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracePtr(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
428 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
429
430 return CONVERT_PTR_TO_JLONG(newPtr->trace);
431}
432
1202b93d
WB
433/* Get of mdata */
434JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getMarkerDataPtr(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
435 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
436
437 return CONVERT_PTR_TO_JLONG(newPtr->mdata);
438}
439
1202b93d
WB
440/* Get of fd */
441JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCFileDescriptor(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
442 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
443
444 return (jint)newPtr->fd;
445}
446
1202b93d
WB
447/* Get of file_size */
448JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getFileSize(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
449 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
450
451 return CONVERT_UINT64_TO_JLONG(newPtr->file_size);
452}
453
1202b93d
WB
454/* Get of num_blocks */
455JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBlockNumber(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
456 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
457
458 return (jlong)newPtr->num_blocks;
459}
460
1202b93d
WB
461/* Get of reverse_bo */
462JNIEXPORT jboolean JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsBytesOrderReversed(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
463 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
464
465 return (jboolean)newPtr->reverse_bo;
466}
467
1202b93d
WB
468/* Get of float_word_order */
469JNIEXPORT jboolean JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsFloatWordOrdered(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
470 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
471
472 return (jboolean)newPtr->float_word_order;
473}
474
1202b93d
WB
475/* Get of alignment */
476JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getAlignement(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
477 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
478
479 return CONVERT_UINT64_TO_JLONG(newPtr->alignment);
480}
481
1202b93d
WB
482/* Get of buffer_header_size */
483JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferHeaderSize(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
484 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
485
486 return CONVERT_UINT64_TO_JLONG(newPtr->buffer_header_size);
487}
488
1202b93d
WB
489/* Get of tscbits */
490JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBitsOfCurrentTimestampCounter(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
491 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
492
493 return (jint)newPtr->tscbits;
494}
495
1202b93d
WB
496/* Get of eventbits */
497JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBitsOfEvent(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
498 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
499
500 return (jint)newPtr->eventbits;
501}
502
1202b93d
WB
503/* Get of tsc_mask */
504JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCurrentTimestampCounterMask(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
505 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
506
507 return CONVERT_UINT64_TO_JLONG(newPtr->tsc_mask);
508}
509
1202b93d
WB
510/* Get of tsc_mask_next_bit */
511JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCurrentTimestampCounterMaskNextBit(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
512 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
513
514 return CONVERT_UINT64_TO_JLONG(newPtr->tsc_mask_next_bit);
515}
516
1202b93d
WB
517/* Get of events_lost */
518JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getEventsLost(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
519 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
520
521 return (jlong)newPtr->events_lost;
522}
523
1202b93d
WB
524/* Get of subbuf_corrupt */
525JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getSubBufferCorrupt(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
526 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
527
528 return (jlong)newPtr->subbuf_corrupt;
529}
530
1202b93d
WB
531/* Get of event */
532JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getEventPtr(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
533 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
534
535 return CONVERT_PTR_TO_JLONG(&newPtr->event);
536}
537
1202b93d
WB
538/* Get of buffer */
539JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferPtr(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
540 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
541
542 return CONVERT_PTR_TO_JLONG(&newPtr->buffer);
543}
544
1202b93d
WB
545/* Get of buffer size */
546JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferSize(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
547 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30 548
f0241068 549 return (jlong)newPtr->buffer.size;
f22ebb30
WB
550}
551
552
1202b93d 553/* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getAllMarkers */
f22ebb30 554void g_hash_table_foreach_addMarkersOfTracefile(gpointer key, gpointer data, gpointer user_data) {
1202b93d
WB
555 struct addMarkersArgs *args = (struct addMarkersArgs*)user_data;
556 struct java_calling_data *jargs = (struct java_calling_data*)args->java_args;
f22ebb30
WB
557
558 jclass accessClass = (*jargs->env)->GetObjectClass(jargs->env, jargs->jobj);
559 jmethodID accessFunction = (*jargs->env)->GetMethodID(jargs->env, accessClass, "addMarkersFromC", "(IJ)V");
560
561 unsigned long marker_id = (unsigned long)data;
562
1202b93d
WB
563 /* The hash table store an ID... we will use the ID to access the array. */
564 GArray *marker = args->mdata->markers;
565 struct marker_info *newPtr = &g_array_index(marker, struct marker_info, marker_id);
f22ebb30
WB
566
567 (*jargs->env)->CallVoidMethod(jargs->env, jargs->jobj, accessFunction, marker_id, CONVERT_PTR_TO_JLONG(newPtr) );
568}
569
1202b93d
WB
570/* Function to fill up the java map with the event type found in tracefile (the name) */
571JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1feedAllMarkers(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
572 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30 573
1202b93d
WB
574 /* ***TODO***
575 Find a better way! This is ugly! */
f22ebb30
WB
576 struct java_calling_data java_args = { env, jobj };
577 struct addMarkersArgs args = { &java_args, newPtr->mdata };
578
579 g_hash_table_foreach( newPtr->mdata->markers_hash, &g_hash_table_foreach_addMarkersOfTracefile, &args);
580}
581
582
1202b93d
WB
583/* Function to print the content of a tracefile */
584JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1printTracefile(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
f22ebb30 585
1202b93d 586 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
587 printf("cpu_online : %i\n" ,(int)newPtr->cpu_online);
588 printf("long_name : %s\n" ,g_quark_to_string(newPtr->long_name));
589 printf("name : %s\n" ,g_quark_to_string(newPtr->name));
590 printf("cpu_num : %u\n" ,(unsigned int)(newPtr->cpu_num));
591 printf("tid : %u\n" ,(unsigned int)(newPtr->tid));
592 printf("pgid : %u\n" ,(unsigned int)(newPtr->pgid));
2b752eed 593 printf("creation : %lu\n" ,(long unsigned int)(newPtr->creation));
20521615
L
594 printf("trace ptr : %p\n" ,newPtr->trace);
595 printf("marker ptr : %p\n" ,newPtr->mdata);
f22ebb30
WB
596 printf("fd : %i\n" ,(int)(newPtr->fd));
597 printf("file_size : %u\n" ,(unsigned int)(newPtr->file_size));
598 printf("num_blocks : %u\n" ,(unsigned int)(newPtr->num_blocks));
599 printf("reverse_bo : %i\n" ,(int)newPtr->reverse_bo);
600 printf("float_word_order : %i\n" ,(int)newPtr->float_word_order);
601 printf("alignment : %i\n" ,(int)newPtr->alignment);
602 printf("buffer_header_size : %i\n" ,(int)newPtr->buffer_header_size);
603 printf("tscbits : %u\n" ,(unsigned short)newPtr->tscbits);
604 printf("eventbits : %u\n" ,(unsigned short)newPtr->eventbits);
2b752eed
WB
605 printf("tsc_mask : %lu\n" ,(long unsigned int)newPtr->tsc_mask);
606 printf("tsc_mask_next_bit : %lu\n" ,(long unsigned int)newPtr->tsc_mask_next_bit);
f22ebb30
WB
607 printf("events_lost : %u\n" ,(unsigned int)newPtr->events_lost);
608 printf("subbuf_corrupt : %u\n" ,(unsigned int)newPtr->subbuf_corrupt);
20521615
L
609 printf("event ptr : %p\n" ,&newPtr->event);
610 printf("buffer ptr : %p\n" ,&newPtr->buffer);
f22ebb30
WB
611 printf("\n");
612}
1202b93d
WB
613/*
614#
615### */
f22ebb30
WB
616
617
618
1202b93d
WB
619/*
620### EVENT methods ###
621# */
f22ebb30 622
1202b93d
WB
623/* Method to get the read status */
624/* This method will read the next event and then seek back its initial position */
625/* Lttv assume that every tracefile have at least 1 event, but we have not guarantee after this one. */
626/* We will read the next event and return the status of that read */
627/* We will then seek back to our initial position */
628/* Note : this method is expensive and should not be used too often */
629JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1positionToFirstEvent(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
630 LttTracefile *tracefilePtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30 631
1202b93d
WB
632 /* Ask ltt to read the next events on the given tracefiles
633 Returned value can be :
634 0 if everything went fine (EOK)
635 ERANGE = 34 out of range, back to last event (might be system dependent?)
636 EPERM = 1 error while reading (might be system dependent?) */
f22ebb30 637
f22ebb30 638
1202b93d 639 /* Seek to the start time... this will also read the first event, as we want. */
2b752eed 640 int returnedValue = ltt_tracefile_seek_time(tracefilePtr, ((struct LttTrace)*(tracefilePtr->trace)).start_time_from_tsc);
f22ebb30
WB
641
642 return (jint)returnedValue;
643}
644
1202b93d
WB
645/* Method to read next event */
646JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1readNextEvent(JNIEnv *env, jobject jobj, jlong tracefile_ptr) {
647 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
648
649 /* Ask ltt to read the next events on the given tracefiles
650 Returned value can be :
651 0 if everything went fine (EOK)
652 ERANGE = 34 out of range, back to last event (might be system dependent?)
653 EPERM = 1 error while reading (might be system dependent?) */
f22ebb30 654
f22ebb30 655
1202b93d
WB
656 /* ***FIXME***
657 This might fail on the FIRST event, as the timestamp before the first read is uninitialized
658 However, LTT make the assumption that all tracefile have AT LEAST one event, so we got to run with it */
f22ebb30 659
1202b93d 660 /* Save "last time" before moving, to be able to get back if needed */
f22ebb30
WB
661 LttTime lastTime = newPtr->event.event_time;
662
663 int returnedValue = ltt_tracefile_read(newPtr);
664
1202b93d 665 /* We need to get back to previous after an error to keep a sane state */
f22ebb30
WB
666 if ( returnedValue != 0 ) {
667 ltt_tracefile_seek_time(newPtr, lastTime);
668 }
669
670 return (jint)returnedValue;
671}
672
1202b93d
WB
673/* Method to seek to a certain event */
674JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1seekEvent(JNIEnv *env, jobject jobj, jlong tracefile_ptr, jobject time_jobj) {
675 LttTracefile *newPtr = (LttTracefile*)CONVERT_JLONG_TO_PTR(tracefile_ptr);
f22ebb30
WB
676
677 guint64 fullTime = 0;
678
679 jclass accessClass = (*env)->GetObjectClass(env, time_jobj);
680 jmethodID getTimeFunction = (*env)->GetMethodID(env, accessClass, "getTime", "()J");
681 fullTime = (*env)->CallLongMethod(env, time_jobj, getTimeFunction);
682
1202b93d
WB
683 /* ***HACK***
684 Conversion from jlong -> C long seems to be particularly sloppy
685 Depending how and where (inlined a function or as a single operation) we do this, we might end up with wrong number
686 The following asignation of guint64 seems to work well.
687 MAKE SURE TO PERFORM SEVERAL TESTS IF YOU CHANGE THIS. */
f22ebb30
WB
688 guint64 seconds = fullTime/BILLION;
689 guint64 nanoSeconds = fullTime%BILLION;
690
691 LttTime seekTime = { (unsigned long)seconds, (unsigned long)nanoSeconds };
692
1202b93d
WB
693 /* Ask ltt to read the next events on the given tracefiles
694 Returned value can be :
695 0 if everything went fine (EOK)
696 ERANGE = 34 out of range, back to last event (might be system dependent?)
697 EPERM = 1 error while reading (might be system dependent?) */
f22ebb30
WB
698
699 int returnedValue = ltt_tracefile_seek_time(newPtr, seekTime);
700 return (jint)returnedValue;
701}
702
1202b93d
WB
703/* Get of tracefile */
704JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getTracefilePtr(JNIEnv *env, jobject jobj, jlong event_ptr) {
705 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
706
707 return CONVERT_PTR_TO_JLONG(newPtr->tracefile);
708}
709
1202b93d
WB
710/* Get of block */
711JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getBlock(JNIEnv *env, jobject jobj, jlong event_ptr) {
712 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
713
714 return (jlong)newPtr->block;
715}
716
1202b93d
WB
717/* Get of offset */
718JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getOffset(JNIEnv *env, jobject jobj, jlong event_ptr) {
719 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
720
721 return (jlong)newPtr->offset;
722}
723
1202b93d
WB
724/* Get of tsc */
725JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getCurrentTimestampCounter(JNIEnv *env, jobject jobj, jlong event_ptr) {
726 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
727
728 return CONVERT_UINT64_TO_JLONG(newPtr->tsc);
729}
730
1202b93d
WB
731/* Get of timestamp */
732JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getTimestamp(JNIEnv *env, jobject jobj, jlong event_ptr) {
733 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
734
735 return (jlong)newPtr->timestamp;
736}
737
1202b93d
WB
738/* Get of event_id */
739JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventMarkerId(JNIEnv *env, jobject jobj, jlong event_ptr) {
740 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
741
742 return (jint)newPtr->event_id;
743}
744
1202b93d
WB
745/* Get time in nanoseconds */
746JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getNanosencondsTime(JNIEnv *env, jobject jobj, jlong event_ptr) {
747 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
58907341
WB
748
749 return (CONVERT_UINT64_TO_JLONG(newPtr->event_time.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(newPtr->event_time.tv_nsec);
750}
751
1202b93d
WB
752/* Fill event_time into an object */
753JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1feedEventTime(JNIEnv *env, jobject jobj, jlong event_ptr, jobject time_jobj) {
754 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
755
756 jclass accessClass = (*env)->GetObjectClass(env, time_jobj);
757 jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "setTimeFromC", "(J)V");
758
759 jlong fullTime = (CONVERT_UINT64_TO_JLONG(newPtr->event_time.tv_sec)*BILLION) + CONVERT_UINT64_TO_JLONG(newPtr->event_time.tv_nsec);
760
761 (*env)->CallVoidMethod(env, time_jobj, accessFunction, fullTime);
762}
763
1202b93d
WB
764/* Access method to the data */
765/* The data are in "byte" form */
766JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getDataContent(JNIEnv *env, jobject jobj, jlong event_ptr, jlong data_size, jbyteArray dataArray) {
767 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
768
769 (*env)->SetByteArrayRegion(env, dataArray, 0, (jsize)data_size, newPtr->data);
770}
771
1202b93d
WB
772/* Get of data_size */
773JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventDataSize(JNIEnv *env, jobject jobj, jlong event_ptr) {
774 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
775
776 return (jlong)newPtr->data_size;
777}
778
1202b93d
WB
779/* Get of event_size */
780JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventSize(JNIEnv *env, jobject jobj, jlong event_ptr) {
781 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
782
783 return (jlong)newPtr->event_size;
784}
785
1202b93d
WB
786/* Get of count */
787JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getCount(JNIEnv *env, jobject jobj, jlong event_ptr) {
788 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
789
790 return (jint)newPtr->count;
791}
792
1202b93d
WB
793/* Get of overflow_nsec */
794JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getOverflowNanoSeconds(JNIEnv *env, jobject jobj, jlong event_ptr) {
795 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30
WB
796
797 return CONVERT_UINT64_TO_JLONG(newPtr->overflow_nsec);
798}
799
800
1202b93d
WB
801/* Function to print the content of a event */
802JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1printEvent(JNIEnv *env, jobject jobj, jlong event_ptr) {
803 LttEvent *newPtr = (LttEvent*)CONVERT_JLONG_TO_PTR(event_ptr);
f22ebb30 804
20521615 805 printf("tracefile : %p\n" ,(void*)newPtr->tracefile );
2b752eed
WB
806 printf("block : %u\n" ,(unsigned int)newPtr->block );
807 printf("offset : %u\n" ,(unsigned int)newPtr->offset );
808 printf("tsc : %lu\n" ,(long unsigned int)newPtr->tsc );
809 printf("timestamp : %u\n" ,(unsigned int)newPtr->timestamp );
810 printf("event_id : %u\n" ,(unsigned short)newPtr->event_id );
20521615 811 printf("event_time : %p\n" ,(void*) &newPtr->event_time );
2b752eed
WB
812 printf(" sec : %lu\n" ,(long unsigned int)(newPtr->event_time.tv_sec) );
813 printf(" nsec : %lu\n" ,(long unsigned int)(newPtr->event_time.tv_nsec) );
20521615 814 printf("data : %p\n" ,(void*) newPtr->data );
2b752eed
WB
815 printf("data_size : %u\n" ,(unsigned int)newPtr->data_size );
816 printf("event_size : %u\n" ,(unsigned int)newPtr->event_size );
817 printf("count : %d\n" ,(int)newPtr->count );
818 printf("overflow_nsec : %ld\n" ,(long)newPtr->overflow_nsec );
f22ebb30
WB
819 printf("\n");
820}
1202b93d
WB
821/*
822#
823### */
f22ebb30
WB
824
825
1202b93d
WB
826/*
827### MARKER method ###
828# */
f22ebb30 829
1202b93d
WB
830/* Get of name */
831JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getName(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
832 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
833
834 return (*env)->NewStringUTF(env, g_quark_to_string(newPtr->name));
835}
836
1202b93d
WB
837/* Get of format */
838JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getFormatOverview(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
839 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
840
841 return (*env)->NewStringUTF(env, newPtr->format);
842}
843
1202b93d
WB
844/* Get of size */
845JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getSize(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
846 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
847
848 return (jlong)newPtr->size;
849}
850
1202b93d
WB
851/* Method to get all markerField pointers */
852JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getAllMarkerFields(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
853 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
854
855 jclass accessClass = (*env)->GetObjectClass(env, jobj);
856 jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "addMarkerFieldFromC", "(Ljava/lang/String;J)V");
857
1202b93d
WB
858 GArray *field_array = (GArray*)newPtr->fields;
859 struct marker_field *field;
f22ebb30
WB
860 jlong marker_field_ptr;
861
862 unsigned int i;
863 for (i=0; i<field_array->len; i++) {
864 field = &g_array_index(field_array, struct marker_field, i);
865
866 marker_field_ptr = CONVERT_PTR_TO_JLONG(field);
867
868 (*env)->CallVoidMethod(env, jobj, accessFunction, (*env)->NewStringUTF(env, g_quark_to_string(field->name) ), marker_field_ptr );
869 }
870}
871
872
873
1202b93d
WB
874/* Get of largest_align */
875JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getLargestAlign(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
876 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
877
878 return (jshort)newPtr->largest_align;
879}
880
1202b93d
WB
881/* Get of int_size */
882JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getIntSize(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
883 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
884
885 return (jshort)newPtr->int_size;
886}
887
1202b93d
WB
888/* Get of long_size */
889JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getLongSize(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
890 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
891
892 return (jshort)newPtr->long_size;
893}
894
1202b93d
WB
895/* Get of pointer_size */
896JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getPointerSize(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
897 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
898
899 return (jshort)newPtr->pointer_size;
900}
901
1202b93d
WB
902/* Get of size_t_size */
903JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getSize_1tSize(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
904 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
905
906 return (jshort)newPtr->size_t_size;
907}
908
1202b93d
WB
909/* Get of alignment */
910JNIEXPORT jshort JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getAlignement(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
911 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
912
913 return (jshort)newPtr->alignment;
914}
915
1202b93d
WB
916/* Get of next */
917JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getNextMarkerPtr(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
918 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30
WB
919
920 return CONVERT_PTR_TO_JLONG(newPtr->next);
921}
922
923
1202b93d
WB
924/* Function to print the content of a marker */
925JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1printMarker(JNIEnv *env, jobject jobj, jlong marker_info_ptr) {
926 struct marker_info *newPtr = (struct marker_info*)CONVERT_JLONG_TO_PTR(marker_info_ptr);
f22ebb30 927
2b752eed
WB
928 printf("name : %s\n" ,g_quark_to_string(newPtr->name) );
929 printf("format : %s\n" ,newPtr->format );
930 printf("size : %li\n" ,(long int)newPtr->size );
931 printf("largest_align : %u\n" ,(unsigned short)newPtr->largest_align );
20521615 932 printf("fields : %p\n" ,newPtr->fields );
2b752eed
WB
933 printf("int_size : %u\n" ,(unsigned short)newPtr->int_size );
934 printf("long_size : %u\n" ,(unsigned short)newPtr->long_size );
935 printf("pointer_size : %u\n" ,(unsigned short)newPtr->pointer_size );
936 printf("size_t_size : %u\n" ,(unsigned short)newPtr->size_t_size );
937 printf("alignment : %u\n" ,(unsigned short)newPtr->alignment );
20521615 938 printf("next : %p\n" ,newPtr->next );
f22ebb30
WB
939 printf("\n");
940}
1202b93d
WB
941/*
942#
943### */
f22ebb30 944
f22ebb30
WB
945
946
1202b93d
WB
947/*
948### MARKERFIELD Method
949# */
f22ebb30 950
1202b93d
WB
951/* Get of name */
952JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getField(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
953 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
954
955 return (*env)->NewStringUTF(env, g_quark_to_string(newPtr->name));
956}
957
1202b93d
WB
958/* Get of type */
959JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getType(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
960 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
961
962 return (jint)newPtr->type;
963}
964
1202b93d
WB
965/* Get of offset */
966JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getOffset(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
967 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
968
969 return CONVERT_UINT64_TO_JLONG(newPtr->offset);
970}
971
1202b93d
WB
972/* Get of size */
973JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getSize(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
974 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
975
976 return CONVERT_UINT64_TO_JLONG(newPtr->size);
977}
978
1202b93d
WB
979/* Get of alignment */
980JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getAlignment(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
981 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
982
983 return CONVERT_UINT64_TO_JLONG(newPtr->alignment);
984}
985
1202b93d
WB
986/* Get of attributes */
987JNIEXPORT jlong JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getAttributes(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
988 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
989
990 return CONVERT_UINT64_TO_JLONG(newPtr->attributes);
991}
992
1202b93d
WB
993/* Get of static_offset */
994JNIEXPORT jint JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getStatic_1offset(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
995 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
996
997 return (jint)newPtr->static_offset;
998}
999
1202b93d
WB
1000/* Get of fmt */
1001JNIEXPORT jstring JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getFormat(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
1002 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
1003
1004 return (*env)->NewStringUTF(env, newPtr->fmt->str);
1005}
1006
1202b93d
WB
1007/* Function to print the content of a marker_field */
1008JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1printMarkerField(JNIEnv *env, jobject jobj, jlong marker_field_ptr) {
1009 struct marker_field *newPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30 1010
2b752eed
WB
1011 printf("name : %s\n" ,g_quark_to_string(newPtr->name) );
1012 printf("type : %i\n" ,(int)newPtr->type );
1013 printf("offset : %lu\n" ,(long unsigned int)newPtr->offset );
1014 printf("size : %lu\n" ,(long unsigned int)newPtr->size );
1015 printf("alignment : %lu\n" ,(long unsigned int)newPtr->alignment );
1016 printf("attributes : %lu\n" ,(long unsigned int)newPtr->attributes );
1017 printf("static_offset : %i\n" ,(int)newPtr->static_offset );
1018 printf("fmt : %s\n" ,newPtr->fmt->str );
f22ebb30
WB
1019 printf("\n");
1020}
1202b93d
WB
1021/*
1022#
1023### */
f22ebb30
WB
1024
1025
1202b93d
WB
1026/*
1027### PARSER Method
1028# */
f22ebb30 1029
1202b93d
WB
1030/* This function will do the actual parsing */
1031/* It will then call java to assign the parsed data to the object "javaObj" */
1032JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_JniParser_ltt_1getParsedData(JNIEnv *env, jclass accessClass, jobject javaObj, jlong event_ptr, jlong marker_field_ptr) {
f22ebb30 1033 LttEvent newEventPtr = *(LttEvent*)(CONVERT_JLONG_TO_PTR(event_ptr));
1202b93d 1034 struct marker_field *newMarkerFieldPtr = (struct marker_field*)CONVERT_JLONG_TO_PTR(marker_field_ptr);
f22ebb30
WB
1035
1036 jmethodID accessFunction = NULL;
1037
1038
1202b93d
WB
1039 /*
1040 There is a very limited number of type in LTT
1041 We will switch on the type for this field and act accordingly
1042 NOTE : We will save all integer into "long" type, as there is no signed/unsigned in java */
f22ebb30 1043
1202b93d
WB
1044 /* ***HACK***
1045 It seems the marker_field->type is absolutely not consistent, especially about pointer!
1046 Sometime pointer are saved in String, sometime as Int, sometime as pointer...
1047 We will do an extra check on type "LTT_TYPE_UNSIGNED_INT" to check if the marker_field->format is hint of a pointer */
f22ebb30
WB
1048 switch ( newMarkerFieldPtr->type ) {
1049 case LTT_TYPE_SIGNED_INT :
58907341 1050 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addLongToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30
WB
1051 (*env)->CallStaticVoidMethod( env,
1052 accessClass,
1053 accessFunction,
1054 javaObj,
58907341 1055 ltt_event_get_long_int(&newEventPtr, newMarkerFieldPtr)
f22ebb30
WB
1056 );
1057
1058 break;
1059
1060 case LTT_TYPE_UNSIGNED_INT :
1202b93d 1061 /* If the format seems to be a pointer, add it as a pointer */
f22ebb30 1062 if ( (strncmp(newMarkerFieldPtr->fmt->str, "0x%llX", newMarkerFieldPtr->fmt->len) == 0 ) || (strncmp(newMarkerFieldPtr->fmt->str, "%llX", newMarkerFieldPtr->fmt->len) == 0 ) ) {
58907341
WB
1063 #if __WORDSIZE == 64
1064 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addLongPointerToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30 1065 #else
58907341 1066 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addIntPointerToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30
WB
1067 #endif
1068 (*env)->CallStaticVoidMethod( env,
1069 accessClass,
1070 accessFunction,
1071 javaObj,
58907341 1072 CONVERT_PTR_TO_JLONG(ltt_event_get_long_unsigned(&newEventPtr, newMarkerFieldPtr) )
f22ebb30
WB
1073 );
1074 }
1202b93d 1075 /* Otherwise, add it as a number */
f22ebb30 1076 else {
58907341 1077 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addLongToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30
WB
1078 (*env)->CallStaticVoidMethod( env,
1079 accessClass,
1080 accessFunction,
1081 javaObj,
58907341 1082 ltt_event_get_long_unsigned(&newEventPtr, newMarkerFieldPtr)
f22ebb30
WB
1083 );
1084 }
1085
1086 break;
1087
1088 case LTT_TYPE_POINTER :
58907341
WB
1089 #if __WORDSIZE == 64
1090 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addLongPointerToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30 1091 #else
58907341 1092 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addIntPointerToParsingFromC", "(Ljava/lang/Object;J)V");
f22ebb30
WB
1093 #endif
1094 (*env)->CallStaticVoidMethod( env,
1095 accessClass,
1096 accessFunction,
1097 javaObj,
58907341 1098 CONVERT_PTR_TO_JLONG(*(GINT_TYPE_FOR_PTR*)(newEventPtr.data + newMarkerFieldPtr->offset))
f22ebb30
WB
1099 );
1100 break;
1101
1102 case LTT_TYPE_STRING :
58907341 1103 accessFunction = (*env)->GetStaticMethodID(env, accessClass, "addStringToParsingFromC", "(Ljava/lang/Object;Ljava/lang/String;)V");
f22ebb30
WB
1104 (*env)->CallStaticVoidMethod( env,
1105 accessClass,
1106 accessFunction,
1107 javaObj,
58907341 1108 (*env)->NewStringUTF(env, ltt_event_get_string(&newEventPtr, newMarkerFieldPtr) )
f22ebb30
WB
1109 );
1110 break;
1111
1112 case LTT_TYPE_COMPACT :
1113 case LTT_TYPE_NONE :
1114 default :
58907341 1115 printf("Warning : Unrecognized format type! Skipping! (Java_org_eclipse_linuxtools_lttng_jni_JniParser_ltt_1getParsedData)");
f22ebb30
WB
1116 break;
1117 }
1118
1119}
1202b93d
WB
1120/*
1121#
1122### */
This page took 0.076795 seconds and 4 git commands to generate.