traceset.c\
filter.c\
print.c\
+ sync/sync_chain.c\
sync/sync_chain_lttv.c\
sync/graph_functions.c\
sync/data_structures.c\
analysisData= (AnalysisDataCHull*) syncState->analysisData;
- cwd= changeToGraphDir(syncState->graphsDir);
+ cwd= changeToGraphsDir(syncState->graphsDir);
analysisData->graphsData->hullPoints= malloc(syncState->traceNb *
sizeof(FILE**));
convertIP(saddr, rttKey->saddr);
convertIP(daddr, rttKey->daddr);
- cwd= changeToGraphDir(graphsDir);
+ cwd= changeToGraphsDir(graphsDir);
for (i= 0; i < sizeof(loopValues) / sizeof(*loopValues); i++)
{
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)
{
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*));
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++)
#endif
#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#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;
} GraphFunctions;
+FILE* createGraphsDir(const char* const graphsDir);
+char* changeToGraphsDir(const char* const graphsDir);
void writeGraphsScript(struct _SyncState* const syncState);
#endif
--- /dev/null
+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2009 Benjamin Poirier <benjamin.poirier@polymtl.ca>
+ *
+ * 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 <config.h>
+#endif
+
+#include <errno.h>
+#include <unistd.h>
+
+#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);
+}
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);
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",
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
{
}
-/*
- * 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()
*
}
-/*
- * 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()
*
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
{