From 1d597550379cb00832f73bd5402918fd6ed2e9df Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Wed, 25 Nov 2009 15:57:01 -0500 Subject: [PATCH] Move some functions around to improve overall structure Signed-off-by: Benjamin Poirier --- lttv/lttv/Makefile.am | 1 + lttv/lttv/sync/event_analysis_chull.c | 2 +- lttv/lttv/sync/event_analysis_eval.c | 4 +- lttv/lttv/sync/event_matching_broadcast.c | 2 +- lttv/lttv/sync/event_matching_tcp.c | 2 +- lttv/lttv/sync/graph_functions.c | 97 +++++++++++++ lttv/lttv/sync/graph_functions.h | 2 + lttv/lttv/sync/sync_chain.c | 123 ++++++++++++++++ lttv/lttv/sync/sync_chain.h | 1 - lttv/lttv/sync/sync_chain_lttv.c | 164 +--------------------- lttv/modules/text/sync_chain_batch.c | 27 +--- 11 files changed, 230 insertions(+), 195 deletions(-) create mode 100644 lttv/lttv/sync/sync_chain.c diff --git a/lttv/lttv/Makefile.am b/lttv/lttv/Makefile.am index d468e7ed..e98dcbf4 100644 --- a/lttv/lttv/Makefile.am +++ b/lttv/lttv/Makefile.am @@ -55,6 +55,7 @@ lttv_real_SOURCES = \ traceset.c\ filter.c\ print.c\ + sync/sync_chain.c\ sync/sync_chain_lttv.c\ sync/graph_functions.c\ sync/data_structures.c\ diff --git a/lttv/lttv/sync/event_analysis_chull.c b/lttv/lttv/sync/event_analysis_chull.c index c080235c..b89f89ca 100644 --- a/lttv/lttv/sync/event_analysis_chull.c +++ b/lttv/lttv/sync/event_analysis_chull.c @@ -192,7 +192,7 @@ static void openGraphFiles(SyncState* const syncState) analysisData= (AnalysisDataCHull*) syncState->analysisData; - cwd= changeToGraphDir(syncState->graphsDir); + cwd= changeToGraphsDir(syncState->graphsDir); analysisData->graphsData->hullPoints= malloc(syncState->traceNb * sizeof(FILE**)); diff --git a/lttv/lttv/sync/event_analysis_eval.c b/lttv/lttv/sync/event_analysis_eval.c index 88d732bb..29b1b449 100644 --- a/lttv/lttv/sync/event_analysis_eval.c +++ b/lttv/lttv/sync/event_analysis_eval.c @@ -309,7 +309,7 @@ static AnalysisHistogramEval* constructAnalysisHistogramEval(const char* const convertIP(saddr, rttKey->saddr); convertIP(daddr, rttKey->daddr); - cwd= changeToGraphDir(graphsDir); + cwd= changeToGraphsDir(graphsDir); for (i= 0; i < sizeof(loopValues) / sizeof(*loopValues); i++) { @@ -1846,7 +1846,7 @@ static void writeAnalysisTraceTimeBackPlotsEval(SyncState* const syncState, snprintf(fileName, 40, "analysis_eval_accuracy-%03u_and_%03u.data", i, j); fileName[sizeof(fileName) - 1]= '\0'; - cwd= changeToGraphDir(syncState->graphsDir); + cwd= changeToGraphsDir(syncState->graphsDir); if ((fp= fopen(fileName, "w")) == NULL) { diff --git a/lttv/lttv/sync/event_matching_broadcast.c b/lttv/lttv/sync/event_matching_broadcast.c index ff45a8a7..1f3ec560 100644 --- a/lttv/lttv/sync/event_matching_broadcast.c +++ b/lttv/lttv/sync/event_matching_broadcast.c @@ -369,7 +369,7 @@ static void openGraphDataFiles(SyncState* const syncState) MatchingGraphsBroadcast* graphs= ((MatchingDataBroadcast*) syncState->matchingData)->graphs; - cwd= changeToGraphDir(syncState->graphsDir); + cwd= changeToGraphsDir(syncState->graphsDir); graphs->accuracyPoints= malloc(syncState->traceNb * sizeof(FILE**)); graphs->pointsNb= malloc(syncState->traceNb * sizeof(unsigned int*)); diff --git a/lttv/lttv/sync/event_matching_tcp.c b/lttv/lttv/sync/event_matching_tcp.c index e9cdce92..8d4d8e32 100644 --- a/lttv/lttv/sync/event_matching_tcp.c +++ b/lttv/lttv/sync/event_matching_tcp.c @@ -586,7 +586,7 @@ static void openGraphDataFiles(SyncState* const syncState) matchingData= (MatchingDataTCP*) syncState->matchingData; - cwd= changeToGraphDir(syncState->graphsDir); + cwd= changeToGraphsDir(syncState->graphsDir); matchingData->messagePoints= malloc(syncState->traceNb * sizeof(FILE**)); for (i= 0; i < syncState->traceNb; i++) diff --git a/lttv/lttv/sync/graph_functions.c b/lttv/lttv/sync/graph_functions.c index 48b66a3c..6bd28b80 100644 --- a/lttv/lttv/sync/graph_functions.c +++ b/lttv/lttv/sync/graph_functions.c @@ -21,6 +21,9 @@ #endif #include +#include +#include +#include #include #include @@ -28,6 +31,100 @@ #include "graph_functions.h" +/* + * Create the directory used to hold graphs and the header of the gnuplot + * script. + * + * Args: + * graphsDir: name of directory + * + * Returns: + * The current working directory before the execution of the function. The + * string must be free'd by the caller. + */ +FILE* createGraphsDir(const char* const graphsDir) +{ + char* cwd; + int graphsFp; + FILE* result; + int retval; + + cwd= changeToGraphsDir(graphsDir); + + if ((graphsFp= open("graphs.gnu", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | + S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH + | S_IWOTH | S_IXOTH)) == -1) + { + g_error(strerror(errno)); + } + if ((result= fdopen(graphsFp, "w")) == NULL) + { + g_error(strerror(errno)); + } + + fprintf(result, + "#!/usr/bin/gnuplot\n\n" + "set terminal postscript eps color size 8in,6in\n"); + + retval= chdir(cwd); + if (retval == -1) + { + g_error(strerror(errno)); + } + free(cwd); + + return result; +} + + +/* + * Change to the directory used to hold graphs. Create it if necessary. + * + * Args: + * graphsDir: name of directory + * + * Returns: + * The current working directory before the execution of the function. The + * string must be free'd by the caller. + */ +char* changeToGraphsDir(const char* const graphsDir) +{ + int retval; + char* cwd; + + cwd= getcwd(NULL, 0); + if (cwd == NULL) + { + g_error(strerror(errno)); + } + while ((retval= chdir(graphsDir)) != 0) + { + if (errno == ENOENT) + { + retval= mkdir(graphsDir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | + S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); + if (retval != 0) + { + g_error(strerror(errno)); + } + } + else + { + g_error(strerror(errno)); + } + } + + return cwd; +} + + +/* + * Call each graph variable, option and plot line function of each module to + * produce a gnuplot script. + * + * Args: + * syncState: container for synchronization data + */ void writeGraphsScript(SyncState* const syncState) { unsigned int i, j, k, l, m; diff --git a/lttv/lttv/sync/graph_functions.h b/lttv/lttv/sync/graph_functions.h index 55f9a13b..65517088 100644 --- a/lttv/lttv/sync/graph_functions.h +++ b/lttv/lttv/sync/graph_functions.h @@ -42,6 +42,8 @@ typedef struct } GraphFunctions; +FILE* createGraphsDir(const char* const graphsDir); +char* changeToGraphsDir(const char* const graphsDir); void writeGraphsScript(struct _SyncState* const syncState); #endif diff --git a/lttv/lttv/sync/sync_chain.c b/lttv/lttv/sync/sync_chain.c new file mode 100644 index 00000000..30593508 --- /dev/null +++ b/lttv/lttv/sync/sync_chain.c @@ -0,0 +1,123 @@ +/* This file is part of the Linux Trace Toolkit viewer + * Copyright (C) 2009 Benjamin Poirier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License Version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "sync_chain.h" + + +GQueue processingModules= G_QUEUE_INIT; +GQueue matchingModules= G_QUEUE_INIT; +GQueue analysisModules= G_QUEUE_INIT; +GQueue moduleOptions= G_QUEUE_INIT; + + +/* + * Calculate the elapsed time between two timeval values + * + * Args: + * end: end time, result is also stored in this structure + * start: start time + */ +void timeDiff(struct timeval* const end, const struct timeval* const start) +{ + if (end->tv_usec >= start->tv_usec) + { + end->tv_sec-= start->tv_sec; + end->tv_usec-= start->tv_usec; + } + else + { + end->tv_sec= end->tv_sec - start->tv_sec - 1; + end->tv_usec= end->tv_usec - start->tv_usec + 1e6; + } +} + + +/* + * A GCompareFunc for g_slist_find_custom() + * + * Args: + * a: ProcessingModule*, element's data + * b: char*, user data to compare against + * + * Returns: + * 0 if the processing module a's name is b + */ +gint gcfCompareProcessing(gconstpointer a, gconstpointer b) +{ + const ProcessingModule* processingModule; + const char* name; + + processingModule= (const ProcessingModule*) a; + name= (const char*) b; + + return strncmp(processingModule->name, name, + strlen(processingModule->name) + 1); +} + + +/* + * A GCompareFunc for g_slist_find_custom() + * + * Args: + * a: MatchingModule*, element's data + * b: char*, user data to compare against + * + * Returns: + * 0 if the matching module a's name is b + */ +gint gcfCompareMatching(gconstpointer a, gconstpointer b) +{ + const MatchingModule* matchingModule; + const char* name; + + matchingModule= (const MatchingModule*) a; + name= (const char*) b; + + return strncmp(matchingModule->name, name, strlen(matchingModule->name) + + 1); +} + + +/* + * A GCompareFunc for g_slist_find_custom() + * + * Args: + * a: AnalysisModule*, element's data + * b: char*, user data to compare against + * + * Returns: + * 0 if the analysis module a's name is b + */ +gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) +{ + const AnalysisModule* analysisModule; + const char* name; + + analysisModule= (const AnalysisModule*) a; + name= (const char*) b; + + return strncmp(analysisModule->name, name, strlen(analysisModule->name) + + 1); +} diff --git a/lttv/lttv/sync/sync_chain.h b/lttv/lttv/sync/sync_chain.h index c64fa93e..ee81308f 100644 --- a/lttv/lttv/sync/sync_chain.h +++ b/lttv/lttv/sync/sync_chain.h @@ -68,7 +68,6 @@ extern GQueue moduleOptions; void syncTraceset(LttvTracesetContext* const traceSetContext); -char* changeToGraphDir(const char* const graphs); void timeDiff(struct timeval* const end, const struct timeval* const start); gint gcfCompareProcessing(gconstpointer a, gconstpointer b); diff --git a/lttv/lttv/sync/sync_chain_lttv.c b/lttv/lttv/sync/sync_chain_lttv.c index c2ec05de..58ef078d 100644 --- a/lttv/lttv/sync/sync_chain_lttv.c +++ b/lttv/lttv/sync/sync_chain_lttv.c @@ -43,11 +43,6 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data); static void gfAddModuleOption(gpointer data, gpointer user_data); static void gfRemoveModuleOption(gpointer data, gpointer user_data); -GQueue processingModules= G_QUEUE_INIT; -GQueue matchingModules= G_QUEUE_INIT; -GQueue analysisModules= G_QUEUE_INIT; -GQueue moduleOptions= G_QUEUE_INIT; - static char* argHelpNone= "none"; static ModuleOption optionSync= { .longName= "sync", @@ -194,35 +189,10 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) if (optionSyncGraphs.present) { - char* cwd; - int graphsFp; - // Create the graph directory right away in case the module initialization // functions have something to write in it. syncState->graphsDir= optionSyncGraphsDir.arg; - cwd= changeToGraphDir(optionSyncGraphsDir.arg); - - if ((graphsFp= open("graphs.gnu", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | - S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH - | S_IWOTH | S_IXOTH)) == -1) - { - g_error(strerror(errno)); - } - if ((syncState->graphsStream= fdopen(graphsFp, "w")) == NULL) - { - g_error(strerror(errno)); - } - - fprintf(syncState->graphsStream, - "#!/usr/bin/gnuplot\n\n" - "set terminal postscript eps color size 8in,6in\n"); - - retval= chdir(cwd); - if (retval == -1) - { - g_error(strerror(errno)); - } - free(cwd); + syncState->graphsStream= createGraphsDir(syncState->graphsDir); } else { @@ -349,97 +319,6 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) } -/* - * Calculate the elapsed time between two timeval values - * - * Args: - * end: end time, result is also stored in this structure - * start: start time - */ -void timeDiff(struct timeval* const end, const struct timeval* const start) -{ - if (end->tv_usec >= start->tv_usec) - { - end->tv_sec-= start->tv_sec; - end->tv_usec-= start->tv_usec; - } - else - { - end->tv_sec= end->tv_sec - start->tv_sec - 1; - end->tv_usec= end->tv_usec - start->tv_usec + 1e6; - } -} - - -/* - * A GCompareFunc for g_slist_find_custom() - * - * Args: - * a: ProcessingModule*, element's data - * b: char*, user data to compare against - * - * Returns: - * 0 if the processing module a's name is b - */ -gint gcfCompareProcessing(gconstpointer a, gconstpointer b) -{ - const ProcessingModule* processingModule; - const char* name; - - processingModule= (const ProcessingModule*) a; - name= (const char*) b; - - return strncmp(processingModule->name, name, - strlen(processingModule->name) + 1); -} - - -/* - * A GCompareFunc for g_slist_find_custom() - * - * Args: - * a: MatchingModule*, element's data - * b: char*, user data to compare against - * - * Returns: - * 0 if the matching module a's name is b - */ -gint gcfCompareMatching(gconstpointer a, gconstpointer b) -{ - const MatchingModule* matchingModule; - const char* name; - - matchingModule= (const MatchingModule*) a; - name= (const char*) b; - - return strncmp(matchingModule->name, name, strlen(matchingModule->name) + - 1); -} - - -/* - * A GCompareFunc for g_slist_find_custom() - * - * Args: - * a: AnalysisModule*, element's data - * b: char*, user data to compare against - * - * Returns: - * 0 if the analysis module a's name is b - */ -gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) -{ - const AnalysisModule* analysisModule; - const char* name; - - analysisModule= (const AnalysisModule*) a; - name= (const char*) b; - - return strncmp(analysisModule->name, name, strlen(analysisModule->name) + - 1); -} - - /* * A GFunc for g_queue_foreach() * @@ -456,47 +335,6 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data) } -/* - * Change to the directory used to hold graphs. Create it if necessary. - * - * Args: - * graph: name of directory - * - * Returns: - * The current working directory before the execution of the function. The - * string must be free'd by the caller. - */ -char* changeToGraphDir(const char* const graphs) -{ - int retval; - char* cwd; - - cwd= getcwd(NULL, 0); - if (cwd == NULL) - { - g_error(strerror(errno)); - } - while ((retval= chdir(graphs)) != 0) - { - if (errno == ENOENT) - { - retval= mkdir(graphs, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | - S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); - if (retval != 0) - { - g_error(strerror(errno)); - } - } - else - { - g_error(strerror(errno)); - } - } - - return cwd; -} - - /* * A GFunc for g_queue_foreach() * diff --git a/lttv/modules/text/sync_chain_batch.c b/lttv/modules/text/sync_chain_batch.c index 55ec9105..c88b13c5 100644 --- a/lttv/modules/text/sync_chain_batch.c +++ b/lttv/modules/text/sync_chain_batch.c @@ -295,35 +295,10 @@ void setupSyncChain(LttvTracesetContext* const traceSetContext) if (optionEvalGraphs) { - char* cwd; - int graphsFp; - // Create the graph directory right away in case the module initialization // functions have something to write in it. syncState->graphsDir= optionEvalGraphsDir; - cwd= changeToGraphDir(optionEvalGraphsDir); - - if ((graphsFp= open("graphs.gnu", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | - S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH - | S_IWOTH | S_IXOTH)) == -1) - { - g_error(strerror(errno)); - } - if ((syncState->graphsStream= fdopen(graphsFp, "w")) == NULL) - { - g_error(strerror(errno)); - } - - fprintf(syncState->graphsStream, - "#!/usr/bin/gnuplot\n\n" - "set terminal postscript eps color size 8in,6in\n"); - - retval= chdir(cwd); - if (retval == -1) - { - g_error(strerror(errno)); - } - free(cwd); + syncState->graphsStream= createGraphsDir(syncState->graphsDir); } else { -- 2.34.1