summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorguanglei <guanglei>2006-10-10 09:53:54 +0000
committerguanglei <guanglei>2006-10-10 09:53:54 +0000
commit69e4bcd9d42e828b1d77584947156606289f1e38 (patch)
tree3602df652d7b518b63bf0ac2c661c7631b213be9
parentb1f3e1bd060020f36c35d449914955c3f9cd2aba (diff)
downloadsystemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.tar.gz
systemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.tar.xz
systemtap-steved-69e4bcd9d42e828b1d77584947156606289f1e38.zip
* runtime/lket/b2a/lket_b2a.c, runtime/lket/b2a/lket_b2a.h:
Adding the support of automatically database creation and dumping lket trace into mysql database * configure.ac: add the checking of mysql client library * Makefile.in, configure: regenerated * runtime/lket/b2a/Makefile.am: add the checking and optional compiling for mysql client library * runtime/lket/b2a/Makefile.in: regenerated
-rw-r--r--ChangeLog4
-rw-r--r--Makefile.in2
-rwxr-xr-xconfigure29
-rw-r--r--configure.ac7
-rw-r--r--runtime/ChangeLog9
-rw-r--r--runtime/lket/b2a/Makefile.am7
-rw-r--r--runtime/lket/b2a/Makefile.in10
-rw-r--r--runtime/lket/b2a/lket_b2a.c539
-rw-r--r--runtime/lket/b2a/lket_b2a.h144
-rw-r--r--testsuite/Makefile.in2
10 files changed, 546 insertions, 207 deletions
diff --git a/ChangeLog b/ChangeLog
index fea614e6..aa90e605 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-10-10 Li Guanglei <guanglei@cn.ibm.com>
+
+ * configure.ac: add the checking of mysql client library
+ * Makefile.in, configure: regenerated
2006-09-29 Li Guanglei <guanglei@cn.ibm.com>
* man: newly created dir for stapprobes
diff --git a/Makefile.in b/Makefile.in
index 2b0f73f2..c1bb6fef 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -167,6 +167,8 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@
+HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
diff --git a/configure b/configure
index 2a93d07b..900c1d62 100755
--- a/configure
+++ b/configure
@@ -310,7 +310,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CPP EGREP U ANSI2KNR RANLIB ac_ct_RANLIB BUILD_ELFUTILS_TRUE BUILD_ELFUTILS_FALSE BUILD_LKET_B2A_TRUE BUILD_LKET_B2A_FALSE stap_LIBS DATE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CPP EGREP U ANSI2KNR RANLIB ac_ct_RANLIB BUILD_ELFUTILS_TRUE BUILD_ELFUTILS_FALSE BUILD_LKET_B2A_TRUE BUILD_LKET_B2A_FALSE HAS_MYSQL_TRUE HAS_MYSQL_FALSE stap_LIBS DATE LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -5225,6 +5225,16 @@ else
fi
+
+if which mysql_config > /dev/null 2>&1; then
+ HAS_MYSQL_TRUE=
+ HAS_MYSQL_FALSE='#'
+else
+ HAS_MYSQL_TRUE='#'
+ HAS_MYSQL_FALSE=
+fi
+
+
if ! pkg-config --atleast-version 2.0.0 glib-2.0; then
{ echo "$as_me:$LINENO: WARNING: glib2-devel is required to build lket-b2a.
no glib2-devel found, skip building lket-b2a..." >&5
@@ -5232,6 +5242,14 @@ echo "$as_me: WARNING: glib2-devel is required to build lket-b2a.
no glib2-devel found, skip building lket-b2a..." >&2;}
fi
+if ! which mysql_config > /dev/null 2>&1; then
+ { echo "$as_me:$LINENO: WARNING: mysqlclient lib is required to build lket-b2a with database support.
+ no mysqlclient lib is found, skip building lket-b2a with database support..." >&5
+echo "$as_me: WARNING: mysqlclient lib is required to build lket-b2a with database support.
+ no mysqlclient lib is found, skip building lket-b2a with database support..." >&2;}
+fi
+
+
if test $build_elfutils = no; then
# Need libdwfl-capable recent elfutils from Fedora
save_LIBS="$LIBS"
@@ -5475,6 +5493,13 @@ echo "$as_me: error: conditional \"BUILD_LKET_B2A\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAS_MYSQL_TRUE}" && test -z "${HAS_MYSQL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAS_MYSQL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAS_MYSQL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
: ${CONFIG_STATUS=./config.status}
ac_clean_files_save=$ac_clean_files
@@ -6085,6 +6110,8 @@ s,@BUILD_ELFUTILS_TRUE@,$BUILD_ELFUTILS_TRUE,;t t
s,@BUILD_ELFUTILS_FALSE@,$BUILD_ELFUTILS_FALSE,;t t
s,@BUILD_LKET_B2A_TRUE@,$BUILD_LKET_B2A_TRUE,;t t
s,@BUILD_LKET_B2A_FALSE@,$BUILD_LKET_B2A_FALSE,;t t
+s,@HAS_MYSQL_TRUE@,$HAS_MYSQL_TRUE,;t t
+s,@HAS_MYSQL_FALSE@,$HAS_MYSQL_FALSE,;t t
s,@stap_LIBS@,$stap_LIBS,;t t
s,@DATE@,$DATE,;t t
s,@LIBOBJS@,$LIBOBJS,;t t
diff --git a/configure.ac b/configure.ac
index 08a43e77..65b493cd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,12 +60,19 @@ yes) AC_MSG_ERROR([--with-elfutils requires an argument]) ;;
esac])
AM_CONDITIONAL(BUILD_ELFUTILS, test $build_elfutils = yes)
AM_CONDITIONAL(BUILD_LKET_B2A, pkg-config --atleast-version 2.0.0 glib-2.0)
+AM_CONDITIONAL(HAS_MYSQL, which mysql_config > /dev/null 2>&1)
if ! pkg-config --atleast-version 2.0.0 glib-2.0; then
AC_MSG_WARN([glib2-devel is required to build lket-b2a.
no glib2-devel found, skip building lket-b2a...])
fi
+if ! which mysql_config > /dev/null 2>&1; then
+ AC_MSG_WARN([mysqlclient lib is required to build lket-b2a with database support.
+ no mysqlclient lib is found, skip building lket-b2a with database support...])
+fi
+
+
if test $build_elfutils = no; then
# Need libdwfl-capable recent elfutils from Fedora
save_LIBS="$LIBS"
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index 7341ae33..4cc33aa0 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,3 +1,12 @@
+2006-10-10 Li Guanglei <guanglei@cn.ibm.com>
+
+ * runtime/lket/b2a/Makefile.am: add the checking and optional
+ compiling for mysql client library
+ * runtime/lket/b2a/Makefile.in: regenerated
+ * runtime/lket/b2a/lket_b2a.c, runtime/lket/b2a/lket_b2a.h:
+ Adding the support of automatically database creation and
+ dumping lket trace into mysql database
+
2006-10-09 Josh Stone <joshua.i.stone@intel.com>
From David Wilder <dwilder@us.ibm.com>
diff --git a/runtime/lket/b2a/Makefile.am b/runtime/lket/b2a/Makefile.am
index dc8dbd92..1225ba95 100644
--- a/runtime/lket/b2a/Makefile.am
+++ b/runtime/lket/b2a/Makefile.am
@@ -1,6 +1,11 @@
bin_PROGRAMS = lket-b2a
lket_b2a_SOURCES = lket_b2a.c
lket_b2a_DEPENDENCIES = lket_b2a.h
-#b2a_LDADD = `pkg-config --libs glib-2.0`
lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0`
lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags glib-2.0`
+
+if HAS_MYSQL
+lket_b2a_LDFLAGS += `mysql_config --libs`
+lket_b2a_CFLAGS += `mysql_config --cflags`
+lket_b2a_CFLAGS += -DHAS_MYSQL
+endif
diff --git a/runtime/lket/b2a/Makefile.in b/runtime/lket/b2a/Makefile.in
index 6ed05c18..81765acd 100644
--- a/runtime/lket/b2a/Makefile.in
+++ b/runtime/lket/b2a/Makefile.in
@@ -35,6 +35,8 @@ NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
bin_PROGRAMS = lket-b2a$(EXEEXT)
+@HAS_MYSQL_TRUE@am__append_1 = `mysql_config --libs`
+@HAS_MYSQL_TRUE@am__append_2 = `mysql_config --cflags` -DHAS_MYSQL
subdir = runtime/lket/b2a
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -91,6 +93,8 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@
+HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@@ -154,9 +158,9 @@ sysconfdir = @sysconfdir@
target_alias = @target_alias@
lket_b2a_SOURCES = lket_b2a.c
lket_b2a_DEPENDENCIES = lket_b2a.h
-#b2a_LDADD = `pkg-config --libs glib-2.0`
-lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0`
-lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags glib-2.0`
+lket_b2a_LDFLAGS = `pkg-config --libs glib-2.0` $(am__append_1)
+lket_b2a_CFLAGS = -O2 -D_GNU_SOURCE -Wall `pkg-config --cflags \
+ glib-2.0` $(am__append_2)
all: all-am
.SUFFIXES:
diff --git a/runtime/lket/b2a/lket_b2a.c b/runtime/lket/b2a/lket_b2a.c
index f924dcfe..aedb7502 100644
--- a/runtime/lket/b2a/lket_b2a.c
+++ b/runtime/lket/b2a/lket_b2a.c
@@ -16,11 +16,26 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include "lket_b2a.h"
/* A flag indicate whether to store the trace
data into local file/MySQL database */
int into_file, into_db;
+
+#ifdef HAS_MYSQL
+
+#define SQLSIZE 1024*1024
+int sql_count;
+#define INSERT_THRESHOLD 100
+char sql[4096];
+char sqlStatement[SQLSIZE];
+char sql_col[1024];
+char sql_val[2048];
+
+MYSQL mysql;
+#endif
+
/* A FILE handle points to a local file used to
store the trace data */
FILE *outfp;
@@ -42,14 +57,9 @@ static long timing_method = TIMING_GETTIMEOFDAY;
static long long start_timestamp;
-/* Balanced binary search tree to store the
- mapping of <pid, process name> */
GTree *appNameTree;
-/*
- * default hook format table,
- * based on tapsets/hookid_defs.stp and other hook specific files
- */
+/* event table */
event_desc *events_des[MAX_EVT_TYPES][MAX_GRPID][MAX_HOOKID];
void usage()
@@ -69,25 +79,26 @@ int main(int argc, char *argv[])
int i, j, total_infiles = 0;
long long min;
- into_file = 1; into_db = 0;
+ char database[18];
+ time_t timer;
+ struct tm *tm;
+
+ time(&timer);
+ tm = localtime(&timer);
+ strftime(database, 18, "DB%Y%m%d%H%M%S", tm);
+// strcpy(database, "lgl");
- if(argc < 2) {
- printf("Usage: %s inputfile1 [inputfile2...]\n", argv[0]);
- return 1;
- }
-/*
while (1) {
int c = getopt(argc, argv, "mf");
if (c < 0) // no more options
break;
switch (c) {
case 'm':
- into_file = 0;
into_db = 1;
break;
case 'f':
into_file = 1;
- into_db = 0;
+ break;
default:
printf("Error in options\n");
usage();
@@ -95,10 +106,25 @@ int main(int argc, char *argv[])
break;
}
}
-*/
- total_infiles = argc - 1;
-
+#ifndef HAS_MYSQL
+ if(into_db) {
+ fprintf(stderr, "-m option is not supported since lket-b2a is not compiled with mysql support, \n");
+ exit(-1);
+ }
+#endif
+ if(into_file==0 && into_db==0) {
+#ifdef HAS_MYSQL
+ fprintf(stderr, "At least one of -m/-f option should be specified\n");
+#else
+ fprintf(stderr, "-f option must be specified\n");
+#endif
+ usage();
+ exit(-1);
+ }
+
+ total_infiles = argc - optind;
+
// open the input files and the output file
infps = (FILE **)malloc(total_infiles * sizeof(FILE *));
if(!infps) {
@@ -108,26 +134,52 @@ int main(int argc, char *argv[])
memset(infps, 0, total_infiles * sizeof(FILE *));
for(i=0; i < total_infiles; i++) {
- infps[i] = fopen(argv[i+1], "r");
+ infps[i] = fopen(argv[optind++], "r");
if(infps[i] == NULL) {
- printf("Unable to open %s\n", argv[i+1]);
+ printf("Unable to open %s\n", argv[optind-1]);
goto failed;
}
}
-
+
if(into_file) {
if(strnlen(outfilename, MAX_STRINGLEN) == 0)
strncpy(outfilename, DEFAULT_OUTFILE_NAME, MAX_STRINGLEN);
outfp = fopen(outfilename, "w");
if(outfp == NULL) {
- printf("Unable to create %s\n", outfilename);
+ fprintf(stderr,"Unable to create %s\n", outfilename);
goto failed;
}
}
-
/* create the search tree */
- appNameTree = g_tree_new_full(compareFunc, NULL, NULL, destroyAppName);
+ appNameTree = g_tree_new_full(compareFunc, NULL, NULL, destroyTreeData);
+
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(!mysql_init(&mysql)) {
+ fprintf(stderr, "Failed to Init MySQL: Error: %s\n",
+ mysql_error(&mysql));
+ }
+ if(!mysql_real_connect(&mysql, NULL, NULL, NULL, NULL, 0, NULL,
+ CLIENT_MULTI_STATEMENTS)) {
+ fprintf(stderr, "Failed to connect to database: Error: %s\n",
+ mysql_error(&mysql));
+ }
+
+ snprintf(sql, 64,"create database %s", database);
+
+ if(mysql_query(&mysql, sql)) {
+ fprintf(stderr, "Failed create database %s, Error: %s\n",
+ database, mysql_error(&mysql));
+ }
+ if(!mysql_real_connect(&mysql, NULL, NULL, NULL, database, 0, NULL,
+ CLIENT_MULTI_STATEMENTS)) {
+ fprintf(stderr, "Failed to connect to database %s: Error: %s\n",
+ database, mysql_error(&mysql));
+ }
+ }
+#endif
+
// find the lket header
find_init_header(infps, total_infiles);
@@ -165,8 +217,11 @@ int main(int argc, char *argv[])
// j is the next
if(min) {
if(HDR_GroupID(&hdrs[j])==_GROUP_REGEVT) {
- register_events(HDR_HookID(&hdrs[j]), infps[j],
- hdrs[j].sys_size);
+ if(HDR_HookID(&hdrs[j]) == _HOOKID_REGEVTDESC)
+ register_evt_desc(infps[j],hdrs[j].sys_size);
+ else
+ register_events(HDR_HookID(&hdrs[j]), infps[j],
+ hdrs[j].sys_size);
} else {
if(HDR_GroupID(&hdrs[j])==_GROUP_PROCESS &&
@@ -197,7 +252,7 @@ int main(int argc, char *argv[])
}
// update hdr[j]
#ifdef DEBUG_OUTPUT
- fprintf(outfp, "File %d, Offset: %ld\n", j, ftell(infps[j]));
+ fprintf(stderr, "File %d, Offset: %ld\n", j, ftell(infps[j]));
#endif
get_pkt_header(infps[j], &hdrs[j]);
}
@@ -227,19 +282,23 @@ failed:
if(hdrs)
free(hdrs);
+#ifdef HAS_MYSQL
+ if(into_db) {
+ mysql_close(&mysql);
+ }
+#endif
if (appNameTree)
g_tree_destroy(appNameTree);
-
+ //TODO: free entrytime tree
return 0;
}
/* register newly found process name for addevent.process.snapshot
and addevent.process.execve */
-///FIXME: MySQL??
void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
{
int pid;
- char *appname;
+ char *appname=NULL;
int count;
int len;
int c;
@@ -247,8 +306,22 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
len=0;
count=0;
- appname = (char *)malloc(1024);
+#ifdef HAS_MYSQL
+ static int flag = 0;
+ if(into_db) {
+ if(flag==0) {
+ if(mysql_query(&mysql, "create table appNameMap ( \
+ pid INT, pname varchar(20))")) {
+ fprintf(stderr, "Failed to create appNameMap table, Error: %s\n",
+ mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+ flag=1;
+ }
+#endif
+ appname = (char *)malloc(512);
location = ftell(fp);
if(HDR_HookID(phdr) ==1 ) { /* process_snapshot */
@@ -263,6 +336,17 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
++len;
}
appname[count]='\0';
+#ifdef HAS_MYSQL
+ if(into_db) {
+ snprintf(sql, 256, "insert into appNameMap values \
+ ( %d, \"%s\")", pid, appname);
+ if(mysql_query(&mysql,sql)) {
+ fprintf(stderr, "Failed to exec sql: %s, Error: %s\n",
+ sql, mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+#endif
//fseek(fp, 0-len, SEEK_CUR);
} else if (HDR_HookID(phdr) == 2) { /* process.execve */
fread(&pid, 1, 4, fp); /* read pid */
@@ -275,6 +359,17 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
++len;
}
appname[count]='\0';
+#ifdef HAS_MYSQL
+ if(into_db) {
+ snprintf(sql, 256,"insert into appNameMap values \
+ ( %d, \"%s\")", pid, appname);
+ if(mysql_query(&mysql,sql)) {
+ fprintf(stderr, "Failed to exec SQL: %s, Error: %s\n",
+ sql, mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+#endif
//fseek(fp, 0-len, SEEK_CUR);
} else {
free(appname);
@@ -287,21 +382,20 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
gint compareFunc(gconstpointer a, gconstpointer b, gpointer user_data)
{
- if((long)(a) > (long)(b)) return 1;
- else if ((long)(a) < (long)(b)) return -1;
- else return 0;
+ if((long)(a) > (long)(b)) return 1;
+ else if ((long)(a) < (long)(b)) return -1;
+ else return 0;
}
-void destroyAppName(gpointer data)
+void destroyTreeData(gpointer data)
{
- free(data);
+ free(data);
}
/*
* search the LKET init header in a set of input files,
* and the header structure is defined in tapsets/lket_trace.stp
*/
-//FIXME: need MySQL support
void find_init_header(FILE **infps, const int total_infiles)
{
int i, j, k;
@@ -315,6 +409,7 @@ void find_init_header(FILE **infps, const int total_infiles)
int8_t timing_field;
int8_t bits_width;
int32_t init_timebase;
+ char timing_methods_str[128];
if(total_infiles <= 0 )
return;
@@ -325,40 +420,64 @@ void find_init_header(FILE **infps, const int total_infiles)
if(magic == (int32_t)LKET_MAGIC) {
//found
j = i;
- fprintf(outfp, "LKET Magic:\t0x%X\n", magic);
+ if(into_file)
+ fprintf(outfp, "LKET Magic:\t0x%X\n", magic);
//read other content of lket_int_header
- if(fread(&inithdr_len, 1, sizeof(inithdr_len), infps[i]) < sizeof(inithdr_len))
+ if(fread(&inithdr_len, 1, sizeof(inithdr_len), infps[i])
+ < sizeof(inithdr_len))
break;
- fprintf(outfp, "InitHdrLen:\t%d\n", inithdr_len);
+ if(into_file)
+ fprintf(outfp, "InitHdrLen:\t%d\n", inithdr_len);
if(fread(&ver_major, 1, sizeof(ver_major), infps[i]) < sizeof(ver_major))
break;
- fprintf(outfp, "Version Major:\t%d\n", ver_major);
+ if(into_file)
+ fprintf(outfp, "Version Major:\t%d\n", ver_major);
if(fread(&ver_minor, 1, sizeof(ver_minor), infps[i]) < sizeof(ver_minor))
break;
- fprintf(outfp, "Version Minor:\t%d\n", ver_minor);
+ if(into_file)
+ fprintf(outfp, "Version Minor:\t%d\n", ver_minor);
if(fread(&big_endian, 1, sizeof(big_endian), infps[i]) < sizeof(big_endian))
break;
- fprintf(outfp, "Big endian:\t%s\n", big_endian ? "YES":"NO");
- if(fread(&timing_field, 1, sizeof(timing_field), infps[i]) < sizeof(timing_field))
+ if(into_file)
+ fprintf(outfp, "Big endian:\t%s\n", big_endian ? "YES":"NO");
+ if(fread(&timing_field, 1, sizeof(timing_field), infps[i])
+ < sizeof(timing_field))
break;
timing_method = timing_field;
- fprintf(outfp, "Timing method:\t");
+ if(into_file)
+ fprintf(outfp, "Timing method:\t");
switch(timing_method) {
case TIMING_GETCYCLES:
- fprintf(outfp, "get_cycles()\n"); break;
+ snprintf(timing_methods_str, 128, "get_cycles");
+ if(into_file)
+ fprintf(outfp, "get_cycles()\n");
+ break;
case TIMING_GETTIMEOFDAY:
- fprintf(outfp, "do_gettimeofday()\n"); break;
+ snprintf(timing_methods_str, 128,"do_gettimeofday");
+ if(into_file)
+ fprintf(outfp, "do_gettimeofday()\n");
+ break;
case TIMING_SCHEDCLOCK:
- fprintf(outfp, "sched_clock()\n"); break;
+ snprintf(timing_methods_str, 128, "sched_clock");
+ if(into_file)
+ fprintf(outfp, "sched_clock()\n");
+ break;
default:
- fprintf(outfp, "Unsupported timging method\n");
+ snprintf(timing_methods_str,128,
+ "Unsupported timing method");
+ if(into_file)
+ fprintf(outfp, "Unsupported timging method\n");
}
if(fread(&bits_width, 1, sizeof(bits_width), infps[i]) < sizeof(bits_width))
break;
- fprintf(outfp, "Bits width:\t%d\n", bits_width);
- if(fread(&init_timebase, 1, sizeof(init_timebase), infps[i]) < sizeof(init_timebase))
+ if(into_file)
+ fprintf(outfp, "Bits width:\t%d\n", bits_width);
+ if(fread(&init_timebase, 1, sizeof(init_timebase), infps[i])
+ < sizeof(init_timebase))
break;
- fprintf(outfp, "Initial CPU timebase:\t%d (cycles per microsecond)\n",
+ if(into_file)
+ fprintf(outfp,
+ "Initial CPU timebase:\t%d (cycles per microsecond)\n",
init_timebase);
if(timing_method == TIMING_GETCYCLES) {
for(k = 0; k < MAX_CPUS; k++)
@@ -367,6 +486,27 @@ void find_init_header(FILE **infps, const int total_infiles)
break;
}
}
+
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(mysql_query(&mysql, "create table trace_header \
+ ( Major_Ver TINYINT, Minor_Ver TINYINT, \
+ Big_Endian TINYINT, Timing_Method varchar(20), \
+ Bits_Width TINYINT)" )) {
+ fprintf(stderr, "Failed to create trace_header table, Error: %s\n",
+ mysql_error(&mysql));
+ exit(-1);
+ }
+ snprintf(sql, 256, "insert into trace_header value ( %d, %d, %d, \"%s\", %d )",
+ ver_major, ver_minor, big_endian, timing_methods_str, bits_width);
+
+ if(mysql_query(&mysql, sql)) {
+ fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
+ sql, mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+#endif
for(i=0; i<total_infiles && i!=j; i++)
fseek(infps[i], 0LL, SEEK_SET);
return;
@@ -375,7 +515,6 @@ void find_init_header(FILE **infps, const int total_infiles)
/*
* read the lket_pkt_header structure at the begining of the input file
*/
-///FIXME: MySQL
int get_pkt_header(FILE *fp, lket_pkt_header *phdr)
{
if(fread(phdr, 1, sizeof(lket_pkt_header), fp) < sizeof(lket_pkt_header))
@@ -391,15 +530,13 @@ bad:
return -1;
}
-/*
- * print the lket_pkt_header structure into the output file
- */
-void print_pkt_header(FILE *fp, lket_pkt_header *phdr)
+void print_pkt_header(lket_pkt_header *phdr)
{
long long usecs;
int sec, usec;
+ int grpid, hookid, pid;
- if(!fp || !phdr)
+ if(!phdr)
return;
if(timing_method == TIMING_GETCYCLES)
@@ -412,17 +549,102 @@ void print_pkt_header(FILE *fp, lket_pkt_header *phdr)
sec = usecs/1000000;
usec = usecs%1000000;
-
- fprintf(fp, "\n%d.%d APPNAME: %s PID:%d CPU:%d HOOKGRP:%d HOOKID:%d -- ",
- sec, usec,
- (char *)(g_tree_lookup(appNameTree, (gconstpointer)((long)HDR_PID(phdr)))),
- HDR_PID(phdr),
- HDR_CpuID(phdr),
- HDR_GroupID(phdr),
- HDR_HookID(phdr));
+
+ grpid = HDR_GroupID(phdr);
+ hookid = HDR_HookID(phdr);
+ pid = HDR_PID(phdr);
+
+ if(into_file)
+ fprintf(outfp, "\n%d.%d APPNAME: %s PID:%d CPU:%d HOOKGRP:%d HOOKID:%d ",
+ sec, usec,
+ (char *)(g_tree_lookup(appNameTree, (gconstpointer)((long)pid))),
+ pid, HDR_CpuID(phdr), grpid, hookid);
+
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(!(hookid%2)) { // return type event
+ long long *entrytime;
+ long long entryusecs;
+ entrytime = g_tree_lookup(events_des[1][grpid][hookid-1]->entrytime,
+ (gconstpointer)((long)pid));
+ if(entrytime==NULL) // key not found
+ entryusecs = 0;
+ else
+ entryusecs = *entrytime;
+ snprintf(sql_col, 64, "groupid, hookid, usec, process_id, \
+ cpu_id, entry_usec,");
+ snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, %lld,", grpid,
+ hookid, usecs, pid, HDR_CpuID(phdr),
+ entryusecs);
+ } else {
+ snprintf(sql_col, 64, "groupid, hookid, usec, process_id, cpu_id,");
+ snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, ", grpid,
+ hookid, usecs, pid, HDR_CpuID(phdr));
+ }
+ if(hookid%2) {
+ //(events_des[1][grpid][hookid]->entrytime)[pid] = usecs;
+ char *entrytime = malloc(sizeof(long long));
+ *((long long *)entrytime) = usecs;
+ g_tree_insert(events_des[1][grpid][hookid]->entrytime,
+ (gpointer)((long)pid), (gpointer)entrytime);
+ }
+ }
+#endif
+
+}
+
+#ifdef HAS_MYSQL
+char *get_sqltype(char *fmt)
+{
+ if(strncmp(fmt, "INT8", 4) == 0)
+ return "TINYINT";
+ if(strncmp(fmt, "INT16", 5) == 0)
+ return "SMALLINT";
+ if(strncmp(fmt, "INT32", 5) == 0)
+ return "INT";
+ if(strncmp(fmt, "INT64", 5) == 0)
+ return "BIGINT";
+ if(strncmp(fmt, "STRING", 6) == 0)
+ return "VARCHAR(20)";
+ return "";
+}
+#endif
+
+void register_evt_desc(FILE *infp, size_t size)
+{
+ static int has_table = 0;
+ int grpid, hookid;
+ char *evt_body;
+ evt_body = malloc(size);
+ fread(evt_body, size, 1, infp);
+ grpid = *(int8_t *)evt_body;
+ hookid = *(int8_t *)(evt_body+1);
+
+ if(!events_des[1][grpid][hookid])
+ events_des[1][grpid][hookid] = malloc(sizeof(event_desc));
+ events_des[1][grpid][hookid]->entrytime = g_tree_new_full(
+ compareFunc, NULL, NULL, destroyTreeData);
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(!has_table) {
+ snprintf(sql, 1024, "create table table_desc ( table_name \
+ varchar(6), table_desc varchar(32))");
+ has_table = 1;
+ } else {
+ snprintf(sql, 1024, "insert into table_desc ( table_name,\
+ table_desc) values ( \"%d_%d\", \"%s\")", grpid, hookid,
+ evt_body+2);
+ }
+ if(mysql_query(&mysql, sql)) {
+ fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
+ sql, mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+#endif
+ free(evt_body);
}
-///FIXME: MySQL
void register_events(int evt_type, FILE *infp, size_t size)
{
int cnt=0, len=0;
@@ -436,7 +658,39 @@ void register_events(int evt_type, FILE *infp, size_t size)
grpid = *(int8_t *)evt_body;
hookid = *(int8_t *)(evt_body+1);
-
+
+ if(!events_des[evt_type][grpid][hookid])
+ events_des[evt_type][grpid][hookid] = malloc(sizeof(event_desc));
+ if(!events_des[evt_type][grpid][hookid]) {
+ fprintf(stderr, "error when malloc for event_des[%d][%d][%d]\n",
+ evt_type, grpid, hookid);
+ }
+
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(evt_type==1) { /* if sys event, create a table */
+ if(!(hookid%2)) {/* if this is a return type event, should record
+ the entry time of this event */
+ snprintf(sql, 1024, "create table %d_%d \
+ ( groupid TINYINT, hookid TINYINT, usec BIGINT,\
+ process_id INT, cpu_id TINYINT, \
+ entry_usec BIGINT,", grpid, hookid);
+ } else {
+ snprintf(sql, 1024, "create table %d_%d \
+ ( groupid TINYINT, hookid TINYINT, \
+ usec BIGINT, process_id INT, \
+ cpu_id TINYINT,", grpid, hookid);
+ }
+ }
+ if(evt_type==2) { /* if user event, alter an existing table */
+ snprintf(sql, 1024, "alter table %d_%d ", grpid, hookid);
+ }
+ }
+#endif
+
+ if(size == 2) // skip if no event format is provided
+ goto gen_sql;
+
evt_fmt = evt_body+2;
for(tmp=evt_fmt; *tmp!=0; tmp++);
@@ -451,11 +705,29 @@ void register_events(int evt_type, FILE *infp, size_t size)
exit(-1);
}
- events_des[evt_type][grpid][hookid] = malloc(sizeof(event_desc));
-
while(fmt!=NULL && name!=NULL) {
+#ifdef HAS_MYSQL
+ if(into_db) {
+ if(evt_type==1) {
+ strcat(sql, "`");
+ strcat(sql, name);
+ strcat(sql, "` ");
+ strcat(sql, get_sqltype(fmt));
+ strcat(sql, ",");
+ }
+ if(evt_type==2) {
+ strcat(sql, "add ");
+ strcat(sql, "`");
+ strcat(sql, name);
+ strcat(sql, "` ");
+ strcat(sql, get_sqltype(fmt));
+ strcat(sql, ",");
+ }
+ }
+#endif
strncpy(events_des[evt_type][grpid][hookid]->evt_fmt[cnt], fmt, 7);
- strncpy(events_des[evt_type][grpid][hookid]->evt_names[cnt], name, 64);
+ strncpy(events_des[evt_type][grpid][hookid]->evt_names[cnt],
+ name, MAX_FIELDNAME_LEN);
strncpy(events_des[evt_type][grpid][hookid]->fmt+len, get_fmtstr(fmt), 8);
len+=strlen(get_fmtstr(fmt));
fmt = strsep(&evt_fmt, ":");
@@ -464,6 +736,22 @@ void register_events(int evt_type, FILE *infp, size_t size)
}
events_des[evt_type][grpid][hookid]->count = cnt;
*(events_des[evt_type][grpid][hookid]->fmt+len)='\0';
+
+#ifdef HAS_MYSQL
+gen_sql:
+ if(into_db) {
+ if(evt_type==1)
+ sql[strlen(sql)-1]=')';
+ if(evt_type==2)
+ sql[strlen(sql)-1]='\0';
+
+ if(mysql_query(&mysql, sql)) {
+ fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
+ sql, mysql_error(&mysql));
+ exit(-1);
+ }
+ }
+#endif
free(evt_body);
}
@@ -482,7 +770,6 @@ char *get_fmtstr(char *fmt)
return "";
}
-///FIXME: MySQL
int dump_data(lket_pkt_header header, FILE *infp)
{
int i, c, j;
@@ -494,11 +781,13 @@ int dump_data(lket_pkt_header header, FILE *infp)
int size = 0;
int evt_num = 1;
+ char tmp_int[32];
+
char *fmt, *name, *buffer;
int grpid = HDR_GroupID(&header);
int hookid = HDR_HookID(&header);
- print_pkt_header(outfp, &header);
+ print_pkt_header(&header);
/* if the data contains user appended extra data */
if(header.total_size != header.sys_size)
@@ -514,13 +803,13 @@ int dump_data(lket_pkt_header header, FILE *infp)
if(j == 2) /* if current one is a user event */
size = header.total_size - header.sys_size;
- if((events_des[j][grpid][hookid] == NULL) ||
- (events_des[j][grpid][hookid]->count <= 0 || !outfp) ||
- (events_des[j][grpid][hookid]->evt_fmt[0][0] == '\0')) {
+ if(into_file && (events_des[j][grpid][hookid] == NULL ||
+ events_des[j][grpid][hookid]->count <= 0)) {
//no format is provided, dump in hex
buffer = malloc(size);
fread(buffer, size, 1, infp);
fwrite(buffer, size, 1, outfp);
+ free(buffer);
total_bytes += size;
continue;
}
@@ -528,41 +817,123 @@ int dump_data(lket_pkt_header header, FILE *infp)
for(i=0; i<events_des[j][grpid][hookid]->count; i++) {
fmt = events_des[j][grpid][hookid]->evt_fmt[i];
name = events_des[j][grpid][hookid]->evt_names[i];
- fwrite(name, strlen(name), 1, outfp);
- fwrite(":", 1, 1, outfp);
+#ifdef HAS_MYSQL
+ if(into_db) {
+ strcat(sql_col, "`");
+ strcat(sql_col, name);
+ strcat(sql_col, "`,");
+ }
+#endif
+
+ if(into_file) {
+ fwrite(name, strlen(name), 1, outfp);
+ fwrite(":", 1, 1, outfp);
+ }
if(strncmp(fmt, "INT8", 4)==0) {
c = fgetc_unlocked(infp);
- fprintf(outfp, "%d,", (int8_t)c);
+ if(into_file)
+ fprintf(outfp, "%d,", (int8_t)c);
+ sprintf(tmp_int, "%d,", (int8_t)c);
+#ifdef HAS_MYSQL
+ if(into_db)
+ strcat(sql_val, tmp_int);
+#endif
readbytes+=1;
} else if(strncmp(fmt, "INT16", 5)==0) {
fread(&stemp, 2, 1, infp);
- fprintf(outfp, "%d,", (int16_t)stemp);
+ if(into_file)
+ fprintf(outfp, "%d,", (int16_t)stemp);
+ sprintf(tmp_int, "%d,", (int16_t)stemp);
+#ifdef HAS_MYSQL
+ if(into_db)
+ strcat(sql_val, tmp_int);
+#endif
readbytes+=2;
} else if(strncmp(fmt, "INT32", 5)==0) {
fread(&ntemp, 4, 1, infp);
- fprintf(outfp, "%d,", (int32_t)ntemp);
+ if(into_file)
+ fprintf(outfp, "%d,", (int32_t)ntemp);
+ snprintf(tmp_int, 20, "%d,", (int32_t)ntemp);
+#ifdef HAS_MYSQL
+ if(into_db)
+ strcat(sql_val, tmp_int);
+#endif
readbytes+=4;
} else if(strncmp(fmt, "INT64", 5)==0) {
fread(&lltemp, 8, 1, infp);
- fprintf(outfp, "%lld,",lltemp);
+ if(into_file)
+ fprintf(outfp, "%lld,",lltemp);
+ snprintf(tmp_int, 30, "%lld,", lltemp);
+#ifdef HAS_MYSQL
+ if(into_db)
+ strcat(sql_val, tmp_int);
+#endif
readbytes+=8;
} else if(strncmp(fmt, "STRING", 6)==0) {
+
+#ifdef HAS_MYSQL
+ int tmplen=0;
+ if(into_db) {
+ tmplen=strlen(sql_val);
+ sql_val[tmplen++]='"';
+ }
+#endif
c = fgetc_unlocked(infp);
++readbytes;
while (c && readbytes < size) {
- fputc_unlocked(c, outfp);
+ if(into_file)
+ fputc_unlocked(c, outfp);
+#ifdef HAS_MYSQL
+ if(into_db)
+ sql_val[tmplen++]=c;
+#endif
c = fgetc_unlocked(infp);
++readbytes;
}
if(!c) {
- fputc_unlocked(',', outfp);
+ if(into_file)
+ fputc_unlocked(',', outfp);
+#ifdef HAS_MYSQL
+ if(into_db) {
+ sql_val[tmplen++]='"';
+ sql_val[tmplen++]=',';
+ sql_val[tmplen]='\0';
+ }
+#endif
continue;
}
- else
+ else {
return -1;
+ }
}
}
total_bytes += readbytes;
}
+
+#ifdef HAS_MYSQL
+ if(into_db) {
+ sql_col[strlen(sql_col)-1] = '\0';
+ sql_val[strlen(sql_val)-1] = '\0';
+ snprintf(sql, 1024, "insert into %d_%d (%s) values (%s)",
+ grpid, hookid, sql_col, sql_val);
+
+ if(sql_count >= INSERT_THRESHOLD) {
+ if(mysql_query(&mysql, sqlStatement)) {
+ fprintf(stderr, "Failed exec SQL:\n%s\n, Error:\n%s\n",
+ sqlStatement, mysql_error(&mysql));
+ exit(-1);
+ }
+ while(!mysql_next_result(&mysql));
+ sql_count=0;
+ sqlStatement[0]='\0';
+ } else {
+ //strncpy(sqlStatement, sql, 2048);
+ strcat(sqlStatement, sql);
+ strcat(sqlStatement, ";");
+ sql_count++;
+ }
+ }
+#endif
+
return total_bytes;
}
diff --git a/runtime/lket/b2a/lket_b2a.h b/runtime/lket/b2a/lket_b2a.h
index abb9eb53..8212ef62 100644
--- a/runtime/lket/b2a/lket_b2a.h
+++ b/runtime/lket/b2a/lket_b2a.h
@@ -1,138 +1,47 @@
#ifndef _LKET_B2A_H
#define _LKET_B2A_H
+
#include <glib.h>
+#ifdef HAS_MYSQL
+#include "/usr/include/mysql/mysql.h"
+#endif
+
#define LKET_MAGIC 0xAEFCDB6B
#define MAX_STRINGLEN 256
-#define APPNAMELIST_LEN 256
-
-#define SEQID_SIZE 4
-
-#define EVT_SYS 1
-#define EVT_USER 2
-
#define MAX_GRPID 255
#define MAX_HOOKID 255
#define MAX_EVT_TYPES 2
#define DEFAULT_OUTFILE_NAME "lket.out"
-
/* Group ID Definitions */
int _GROUP_REGEVT = 1;
-int _GROUP_SYSCALL = 2;
int _GROUP_PROCESS = 3;
-int _GROUP_IOSCHED = 4;
-int _GROUP_TASK = 5;
-int _GROUP_SCSI = 6;
-int _GROUP_PAGEFAULT = 7;
-int _GROUP_NETDEV = 8;
-int _GROUP_IOSYSCALL = 9;
-int _GROUP_AIO = 10;
int _GROUP_CPUFREQ = 15;
/* hookIDs defined inside each group */
int _HOOKID_REGSYSEVT = 1;
-int _HOOKID_REGUSREVT = 2;
-
-int _HOOKID_SYSCALL_ENTRY = 1;
-int _HOOKID_SYSCALL_RETURN = 2;
+int _HOOKID_REGUSREVT = 3;
+int _HOOKID_REGEVTDESC = 5;
int _HOOKID_PROCESS_SNAPSHOT = 1;
-int _HOOKID_PROCESS_EXECVE = 2;
-int _HOOKID_PROCESS_FORK = 3;
-
-int _HOOKID_IOSCHED_NEXT_REQ = 1;
-int _HOOKID_IOSCHED_ADD_REQ = 2;
-int _HOOKID_IOSCHED_REMOVE_REQ = 3;
-
-int _HOOKID_TASK_CTXSWITCH = 1;
-int _HOOKID_TASK_CPUIDLE = 2;
-
-int _HOOKID_SCSI_IOENTRY = 1;
-int _HOOKID_SCSI_IO_TO_LLD = 2;
-int _HOOKID_SCSI_IODONE_BY_LLD = 3;
-int _HOOKID_SCSI_IOCOMP_BY_MIDLEVEL = 4;
-
-int _HOOKID_PAGEFAULT = 1;
-
-int _HOOKID_NETDEV_RECEIVE = 1;
-int _HOOKID_NETDEV_TRANSMIT = 2;
-
-int _HOOKID_IOSYSCALL_OPEN_ENTRY = 1;
-int _HOOKID_IOSYSCALL_OPEN_RETURN = 2;
-
-int _HOOKID_IOSYSCALL_CLOSE_ENTRY = 3;
-int _HOOKID_IOSYSCALL_CLOSE_RETURN = 4;
-
-int _HOOKID_IOSYSCALL_READ_ENTRY = 5;
-int _HOOKID_IOSYSCALL_READ_RETURN = 6;
-
-int _HOOKID_IOSYSCALL_WRITE_ENTRY = 7;
-int _HOOKID_IOSYSCALL_WRITE_RETURN = 8;
+int _HOOKID_PROCESS_EXECVE = 3;
+int _HOOKID_PROCESS_FORK = 5;
-int _HOOKID_IOSYSCALL_READV_ENTRY = 9;
-int _HOOKID_IOSYSCALL_READV_RETURN = 10;
-
-int _HOOKID_IOSYSCALL_WRITEV_ENTRY = 11;
-int _HOOKID_IOSYSCALL_WRITEV_RETURN = 12;
-
-int _HOOKID_IOSYSCALL_PREAD64_ENTRY = 13;
-int _HOOKID_IOSYSCALL_PREAD64_RETURN = 14;
-
-int _HOOKID_IOSYSCALL_PWRITE64_ENTRY = 15;
-int _HOOKID_IOSYSCALL_PWRITE64_RETURN = 16;
-
-int _HOOKID_IOSYSCALL_READAHEAD_ENTRY = 17;
-int _HOOKID_IOSYSCALL_READAHEAD_RETURN = 18;
-
-int _HOOKID_IOSYSCALL_SENDFILE_ENTRY = 19;
-int _HOOKID_IOSYSCALL_SENDFILE_RETURN = 20;
-
-int _HOOKID_IOSYSCALL_LSEEK_ENTRY = 21;
-int _HOOKID_IOSYSCALL_LSEEK_RETURN = 22;
-
-int _HOOKID_IOSYSCALL_LLSEEK_ENTRY = 23;
-int _HOOKID_IOSYSCALL_LLSEEK_RETURN = 24;
-
-int _HOOKID_IOSYSCALL_SYNC_ENTRY = 25;
-int _HOOKID_IOSYSCALL_SYNC_RETURN = 26;
-
-int _HOOKID_IOSYSCALL_FSYNC_ENTRY = 27;
-int _HOOKID_IOSYSCALL_FSYNC_RETURN = 28;
-
-int _HOOKID_IOSYSCALL_FDATASYNC_ENTRY = 29;
-int _HOOKID_IOSYSCALL_FDATASYNC_RETURN = 30;
-
-int _HOOKID_IOSYSCALL_FLOCK_ENTRY = 31;
-int _HOOKID_IOSYSCALL_FLOCK_RETURN = 32;
-
-int _HOOKID_AIO_IO_SETUP_ENTRY = 1;
-int _HOOKID_AIO_IO_SETUP_RETURN = 2;
-int _HOOKID_AIO_IO_SUBMIT_ENTRY = 3;
-int _HOOKID_AIO_IO_SUBMIT_RETURN = 4;
-int _HOOKID_AIO_IO_SUBMIT_ONE_ENTRY = 5;
-int _HOOKID_AIO_IO_SUBMIT_ONE_RETURN = 6;
-int _HOOKID_AIO_IO_GETEVENTS_ENTRY = 7;
-int _HOOKID_AIO_IO_GETEVENTS_RETURN = 8;
-int _HOOKID_AIO_IO_DESTROY_ENTRY = 9;
-int _HOOKID_AIO_IO_DESTROY_RETURN = 10;
-int _HOOKID_AIO_IO_CANCEL_ENTRY = 11;
-int _HOOKID_AIO_IO_CANCEL_RETURN = 12;
-
-int _HOOKID_INIT_CPUFREQ = 1;
-int _HOOKID_SWITCH_CPUFREQ = 2;
+//int _HOOKID_INIT_CPUFREQ = 1;
+int _HOOKID_SWITCH_CPUFREQ = 1;
typedef struct _lket_pkt_header {
int16_t total_size;
int16_t sys_size;
int64_t microsecond;
/* aggr is the bit-OP of:
- (int64_t)current->pid << 32 |
- (int32_t)GroupID << 24 | (int32_t)hookID << 16 |
- (int16_t)current->thread_info->cpu << 8
+ (int64_t)current->pid << 32 |
+ (int32_t)GroupID << 24 | (int32_t)hookID << 16 |
+ (int16_t)current->thread_info->cpu << 8
*/
int64_t aggr;
} __attribute__((packed)) lket_pkt_header;
@@ -142,19 +51,17 @@ typedef struct _lket_pkt_header {
#define HDR_HookID(ptr) (int8_t)(((ptr)->aggr)>>16)
#define HDR_CpuID(ptr) (int8_t)(((ptr)->aggr)>>8)
-typedef struct _appname_info {
- int pid;
- int ppid;
- int tid;
- long index;
- struct _appname_info *next;
-} appname_info;
+#define MAX_FIELDS 32 /* max fields in a record */
+#define MAX_FIELDNAME_LEN 16 /* max len of a field */
typedef struct {
- char evt_fmt[256][7]; /* e.g. INT8,STRING,INT16,... */
- char evt_names[256][64]; /* e.g. protocal,dev_name,buff_len,... */
+#ifdef HAS_MYSQL
+ GTree *entrytime;
+#endif
+ char evt_fmt[MAX_FIELDS][7]; /* e.g. INT8,STRING,INT16,... */
+ char evt_names[MAX_FIELDS][MAX_FIELDNAME_LEN]; /* e.g. protocal,dev_name,buff_len,... */
char fmt[256]; /* e.g. %1b,%0s,%2b,... */
- int count;
+ int count; /* # of fields */
} event_desc;
/*
@@ -170,13 +77,14 @@ static int get_pkt_header(FILE *fp, lket_pkt_header *phdr);
/*
* print the lket_pkt_header structure into the output file
*/
-static void print_pkt_header(FILE *fp, lket_pkt_header *phdr);
+static void print_pkt_header(lket_pkt_header *phdr);
void register_appname(int i, FILE *fp, lket_pkt_header *phdr);
gint compareFunc(gconstpointer a, gconstpointer b, gpointer user_data);
-void destroyAppName(gpointer data);
-
+void destroyTreeData(gpointer data);
+void register_evt_desc(FILE *infp, size_t size);
void register_events(int evt_type, FILE *infp, size_t size);
int dump_data(lket_pkt_header header, FILE *infp);
char *get_fmtstr(char *fmt);
+
#endif
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index 9d69cf3b..88f4054a 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -80,6 +80,8 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+HAS_MYSQL_FALSE = @HAS_MYSQL_FALSE@
+HAS_MYSQL_TRUE = @HAS_MYSQL_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@