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