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