From a31d28944a744fec6f9913f2e7e3e29735e7f8ad Mon Sep 17 00:00:00 2001 From: William Bourque Date: Fri, 16 Apr 2010 14:04:45 -0400 Subject: [PATCH] Merged changes needed by JNI in latest LTTv version --- ltt/Makefile.am | 8 ++- ltt/jni_interface.c | 21 +++++++ ltt/trace.h | 9 +++ ltt/tracefile.c | 135 ++++++++++++++++++++++++++++++++++++++++++++ specs/lttv.spec | 7 ++- 5 files changed, 176 insertions(+), 4 deletions(-) diff --git a/ltt/Makefile.am b/ltt/Makefile.am index f503e633..641bb4c7 100644 --- a/ltt/Makefile.am +++ b/ltt/Makefile.am @@ -8,14 +8,18 @@ AM_CFLAGS = $(PACKAGE_CFLAGS) -lib_LTLIBRARIES = liblttvtraceread.la - if BUILD_JNI_INTERFACE +lib_LTLIBRARIES = liblttvtraceread.la liblttvtraceread_loader.la liblttvtraceread_la_SOURCES = jni_interface.c tracefile.c marker.c event.c +liblttvtraceread_loader_la_SOURCES= lttvtraceread_loader.c else +lib_LTLIBRARIES = liblttvtraceread.la liblttvtraceread_la_SOURCES = tracefile.c marker.c event.c endif +liblttvtraceread_la_LDFLAGS = -release 2.6 +liblttvtraceread_loader_la_LDFLAGS = -release 2.6 + noinst_HEADERS = ltt-private.h lttinclude_HEADERS = \ diff --git a/ltt/jni_interface.c b/ltt/jni_interface.c index aac5a210..8238599e 100644 --- a/ltt/jni_interface.c +++ b/ltt/jni_interface.c @@ -109,6 +109,27 @@ JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_Jni_1C_1Common_ltt_ #### */ + +JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_factory_JniTraceVersion_ltt_1getTraceVersion(JNIEnv *env, jobject jobj, jstring tracepath) { + + const gchar *c_pathname = (*env)->GetStringUTFChars(env, tracepath, 0); + jint tmpMajorNumber = 0; + jint tmpMinorNumber = 0; + + jclass accessClass = (*env)->GetObjectClass(env, jobj); + jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "setTraceVersionFromC", "(II)V"); + + struct LttTraceVersion version_number; + + if ( ltt_get_trace_version(c_pathname, &version_number) >= 0) { + tmpMajorNumber = version_number.ltt_major_version; + tmpMinorNumber = version_number.ltt_minor_version; + } + + (*env)->CallVoidMethod(env, jobj, accessFunction, tmpMajorNumber, tmpMinorNumber ); +} + + /* ### TRACE methods ### # diff --git a/ltt/trace.h b/ltt/trace.h index 7d7d7122..e16c66f2 100644 --- a/ltt/trace.h +++ b/ltt/trace.h @@ -216,4 +216,13 @@ LttTime ltt_interpolate_time_from_tsc(LttTracefile *tf, guint64 tsc); /* Set to enable event debugging output */ void ltt_event_debug(int state); +/* A structure representing the version number of the trace */ +struct LttTraceVersion { + guint8 ltt_major_version; + guint8 ltt_minor_version; +}; + +/* To get the version number of a trace */ +int ltt_get_trace_version(const gchar *pathname, struct LttTraceVersion * version_number); + #endif // TRACE_H diff --git a/ltt/tracefile.c b/ltt/tracefile.c index c206b046..6c36deed 100644 --- a/ltt/tracefile.c +++ b/ltt/tracefile.c @@ -1790,3 +1790,138 @@ static __attribute__((constructor)) void init(void) { LTT_TRACEFILE_NAME_METADATA = g_quark_from_string("metadata"); } + +/***************************************************************************** + *Function name + * ltt_tracefile_open_header : based on ltt_tracefile_open but it stops + * when it gets the header + *Input params + * fileName : path to the tracefile + * tf : the tracefile (metadata_0) where the header will be read + *Return value + * ltt_subbuffer_header_t : the header containing the version number + ****************************************************************************/ +static ltt_subbuffer_header_t * ltt_tracefile_open_header(gchar *fileName, LttTracefile *tf) +{ + struct stat lTDFStat; /* Trace data file status */ + ltt_subbuffer_header_t *header; + int page_size = getpagesize(); + + /* open the file */ + tf->long_name = g_quark_from_string(fileName); + tf->fd = open(fileName, O_RDONLY); + if(tf->fd < 0){ + g_warning("Unable to open input data file %s\n", fileName); + goto end; + } + + /* Get the file's status */ + if(fstat(tf->fd, &lTDFStat) < 0){ + g_warning("Unable to get the status of the input data file %s\n", fileName); + goto close_file; + } + + /* Is the file large enough to contain a trace */ + if(lTDFStat.st_size < (off_t)(ltt_subbuffer_header_size())) { + g_print("The input data file %s does not contain a trace\n", fileName); + goto close_file; + } + + /* Temporarily map the buffer start header to get trace information */ + /* Multiple of pages aligned head */ + tf->buffer.head = mmap(0,PAGE_ALIGN(ltt_subbuffer_header_size()), PROT_READ, MAP_PRIVATE, tf->fd, 0); + + if(tf->buffer.head == MAP_FAILED) { + perror("Error in allocating memory for buffer of tracefile"); + goto close_file; + } + g_assert( ( (gulong)tf->buffer.head&(8-1) ) == 0); // make sure it's aligned. + + header = (ltt_subbuffer_header_t *)tf->buffer.head; + + return header; + + close_file: + close(tf->fd); + end: + return 0; +} + + +/***************************************************************************** + *Function name + * get_version : get the trace version from a metadata_0 trace file + *Input params + * pathname : path to the trace + * version_number : the struct that will get the version number + *Return value + * int : 1 if succeed, -1 if error + ****************************************************************************/ +int ltt_get_trace_version(const gchar *pathname, struct LttTraceVersion *version_number) +{ + gchar abs_path[PATH_MAX]; + int ret = 0; + DIR *dir; + struct dirent *entry; + struct stat stat_buf; + gchar path[PATH_MAX]; + + LttTracefile tmp_tf; + LttTrace * t; + ltt_subbuffer_header_t *header; + + t = g_new(LttTrace, 1); + + get_absolute_pathname(pathname, abs_path); + + /* Test to see if it looks like a trace */ + dir = opendir(abs_path); + + if(dir == NULL) { + perror(abs_path); + goto open_error; + } + + while((entry = readdir(dir)) != NULL) { + strcpy(path, abs_path); + strcat(path, "/"); + strcat(path, entry->d_name); + ret = stat(path, &stat_buf); + if(ret == -1) { + perror(path); + continue; + } + } + + closedir(dir); + dir = opendir(abs_path); + + while((entry = readdir(dir)) != NULL) { + if(entry->d_name[0] == '.') continue; + if(g_strcmp0(entry->d_name, "metadata_0") != 0) continue; + + strcpy(path, abs_path); + strcat(path, "/"); + strcat(path, entry->d_name); + if(ret == -1) { + perror(path); + continue; + } + + header = ltt_tracefile_open_header(path, &tmp_tf); + + if(header == NULL) { + g_info("Error getting the header %s", path); + continue; /* error opening the tracefile : bad magic number ? */ + } + + version_number->ltt_major_version = header->major_version; + version_number->ltt_minor_version = header->minor_version; + } + + return 0; + + open_error: + g_free(t); + return -1; +} diff --git a/specs/lttv.spec b/specs/lttv.spec index 31852770..a6226b9a 100644 --- a/specs/lttv.spec +++ b/specs/lttv.spec @@ -48,8 +48,11 @@ echo "Running ldconfig (might take a while)" ldconfig %files -%{libdir}/liblttvtraceread.so.0.0.0 -%{libdir}/liblttvtraceread.so.0 +%{libdir}/liblttvtraceread_loader-2.6.so +%{libdir}/liblttvtraceread_loader.so +%{libdir}/liblttvtraceread_loader.la +%{libdir}/liblttvtraceread_loader.a +%{libdir}/liblttvtraceread-2.6.so %{libdir}/liblttvtraceread.so %{libdir}/liblttvtraceread.la %{libdir}/liblttvtraceread.a -- 2.34.1