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