Handle "first event" better and fix for 64bits.
[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)
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
f22ebb30
WB
42
43// Structure to encapsulate java_data to pass as arguments
44struct java_calling_data
45{
46 JNIEnv* env;
47 jobject jobj;
48};
49
50// *** TODO **
51// Find a better way! This is ugly!
52struct 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
62JNIEXPORT 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)
75JNIEXPORT 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)
85JNIEXPORT 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
93JNIEXPORT 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
101JNIEXPORT 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
108JNIEXPORT 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
115JNIEXPORT 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
122JNIEXPORT 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
129JNIEXPORT 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
136JNIEXPORT 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
143JNIEXPORT 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
150JNIEXPORT 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
157JNIEXPORT 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
164JNIEXPORT 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
171JNIEXPORT 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
179JNIEXPORT 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
192JNIEXPORT 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
205void 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)
226JNIEXPORT 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
236JNIEXPORT 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) );
2b752eed
WB
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);
f22ebb30
WB
259 printf("\n");
260}
261// #
262// ###
263
264
265
266
267// ### TRACEFILE methods ###
268// #
269// Get of cpu_online
270JNIEXPORT 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
277JNIEXPORT 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
284JNIEXPORT 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
291JNIEXPORT 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
298JNIEXPORT 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
305JNIEXPORT 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
312JNIEXPORT 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
319JNIEXPORT 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
326JNIEXPORT 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
333JNIEXPORT 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
340JNIEXPORT 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
347JNIEXPORT 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
354JNIEXPORT 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
361JNIEXPORT 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
368JNIEXPORT 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
375JNIEXPORT 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
382JNIEXPORT 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
389JNIEXPORT 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
396JNIEXPORT 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
403JNIEXPORT 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
410JNIEXPORT 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
417JNIEXPORT 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
424JNIEXPORT 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
431JNIEXPORT 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
438JNIEXPORT 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
446void 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)
463JNIEXPORT 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
476JNIEXPORT 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));
2b752eed
WB
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);
f22ebb30
WB
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);
2b752eed
WB
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);
f22ebb30
WB
499 printf("events_lost : %u\n" ,(unsigned int)newPtr->events_lost);
500 printf("subbuf_corrupt : %u\n" ,(unsigned int)newPtr->subbuf_corrupt);
2b752eed
WB
501 printf("event ptr : 0x%p\n" ,&newPtr->event);
502 printf("buffer ptr : 0x%p\n" ,&newPtr->buffer);
f22ebb30
WB
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
520JNIEXPORT 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
f22ebb30 529
2b752eed
WB
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);
f22ebb30
WB
532
533 return (jint)returnedValue;
534}
535
536// Method to read next event
537JNIEXPORT 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
565JNIEXPORT 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
595JNIEXPORT 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
602JNIEXPORT 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
609JNIEXPORT 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
616JNIEXPORT 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
623JNIEXPORT 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
630JNIEXPORT 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
637JNIEXPORT 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
650JNIEXPORT 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
657JNIEXPORT 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
664JNIEXPORT 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
671JNIEXPORT 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
678JNIEXPORT 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
686JNIEXPORT 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
2b752eed
WB
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 );
f22ebb30
WB
703 printf("\n");
704}
705// #
706// ###
707
708
709// ### MARKER method ###
710// #
711
712// Get of name
713JNIEXPORT 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
720JNIEXPORT 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
727JNIEXPORT 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
734JNIEXPORT 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
757JNIEXPORT 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
764JNIEXPORT 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
771JNIEXPORT 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
778JNIEXPORT 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
785JNIEXPORT 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
792JNIEXPORT 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
799JNIEXPORT 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
807JNIEXPORT 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
2b752eed
WB
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 );
f22ebb30
WB
821 printf("\n");
822}
823
824// #
825// ###
826
827
828
829// ### MARKERFIELD Method
830// #
831
832// Get of name
833JNIEXPORT 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
840JNIEXPORT 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
847JNIEXPORT 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
854JNIEXPORT 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
861JNIEXPORT 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
868JNIEXPORT 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
875JNIEXPORT 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
882JNIEXPORT 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
889JNIEXPORT 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
2b752eed
WB
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 );
f22ebb30
WB
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"
912JNIEXPORT 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.057585 seconds and 4 git commands to generate.