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