1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2010 William Bourque
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.
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.
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.
19 /* Important to get consistent size_t type */
20 #define _FILE_OFFSET_BITS 64
24 #include <ltt/trace.h>
26 #include <ltt/marker.h>
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
43 #define CONVERT_UINT64_TO_JLONG(n) (jlong)(gint64)(n)
44 #define CONVERT_INT64_TO_JLONG(n) (jlong)(gint64)(n)
46 /* To ease calcul involving nano */
47 #define BILLION 1000000000
51 #define CONVERT_JLONG_TO_PTR(p) (p)
52 #define CONVERT_PTR_TO_JLONG(p) (jlong)(p)
53 /* Define the "gint" type we should use for pointer. */
54 #define GINT_TYPE_FOR_PTR gint64
56 /* Conversion to int first to save warning */
57 #define CONVERT_JLONG_TO_PTR(p) (int)(p)
58 #define CONVERT_PTR_TO_JLONG(p) (jlong)(int)(p)
59 /* Define the "gint" type we should use for pointer. */
60 #define GINT_TYPE_FOR_PTR gint32
63 /* Structure to encapsulate java_data to pass as arguments */
64 struct java_calling_data
71 All these struct are used to call g_datalist_foreach()
72 Find a better way! This is ugly!
76 struct java_calling_data
*java_args
;
77 struct marker_data
*mdata
;
82 GArray
*saveTimeArray
;
85 struct saveTimeAndTracefile
88 LttTracefile
*tracefile
;
92 ### COMMON Methods ###
94 Empty method to turn off the debug (debug waste time while printing) */
95 void ignore_and_drop_message(const gchar
*log_domain
, GLogLevelFlags log_level
, const gchar
*message
, gpointer user_data
) {
99 /* JNI method to call printf from the java side */
100 JNIEXPORT
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);
103 printf("%s", c_msg
);
105 (*env
)->ReleaseStringUTFChars(env
, new_string
, c_msg
);
113 ### TRACE methods ###
115 JNI mapping of < LttTrace *ltt_trace_open(const gchar *pathname) > (trace.h) */
116 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1openTrace(JNIEnv
*env
, jobject jobj
, jstring pathname
, jboolean show_debug
) {
119 /* Make sure we don't use any debug (speed up the read) */
120 g_log_set_handler(NULL
, G_LOG_LEVEL_INFO
, ignore_and_drop_message
, NULL
);
121 g_log_set_handler(NULL
, G_LOG_LEVEL_DEBUG
, ignore_and_drop_message
, NULL
);
124 const char *c_pathname
= (*env
)->GetStringUTFChars(env
, pathname
, 0);
125 LttTrace
*newPtr
= ltt_trace_open( c_pathname
);
127 (*env
)->ReleaseStringUTFChars(env
, pathname
, c_pathname
);
129 return CONVERT_PTR_TO_JLONG(newPtr
);
132 /* JNI mapping of < void ltt_trace_close(LttTrace *t) > (trace.h) */
133 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1closeTrace(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
){
135 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
137 ltt_trace_close(newPtr
);
140 /* Get the tracepath */
141 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getTracepath(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
142 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
144 return (*env
)->NewStringUTF(env
, g_quark_to_string( newPtr
->pathname
) );
149 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getCpuNumber(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
150 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
152 return (jint
)newPtr
->num_cpu
;
155 /* Get of arch_type */
156 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchType(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
157 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
159 return (jlong
)newPtr
->arch_type
;
162 /* Get of arch_variant */
163 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchVariant(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
164 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
166 return (jlong
)newPtr
->arch_variant
;
169 /* Get of arch_size */
170 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getArchSize(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
171 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
173 return (jshort
)newPtr
->arch_size
;
176 /* Get of ltt_major_version */
177 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getLttMajorVersion(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
178 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
180 return (jshort
)newPtr
->ltt_major_version
;
183 /* Get of ltt_minor_version */
184 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getLttMinorVersion(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
185 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
187 return (jshort
)newPtr
->ltt_minor_version
;
190 /* Get of flight_recorder */
191 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getFlightRecorder(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
192 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
194 return (jshort
)newPtr
->flight_recorder
;
197 /* Get of freq_scale */
198 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getFreqScale(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
199 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
201 return (jlong
)newPtr
->freq_scale
;
204 /* Get of start_freq */
205 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartFreq(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
206 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
208 return CONVERT_UINT64_TO_JLONG(newPtr
->start_freq
);
211 /* Get of start_tsc */
212 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartTimestampCurrentCounter(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
213 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
215 return CONVERT_UINT64_TO_JLONG(newPtr
->start_tsc
);
218 /* Get of start_monotonic */
219 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getStartMonotonic(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
220 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
222 return CONVERT_UINT64_TO_JLONG(newPtr
->start_monotonic
);
225 /* Access to start_time */
226 /* Note that we are calling the setTimeFromC function in Jaf_Time from here */
227 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedStartTime(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
, jobject time_jobj
) {
228 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
230 jclass accessClass
= (*env
)->GetObjectClass(env
, time_jobj
);
231 jmethodID accessFunction
= (*env
)->GetMethodID(env
, accessClass
, "setTimeFromC", "(J)V");
233 jlong fullTime
= (CONVERT_UINT64_TO_JLONG(newPtr
->start_time
.tv_sec
)*BILLION
) + CONVERT_UINT64_TO_JLONG(newPtr
->start_time
.tv_nsec
);
235 (*env
)->CallVoidMethod(env
, time_jobj
, accessFunction
, fullTime
);
238 /* Access to start_time_from_tsc */
239 /* Note that we are calling the setTimeFromC function in Jaf_Time from here */
240 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedStartTimeFromTimestampCurrentCounter(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
, jobject time_jobj
) {
241 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
243 jclass accessClass
= (*env
)->GetObjectClass(env
, time_jobj
);
244 jmethodID accessFunction
= (*env
)->GetMethodID(env
, accessClass
, "setTimeFromC", "(J)V");
246 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
);
248 (*env
)->CallVoidMethod(env
, time_jobj
, accessFunction
, fullTime
);
252 /* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1getAllTracefiles */
253 void g_datalist_foreach_addTracefilesOfTrace(GQuark name
, gpointer data
, gpointer user_data
) {
254 struct java_calling_data
*args
= (struct java_calling_data
*)user_data
;
256 jclass accessClass
= (*args
->env
)->GetObjectClass(args
->env
, args
->jobj
);
257 jmethodID accessFunction
= (*args
->env
)->GetMethodID(args
->env
, accessClass
, "addTracefileFromC", "(Ljava/lang/String;J)V");
259 GArray
*tracefile_array
= (GArray
*)data
;
260 LttTracefile
*tracefile
;
264 for (i
=0; i
<tracefile_array
->len
; i
++) {
265 tracefile
= &g_array_index(tracefile_array
, LttTracefile
, i
);
267 newPtr
= CONVERT_PTR_TO_JLONG(tracefile
);
269 (*args
->env
)->CallVoidMethod(args
->env
, args
->jobj
, accessFunction
, (*args
->env
)->NewStringUTF(args
->env
, g_quark_to_string(tracefile
->name
) ), newPtr
);
273 /* Function to fill up the java map with the event type found in tracefile (the name) */
274 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedAllTracefiles(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
275 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
277 struct java_calling_data args
= { env
, jobj
};
279 g_datalist_foreach(&newPtr
->tracefiles
, &g_datalist_foreach_addTracefilesOfTrace
, &args
);
283 /* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedTracefileTimeRange */
284 /* used to save the current timestamp for each tracefile */
285 void g_datalist_foreach_saveTracefilesTime(GQuark name
, gpointer data
, gpointer user_data
) {
286 struct saveTimeArgs
*args
= (struct saveTimeArgs
*)user_data
;
288 GArray
*tracefile_array
= (GArray
*)data
;
289 GArray
*save_array
= args
->saveTimeArray
;
291 LttTracefile
*tracefile
;
292 struct saveTimeAndTracefile
*savedData
;
295 for (i
=0; i
<tracefile_array
->len
; i
++) {
296 tracefile
= &g_array_index(tracefile_array
, LttTracefile
, i
);
298 /* Allocate a new LttTime for each tracefile (so it won't change if the tracefile seek somewhere else) */
299 savedData
= (struct saveTimeAndTracefile
*)malloc( sizeof(struct saveTimeAndTracefile
) );
300 savedData
->time
.tv_sec
= tracefile
->event
.event_time
.tv_sec
;
301 savedData
->time
.tv_nsec
= tracefile
->event
.event_time
.tv_nsec
;
302 savedData
->tracefile
= tracefile
;
303 /* Append the saved data to the array */
304 g_array_append_val(save_array
, savedData
);
309 /* Obtain the range of the trace (i.e. "start time" and "end time") */
310 /* Note : This function, unlike ltt_trace_time_span_get, is assured to return all tracefiles to their correct position after operation */
311 /* NOTE : this method is quite heavy to use!!! */
312 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1feedTracefileTimeRange(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
, jobject jstart_time
, jobject jend_time
) {
313 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
315 /* Allocate ourself a new array to save the data in */
316 GArray
*savedDataArray
= g_array_new(FALSE
, FALSE
, sizeof(struct saveTimeAndTracefile
*) );
317 struct saveTimeArgs args
= { savedDataArray
};
318 /* Call g_datalist_foreach_saveTracefilesTime for each element in the GData to save the time */
319 g_datalist_foreach(&newPtr
->tracefiles
, &g_datalist_foreach_saveTracefilesTime
, &args
);
321 /* Call to ltt_trace_time_span_get to find the current start and end time */
322 /* NOTE : This WILL change the current block of the tracefile (i.e. its timestamp) */
323 LttTime tmpStartTime
= { 0, 0 };
324 LttTime tmpEndTime
= { 0, 0 };
325 ltt_trace_time_span_get(newPtr
, &tmpStartTime
, &tmpEndTime
);
327 /* Seek back to the correct time for each tracefile and free the allocated memory */
328 struct saveTimeAndTracefile
*savedData
;
330 for (i
=0; i
<savedDataArray
->len
; i
++) {
331 savedData
= g_array_index(savedDataArray
, struct saveTimeAndTracefile
*, i
);
332 /* Seek back to the correct time */
333 /* Some time will not be consistent here (i.e. unitialized data) */
334 /* but the seek should work just fine with that */
335 ltt_tracefile_seek_time(savedData
->tracefile
, savedData
->time
);
337 /* Free the memory allocated for this saveTimeAndTracefile entry */
340 /* Free the memory allocated for the GArray */
341 g_array_free(savedDataArray
, TRUE
);
343 /* Send the start and end time back to the java */
344 /* We do it last to make sure a problem won't leave us with unfred memory */
345 jclass startAccessClass
= (*env
)->GetObjectClass(env
, jstart_time
);
346 jmethodID startAccessFunction
= (*env
)->GetMethodID(env
, startAccessClass
, "setTimeFromC", "(J)V");
347 jlong startTime
= (CONVERT_UINT64_TO_JLONG(tmpStartTime
.tv_sec
)*BILLION
) + CONVERT_UINT64_TO_JLONG(tmpStartTime
.tv_nsec
);
348 (*env
)->CallVoidMethod(env
, jstart_time
, startAccessFunction
, startTime
);
350 jclass endAccessClass
= (*env
)->GetObjectClass(env
, jend_time
);
351 jmethodID endAccessFunction
= (*env
)->GetMethodID(env
, endAccessClass
, "setTimeFromC", "(J)V");
352 jlong endTime
= (CONVERT_UINT64_TO_JLONG(tmpEndTime
.tv_sec
)*BILLION
) + CONVERT_UINT64_TO_JLONG(tmpEndTime
.tv_nsec
);
353 (*env
)->CallVoidMethod(env
, jend_time
, endAccessFunction
, endTime
);
356 /* Function to print the content of a trace */
357 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTrace_ltt_1printTrace(JNIEnv
*env
, jobject jobj
, jlong trace_ptr
) {
359 LttTrace
*newPtr
= (LttTrace
*)CONVERT_JLONG_TO_PTR(trace_ptr
);
361 printf("pathname : %s\n" ,g_quark_to_string(newPtr
->pathname
) );
362 printf("num_cpu : %u\n" ,(unsigned int)(newPtr
->num_cpu
) );
363 printf("arch_type : %u\n" ,(unsigned int)(newPtr
->arch_type
) );
364 printf("arch_variant : %u\n" ,(unsigned int)(newPtr
->arch_variant
) );
365 printf("arch_size : %u\n" ,(unsigned short)(newPtr
->arch_size
) );
366 printf("ltt_major_version : %u\n" ,(unsigned short)(newPtr
->ltt_major_version
) );
367 printf("ltt_minor_version : %u\n" ,(unsigned short)(newPtr
->ltt_minor_version
) );
368 printf("flight_recorder : %u\n" ,(unsigned short)(newPtr
->flight_recorder
) );
369 printf("freq_scale : %u\n" ,(unsigned int)(newPtr
->freq_scale
) );
370 printf("start_freq : %lu\n" ,(long unsigned int)(newPtr
->start_freq
) );
371 printf("start_tsc : %lu\n" ,(long unsigned int)(newPtr
->start_tsc
) );
372 printf("start_monotonic : %lu\n" ,(long unsigned int)(newPtr
->start_monotonic
) );
373 printf("start_time ptr : %p\n" ,&newPtr
->start_time
);
374 printf(" tv_sec : %lu\n" ,(long unsigned int)(newPtr
->start_time
.tv_sec
) );
375 printf(" tv_nsec : %lu\n" ,(long unsigned int)(newPtr
->start_time
.tv_nsec
) );
376 printf("start_time_from_tsc ptr : %p\n" ,&newPtr
->start_time_from_tsc
);
377 printf(" tv_sec : %lu\n" ,(long unsigned int)(newPtr
->start_time_from_tsc
.tv_sec
) );
378 printf(" tv_nsec : %lu\n" ,(long unsigned int)(newPtr
->start_time_from_tsc
.tv_nsec
) );
379 printf("tracefiles ptr : %p\n" ,newPtr
->tracefiles
);
390 ### TRACEFILE methods ###
393 /* Get of cpu_online */
394 JNIEXPORT jboolean JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsCpuOnline(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
395 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
397 return (jboolean
)newPtr
->cpu_online
;
400 /* Get of long_name */
401 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracefilepath(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
402 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
404 return (*env
)->NewStringUTF(env
, g_quark_to_string(newPtr
->long_name
) );
408 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracefilename(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
409 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
411 return (*env
)->NewStringUTF(env
, g_quark_to_string(newPtr
->name
) );
415 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCpuNumber(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
416 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
418 return (jlong
)newPtr
->cpu_num
;
422 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTid(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
423 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
425 return (jlong
)newPtr
->tid
;
429 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getPgid(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
430 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
432 return (jlong
)newPtr
->pgid
;
435 /* Get of creation */
436 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCreation(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
437 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
439 return CONVERT_UINT64_TO_JLONG(newPtr
->creation
);
443 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getTracePtr(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
444 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
446 return CONVERT_PTR_TO_JLONG(newPtr
->trace
);
450 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getMarkerDataPtr(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
451 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
453 return CONVERT_PTR_TO_JLONG(newPtr
->mdata
);
457 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCFileDescriptor(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
458 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
460 return (jint
)newPtr
->fd
;
463 /* Get of file_size */
464 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getFileSize(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
465 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
467 return CONVERT_UINT64_TO_JLONG(newPtr
->file_size
);
470 /* Get of num_blocks */
471 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBlockNumber(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
472 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
474 return (jlong
)newPtr
->num_blocks
;
477 /* Get of reverse_bo */
478 JNIEXPORT jboolean JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsBytesOrderReversed(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
479 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
481 return (jboolean
)newPtr
->reverse_bo
;
484 /* Get of float_word_order */
485 JNIEXPORT jboolean JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getIsFloatWordOrdered(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
486 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
488 return (jboolean
)newPtr
->float_word_order
;
491 /* Get of alignment */
492 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getAlignement(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
493 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
495 return CONVERT_UINT64_TO_JLONG(newPtr
->alignment
);
498 /* Get of buffer_header_size */
499 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferHeaderSize(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
500 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
502 return CONVERT_UINT64_TO_JLONG(newPtr
->buffer_header_size
);
506 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBitsOfCurrentTimestampCounter(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
507 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
509 return (jint
)newPtr
->tscbits
;
512 /* Get of eventbits */
513 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBitsOfEvent(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
514 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
516 return (jint
)newPtr
->eventbits
;
519 /* Get of tsc_mask */
520 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCurrentTimestampCounterMask(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
521 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
523 return CONVERT_UINT64_TO_JLONG(newPtr
->tsc_mask
);
526 /* Get of tsc_mask_next_bit */
527 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getCurrentTimestampCounterMaskNextBit(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
528 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
530 return CONVERT_UINT64_TO_JLONG(newPtr
->tsc_mask_next_bit
);
533 /* Get of events_lost */
534 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getEventsLost(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
535 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
537 return (jlong
)newPtr
->events_lost
;
540 /* Get of subbuf_corrupt */
541 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getSubBufferCorrupt(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
542 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
544 return (jlong
)newPtr
->subbuf_corrupt
;
548 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getEventPtr(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
549 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
551 return CONVERT_PTR_TO_JLONG(&newPtr
->event
);
555 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferPtr(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
556 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
558 return CONVERT_PTR_TO_JLONG(&newPtr
->buffer
);
561 /* Get of buffer size */
562 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getBufferSize(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
563 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
565 return (jlong
)newPtr
->buffer
.size
;
569 /* g_list_data function for the "for_each" call in Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1getAllMarkers */
570 void g_hash_table_foreach_addMarkersOfTracefile(gpointer key
, gpointer data
, gpointer user_data
) {
571 struct addMarkersArgs
*args
= (struct addMarkersArgs
*)user_data
;
572 struct java_calling_data
*jargs
= (struct java_calling_data
*)args
->java_args
;
574 jclass accessClass
= (*jargs
->env
)->GetObjectClass(jargs
->env
, jargs
->jobj
);
575 jmethodID accessFunction
= (*jargs
->env
)->GetMethodID(jargs
->env
, accessClass
, "addMarkersFromC", "(IJ)V");
577 unsigned long marker_id
= (unsigned long)data
;
579 /* The hash table store an ID... we will use the ID to access the array. */
580 GArray
*marker
= args
->mdata
->markers
;
581 struct marker_info
*newPtr
= &g_array_index(marker
, struct marker_info
, marker_id
);
583 (*jargs
->env
)->CallVoidMethod(jargs
->env
, jargs
->jobj
, accessFunction
, marker_id
, CONVERT_PTR_TO_JLONG(newPtr
) );
586 /* Function to fill up the java map with the event type found in tracefile (the name) */
587 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1feedAllMarkers(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
588 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
591 Find a better way! This is ugly! */
592 struct java_calling_data java_args
= { env
, jobj
};
593 struct addMarkersArgs args
= { &java_args
, newPtr
->mdata
};
595 g_hash_table_foreach( newPtr
->mdata
->markers_hash
, &g_hash_table_foreach_addMarkersOfTracefile
, &args
);
599 /* Function to print the content of a tracefile */
600 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniTracefile_ltt_1printTracefile(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
602 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
603 printf("cpu_online : %i\n" ,(int)newPtr
->cpu_online
);
604 printf("long_name : %s\n" ,g_quark_to_string(newPtr
->long_name
));
605 printf("name : %s\n" ,g_quark_to_string(newPtr
->name
));
606 printf("cpu_num : %u\n" ,(unsigned int)(newPtr
->cpu_num
));
607 printf("tid : %u\n" ,(unsigned int)(newPtr
->tid
));
608 printf("pgid : %u\n" ,(unsigned int)(newPtr
->pgid
));
609 printf("creation : %lu\n" ,(long unsigned int)(newPtr
->creation
));
610 printf("trace ptr : %p\n" ,newPtr
->trace
);
611 printf("marker ptr : %p\n" ,newPtr
->mdata
);
612 printf("fd : %i\n" ,(int)(newPtr
->fd
));
613 printf("file_size : %u\n" ,(unsigned int)(newPtr
->file_size
));
614 printf("num_blocks : %u\n" ,(unsigned int)(newPtr
->num_blocks
));
615 printf("reverse_bo : %i\n" ,(int)newPtr
->reverse_bo
);
616 printf("float_word_order : %i\n" ,(int)newPtr
->float_word_order
);
617 printf("alignment : %i\n" ,(int)newPtr
->alignment
);
618 printf("buffer_header_size : %i\n" ,(int)newPtr
->buffer_header_size
);
619 printf("tscbits : %u\n" ,(unsigned short)newPtr
->tscbits
);
620 printf("eventbits : %u\n" ,(unsigned short)newPtr
->eventbits
);
621 printf("tsc_mask : %lu\n" ,(long unsigned int)newPtr
->tsc_mask
);
622 printf("tsc_mask_next_bit : %lu\n" ,(long unsigned int)newPtr
->tsc_mask_next_bit
);
623 printf("events_lost : %u\n" ,(unsigned int)newPtr
->events_lost
);
624 printf("subbuf_corrupt : %u\n" ,(unsigned int)newPtr
->subbuf_corrupt
);
625 printf("event ptr : %p\n" ,&newPtr
->event
);
626 printf("buffer ptr : %p\n" ,&newPtr
->buffer
);
636 ### EVENT methods ###
639 /* Method to get the read status */
640 /* This method will read the next event and then seek back its initial position */
641 /* Lttv assume that every tracefile have at least 1 event, but we have not guarantee after this one. */
642 /* We will read the next event and return the status of that read */
643 /* We will then seek back to our initial position */
644 /* Note : this method is expensive and should not be used too often */
645 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1positionToFirstEvent(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
646 LttTracefile
*tracefilePtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
648 /* Ask ltt to read the next events on the given tracefiles
649 Returned value can be :
650 0 if everything went fine (EOK)
651 ERANGE = 34 out of range, back to last event (might be system dependent?)
652 EPERM = 1 error while reading (might be system dependent?) */
655 /* Seek to the start time... this will also read the first event, as we want. */
656 int returnedValue
= ltt_tracefile_seek_time(tracefilePtr
, ((struct LttTrace
)*(tracefilePtr
->trace
)).start_time_from_tsc
);
658 return (jint
)returnedValue
;
661 /* Method to read next event */
662 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1readNextEvent(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
) {
663 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
665 /* Ask ltt to read the next events on the given tracefiles
666 Returned value can be :
667 0 if everything went fine (EOK)
668 ERANGE = 34 out of range, back to last event (might be system dependent?)
669 EPERM = 1 error while reading (might be system dependent?) */
673 This might fail on the FIRST event, as the timestamp before the first read is uninitialized
674 However, LTT make the assumption that all tracefile have AT LEAST one event, so we got to run with it */
676 /* Save "last time" before moving, to be able to get back if needed */
677 LttTime lastTime
= newPtr
->event
.event_time
;
679 int returnedValue
= ltt_tracefile_read(newPtr
);
681 /* We need to get back to previous after an error to keep a sane state */
682 if ( returnedValue
!= 0 ) {
683 ltt_tracefile_seek_time(newPtr
, lastTime
);
686 return (jint
)returnedValue
;
689 /* Method to seek to a certain event */
690 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1seekEvent(JNIEnv
*env
, jobject jobj
, jlong tracefile_ptr
, jobject time_jobj
) {
691 LttTracefile
*newPtr
= (LttTracefile
*)CONVERT_JLONG_TO_PTR(tracefile_ptr
);
693 guint64 fullTime
= 0;
695 jclass accessClass
= (*env
)->GetObjectClass(env
, time_jobj
);
696 jmethodID getTimeFunction
= (*env
)->GetMethodID(env
, accessClass
, "getTime", "()J");
697 fullTime
= (*env
)->CallLongMethod(env
, time_jobj
, getTimeFunction
);
700 Conversion from jlong -> C long seems to be particularly sloppy
701 Depending how and where (inlined a function or as a single operation) we do this, we might end up with wrong number
702 The following asignation of guint64 seems to work well.
703 MAKE SURE TO PERFORM SEVERAL TESTS IF YOU CHANGE THIS. */
704 guint64 seconds
= fullTime
/BILLION
;
705 guint64 nanoSeconds
= fullTime
%BILLION
;
707 LttTime seekTime
= { (unsigned long)seconds
, (unsigned long)nanoSeconds
};
709 /* Ask ltt to read the next events on the given tracefiles
710 Returned value can be :
711 0 if everything went fine (EOK)
712 ERANGE = 34 out of range, back to last event (might be system dependent?)
713 EPERM = 1 error while reading (might be system dependent?) */
715 int returnedValue
= ltt_tracefile_seek_time(newPtr
, seekTime
);
716 return (jint
)returnedValue
;
719 /* Get of tracefile */
720 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getTracefilePtr(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
721 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
723 return CONVERT_PTR_TO_JLONG(newPtr
->tracefile
);
727 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getBlock(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
728 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
730 return (jlong
)newPtr
->block
;
734 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getOffset(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
735 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
737 return (jlong
)newPtr
->offset
;
741 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getCurrentTimestampCounter(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
742 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
744 return CONVERT_UINT64_TO_JLONG(newPtr
->tsc
);
747 /* Get of timestamp */
748 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getTimestamp(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
749 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
751 return (jlong
)newPtr
->timestamp
;
754 /* Get of event_id */
755 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventMarkerId(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
756 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
758 return (jint
)newPtr
->event_id
;
761 /* Get time in nanoseconds */
762 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getNanosencondsTime(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
763 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
765 return (CONVERT_UINT64_TO_JLONG(newPtr
->event_time
.tv_sec
)*BILLION
) + CONVERT_UINT64_TO_JLONG(newPtr
->event_time
.tv_nsec
);
768 /* Fill event_time into an object */
769 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1feedEventTime(JNIEnv
*env
, jobject jobj
, jlong event_ptr
, jobject time_jobj
) {
770 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
772 jclass accessClass
= (*env
)->GetObjectClass(env
, time_jobj
);
773 jmethodID accessFunction
= (*env
)->GetMethodID(env
, accessClass
, "setTimeFromC", "(J)V");
775 jlong fullTime
= (CONVERT_UINT64_TO_JLONG(newPtr
->event_time
.tv_sec
)*BILLION
) + CONVERT_UINT64_TO_JLONG(newPtr
->event_time
.tv_nsec
);
777 (*env
)->CallVoidMethod(env
, time_jobj
, accessFunction
, fullTime
);
780 /* Access method to the data */
781 /* The data are in "byte" form */
782 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getDataContent(JNIEnv
*env
, jobject jobj
, jlong event_ptr
, jlong data_size
, jbyteArray dataArray
) {
783 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
785 (*env
)->SetByteArrayRegion(env
, dataArray
, 0, (jsize
)data_size
, newPtr
->data
);
788 /* Get of data_size */
789 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventDataSize(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
790 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
792 return (jlong
)newPtr
->data_size
;
795 /* Get of event_size */
796 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getEventSize(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
797 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
799 return (jlong
)newPtr
->event_size
;
803 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getCount(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
804 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
806 return (jint
)newPtr
->count
;
809 /* Get of overflow_nsec */
810 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1getOverflowNanoSeconds(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
811 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
813 return CONVERT_UINT64_TO_JLONG(newPtr
->overflow_nsec
);
817 /* Function to print the content of a event */
818 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniEvent_ltt_1printEvent(JNIEnv
*env
, jobject jobj
, jlong event_ptr
) {
819 LttEvent
*newPtr
= (LttEvent
*)CONVERT_JLONG_TO_PTR(event_ptr
);
821 printf("tracefile : %p\n" ,(void*)newPtr
->tracefile
);
822 printf("block : %u\n" ,(unsigned int)newPtr
->block
);
823 printf("offset : %u\n" ,(unsigned int)newPtr
->offset
);
824 printf("tsc : %lu\n" ,(long unsigned int)newPtr
->tsc
);
825 printf("timestamp : %u\n" ,(unsigned int)newPtr
->timestamp
);
826 printf("event_id : %u\n" ,(unsigned short)newPtr
->event_id
);
827 printf("event_time : %p\n" ,(void*) &newPtr
->event_time
);
828 printf(" sec : %lu\n" ,(long unsigned int)(newPtr
->event_time
.tv_sec
) );
829 printf(" nsec : %lu\n" ,(long unsigned int)(newPtr
->event_time
.tv_nsec
) );
830 printf("data : %p\n" ,(void*) newPtr
->data
);
831 printf("data_size : %u\n" ,(unsigned int)newPtr
->data_size
);
832 printf("event_size : %u\n" ,(unsigned int)newPtr
->event_size
);
833 printf("count : %d\n" ,(int)newPtr
->count
);
834 printf("overflow_nsec : %ld\n" ,(long)newPtr
->overflow_nsec
);
843 ### MARKER method ###
847 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getName(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
848 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
850 return (*env
)->NewStringUTF(env
, g_quark_to_string(newPtr
->name
));
854 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getFormatOverview(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
855 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
857 return (*env
)->NewStringUTF(env
, newPtr
->format
);
861 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getSize(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
862 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
864 return (jlong
)newPtr
->size
;
867 /* Method to get all markerField pointers */
868 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getAllMarkerFields(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
869 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
871 jclass accessClass
= (*env
)->GetObjectClass(env
, jobj
);
872 jmethodID accessFunction
= (*env
)->GetMethodID(env
, accessClass
, "addMarkerFieldFromC", "(Ljava/lang/String;J)V");
874 GArray
*field_array
= (GArray
*)newPtr
->fields
;
875 struct marker_field
*field
;
876 jlong marker_field_ptr
;
879 for (i
=0; i
<field_array
->len
; i
++) {
880 field
= &g_array_index(field_array
, struct marker_field
, i
);
882 marker_field_ptr
= CONVERT_PTR_TO_JLONG(field
);
884 (*env
)->CallVoidMethod(env
, jobj
, accessFunction
, (*env
)->NewStringUTF(env
, g_quark_to_string(field
->name
) ), marker_field_ptr
);
890 /* Get of largest_align */
891 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getLargestAlign(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
892 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
894 return (jshort
)newPtr
->largest_align
;
897 /* Get of int_size */
898 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getIntSize(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
899 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
901 return (jshort
)newPtr
->int_size
;
904 /* Get of long_size */
905 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getLongSize(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
906 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
908 return (jshort
)newPtr
->long_size
;
911 /* Get of pointer_size */
912 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getPointerSize(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
913 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
915 return (jshort
)newPtr
->pointer_size
;
918 /* Get of size_t_size */
919 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getSize_1tSize(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
920 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
922 return (jshort
)newPtr
->size_t_size
;
925 /* Get of alignment */
926 JNIEXPORT jshort JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getAlignement(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
927 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
929 return (jshort
)newPtr
->alignment
;
933 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1getNextMarkerPtr(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
934 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
936 return CONVERT_PTR_TO_JLONG(newPtr
->next
);
940 /* Function to print the content of a marker */
941 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarker_ltt_1printMarker(JNIEnv
*env
, jobject jobj
, jlong marker_info_ptr
) {
942 struct marker_info
*newPtr
= (struct marker_info
*)CONVERT_JLONG_TO_PTR(marker_info_ptr
);
944 printf("name : %s\n" ,g_quark_to_string(newPtr
->name
) );
945 printf("format : %s\n" ,newPtr
->format
);
946 printf("size : %li\n" ,(long int)newPtr
->size
);
947 printf("largest_align : %u\n" ,(unsigned short)newPtr
->largest_align
);
948 printf("fields : %p\n" ,newPtr
->fields
);
949 printf("int_size : %u\n" ,(unsigned short)newPtr
->int_size
);
950 printf("long_size : %u\n" ,(unsigned short)newPtr
->long_size
);
951 printf("pointer_size : %u\n" ,(unsigned short)newPtr
->pointer_size
);
952 printf("size_t_size : %u\n" ,(unsigned short)newPtr
->size_t_size
);
953 printf("alignment : %u\n" ,(unsigned short)newPtr
->alignment
);
954 printf("next : %p\n" ,newPtr
->next
);
964 ### MARKERFIELD Method
968 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getField(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
969 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
971 return (*env
)->NewStringUTF(env
, g_quark_to_string(newPtr
->name
));
975 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getType(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
976 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
978 return (jint
)newPtr
->type
;
982 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getOffset(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
983 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
985 return CONVERT_UINT64_TO_JLONG(newPtr
->offset
);
989 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getSize(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
990 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
992 return CONVERT_UINT64_TO_JLONG(newPtr
->size
);
995 /* Get of alignment */
996 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getAlignment(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
997 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
999 return CONVERT_UINT64_TO_JLONG(newPtr
->alignment
);
1002 /* Get of attributes */
1003 JNIEXPORT jlong JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getAttributes(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
1004 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
1006 return CONVERT_UINT64_TO_JLONG(newPtr
->attributes
);
1009 /* Get of static_offset */
1010 JNIEXPORT jint JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getStatic_1offset(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
1011 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
1013 return (jint
)newPtr
->static_offset
;
1017 JNIEXPORT jstring JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1getFormat(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
1018 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
1020 return (*env
)->NewStringUTF(env
, newPtr
->fmt
->str
);
1023 /* Function to print the content of a marker_field */
1024 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniMarkerField_ltt_1printMarkerField(JNIEnv
*env
, jobject jobj
, jlong marker_field_ptr
) {
1025 struct marker_field
*newPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
1027 printf("name : %s\n" ,g_quark_to_string(newPtr
->name
) );
1028 printf("type : %i\n" ,(int)newPtr
->type
);
1029 printf("offset : %lu\n" ,(long unsigned int)newPtr
->offset
);
1030 printf("size : %lu\n" ,(long unsigned int)newPtr
->size
);
1031 printf("alignment : %lu\n" ,(long unsigned int)newPtr
->alignment
);
1032 printf("attributes : %lu\n" ,(long unsigned int)newPtr
->attributes
);
1033 printf("static_offset : %i\n" ,(int)newPtr
->static_offset
);
1034 printf("fmt : %s\n" ,newPtr
->fmt
->str
);
1046 /* This function will do the actual parsing */
1047 /* It will then call java to assign the parsed data to the object "javaObj" */
1048 JNIEXPORT
void JNICALL
Java_org_eclipse_linuxtools_lttng_jni_JniParser_ltt_1getParsedData(JNIEnv
*env
, jclass accessClass
, jobject javaObj
, jlong event_ptr
, jlong marker_field_ptr
) {
1049 LttEvent newEventPtr
= *(LttEvent
*)(CONVERT_JLONG_TO_PTR(event_ptr
));
1050 struct marker_field
*newMarkerFieldPtr
= (struct marker_field
*)CONVERT_JLONG_TO_PTR(marker_field_ptr
);
1052 jmethodID accessFunction
= NULL
;
1056 There is a very limited number of type in LTT
1057 We will switch on the type for this field and act accordingly
1058 NOTE : We will save all integer into "long" type, as there is no signed/unsigned in java */
1061 It seems the marker_field->type is absolutely not consistent, especially about pointer!
1062 Sometime pointer are saved in String, sometime as Int, sometime as pointer...
1063 We will do an extra check on type "LTT_TYPE_UNSIGNED_INT" to check if the marker_field->format is hint of a pointer */
1064 switch ( newMarkerFieldPtr
->type
) {
1065 case LTT_TYPE_SIGNED_INT
:
1066 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addLongToParsingFromC", "(Ljava/lang/Object;J)V");
1067 (*env
)->CallStaticVoidMethod( env
,
1071 ltt_event_get_long_int(&newEventPtr
, newMarkerFieldPtr
)
1076 case LTT_TYPE_UNSIGNED_INT
:
1077 /* If the format seems to be a pointer, add it as a pointer */
1078 if ( (strncmp(newMarkerFieldPtr
->fmt
->str
, "0x%llX", newMarkerFieldPtr
->fmt
->len
) == 0 ) || (strncmp(newMarkerFieldPtr
->fmt
->str
, "%llX", newMarkerFieldPtr
->fmt
->len
) == 0 ) ) {
1079 #if __WORDSIZE == 64
1080 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addLongPointerToParsingFromC", "(Ljava/lang/Object;J)V");
1082 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addIntPointerToParsingFromC", "(Ljava/lang/Object;J)V");
1084 (*env
)->CallStaticVoidMethod( env
,
1088 CONVERT_PTR_TO_JLONG(ltt_event_get_long_unsigned(&newEventPtr
, newMarkerFieldPtr
) )
1091 /* Otherwise, add it as a number */
1093 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addLongToParsingFromC", "(Ljava/lang/Object;J)V");
1094 (*env
)->CallStaticVoidMethod( env
,
1098 ltt_event_get_long_unsigned(&newEventPtr
, newMarkerFieldPtr
)
1104 case LTT_TYPE_POINTER
:
1105 #if __WORDSIZE == 64
1106 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addLongPointerToParsingFromC", "(Ljava/lang/Object;J)V");
1108 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addIntPointerToParsingFromC", "(Ljava/lang/Object;J)V");
1110 (*env
)->CallStaticVoidMethod( env
,
1114 CONVERT_PTR_TO_JLONG(*(GINT_TYPE_FOR_PTR
*)(newEventPtr
.data
+ newMarkerFieldPtr
->offset
))
1118 case LTT_TYPE_STRING
:
1119 accessFunction
= (*env
)->GetStaticMethodID(env
, accessClass
, "addStringToParsingFromC", "(Ljava/lang/Object;Ljava/lang/String;)V");
1120 (*env
)->CallStaticVoidMethod( env
,
1124 (*env
)->NewStringUTF(env
, ltt_event_get_string(&newEventPtr
, newMarkerFieldPtr
) )
1128 case LTT_TYPE_COMPACT
:
1129 case LTT_TYPE_NONE
:
1131 printf("Warning : Unrecognized format type! Skipping! (Java_org_eclipse_linuxtools_lttng_jni_JniParser_ltt_1getParsedData)");