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