Copy Paraver configs into the trace directory
Keeps the trace self-contained.
This commit is contained in:
parent
a2702ad92a
commit
b1b4f37032
@ -28,6 +28,10 @@ if(NOT CMAKE_BUILD_TYPE)
|
||||
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Asan UBsan." FORCE)
|
||||
endif(NOT CMAKE_BUILD_TYPE)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
set(OVNI_CONFIG_RELDIR "${CMAKE_INSTALL_DATADIR}/ovni")
|
||||
set(OVNI_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${OVNI_CONFIG_RELDIR}")
|
||||
|
||||
include(CheckIPOSupported)
|
||||
check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C)
|
||||
|
||||
@ -70,4 +74,4 @@ if(BUILD_TESTING)
|
||||
add_subdirectory(test)
|
||||
endif()
|
||||
|
||||
install(DIRECTORY cfg/ DESTINATION share/ovni)
|
||||
install(DIRECTORY cfg/ DESTINATION "${OVNI_CONFIG_RELDIR}")
|
||||
|
@ -39,5 +39,5 @@ To start a trace follow these steps:
|
||||
directory containing the runtime trace.
|
||||
- Finally run the `ovniemu ovni` command to generate the Paraver traces.
|
||||
- Use the command `wxparaver ovni/cpu.prv` to load the CPU trace.
|
||||
- Load the configurations from the `cfg/` directory that you are
|
||||
- Load the configurations from the `ovni/cfg/` directory that you are
|
||||
interested in, to open a timeline view.
|
||||
|
@ -8,6 +8,9 @@ add_library(ovni SHARED
|
||||
|
||||
target_include_directories(ovni PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
configure_file("config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" )
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
add_executable(ovniemu
|
||||
chan.c
|
||||
emu.c
|
||||
|
9
src/config.h.in
Normal file
9
src/config.h.in
Normal file
@ -0,0 +1,9 @@
|
||||
/* Copyright (c) 2022 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#ifndef OVNI_CONFIG_H
|
||||
#define OVNI_CONFIG_H
|
||||
|
||||
#cmakedefine OVNI_CONFIG_DIR "@OVNI_CONFIG_DIR@"
|
||||
|
||||
#endif /* OVNI_CONFIG_H */
|
147
src/emu.c
147
src/emu.c
@ -13,9 +13,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "chan.h"
|
||||
#include "emu.h"
|
||||
#include "ovni.h"
|
||||
@ -1039,6 +1041,149 @@ emu_init(struct ovni_emu *emu, int argc, char *argv[])
|
||||
emu->total_nthreads);
|
||||
}
|
||||
|
||||
static int
|
||||
copy_file(const char *src, const char *dst)
|
||||
{
|
||||
char buffer[1024];
|
||||
|
||||
FILE *infile = fopen(src, "r");
|
||||
|
||||
if (infile == NULL) {
|
||||
err("fopen(%s) failed: %s\n", src, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
FILE *outfile = fopen(dst, "w");
|
||||
|
||||
if (outfile == NULL) {
|
||||
err("fopen(%s) failed: %s\n", src, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t bytes;
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), infile)) > 0)
|
||||
fwrite(buffer, 1, bytes, outfile);
|
||||
|
||||
fclose(outfile);
|
||||
fclose(infile);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
copy_recursive(const char *src, const char *dst)
|
||||
{
|
||||
DIR *dir;
|
||||
int failed = 0;
|
||||
|
||||
if ((dir = opendir(src)) == NULL) {
|
||||
err("opendir \"%s\" failed: %s\n", src, strerror(errno));
|
||||
failed = 1;
|
||||
goto bay;
|
||||
}
|
||||
|
||||
if (mkdir(dst, 0755) != 0) {
|
||||
err("mkdir \"%s\" failed: %s\n", src, strerror(errno));
|
||||
failed = 1;
|
||||
goto bay;
|
||||
}
|
||||
|
||||
/* Use the heap, as the recursion may exhaust the stack */
|
||||
char *newsrc = calloc(1, PATH_MAX);
|
||||
if (newsrc == NULL)
|
||||
die("calloc failed\n");
|
||||
|
||||
char *newdst = calloc(1, PATH_MAX);
|
||||
if (newdst == NULL)
|
||||
die("calloc failed\n");
|
||||
|
||||
struct dirent *dirent;
|
||||
while ((dirent = readdir(dir)) != NULL) {
|
||||
struct stat st;
|
||||
sprintf(newsrc, "%s/%s", src, dirent->d_name);
|
||||
|
||||
if (strcmp(dirent->d_name, ".") == 0)
|
||||
continue;
|
||||
|
||||
if (strcmp(dirent->d_name, "..") == 0)
|
||||
continue;
|
||||
|
||||
int n = snprintf(newsrc, PATH_MAX, "%s/%s",
|
||||
src, dirent->d_name);
|
||||
|
||||
if (n >= PATH_MAX) {
|
||||
err("path too long \"%s/%s\"\n", src, dirent->d_name);
|
||||
failed = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
int m = snprintf(newdst, PATH_MAX, "%s/%s",
|
||||
dst, dirent->d_name);
|
||||
|
||||
if (m >= PATH_MAX) {
|
||||
err("path too long \"%s/%s\"\n", dst, dirent->d_name);
|
||||
failed = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (stat(newsrc, &st) != 0) {
|
||||
err("stat \"%s\" failed: %s\n", newsrc,
|
||||
strerror(errno));
|
||||
failed = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (copy_recursive(newsrc, newdst) != 0) {
|
||||
failed = 1;
|
||||
}
|
||||
} else {
|
||||
if (copy_file(newsrc, newdst) != 0) {
|
||||
failed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
free(newsrc);
|
||||
free(newdst);
|
||||
|
||||
bay:
|
||||
return -failed;
|
||||
}
|
||||
|
||||
static void
|
||||
copy_configs(struct ovni_emu *emu)
|
||||
{
|
||||
/* Allow override so we can run the tests without install */
|
||||
char *src = getenv("OVNI_CONFIG_DIR");
|
||||
|
||||
if (src == NULL)
|
||||
src = OVNI_CONFIG_DIR;
|
||||
|
||||
char dst[PATH_MAX];
|
||||
if (snprintf(dst, PATH_MAX, "%s/cfg", emu->tracedir) >= PATH_MAX) {
|
||||
err("cannot copy config files: path too long \"%s/cfg\"\n",
|
||||
emu->tracedir);
|
||||
return;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
if (stat(dst, &st) == 0) {
|
||||
err("existing cfg directory \"%s\", skipping config copy\n", dst);
|
||||
if (emu->enable_linter)
|
||||
die("cannot continue in linter mode\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (copy_recursive(src, dst) != 0) {
|
||||
err("warning: cannot copy config files: recursive copy failed\n");
|
||||
if (emu->enable_linter)
|
||||
die("cannot continue in linter mode\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emu_post(struct ovni_emu *emu)
|
||||
{
|
||||
@ -1048,6 +1193,8 @@ emu_post(struct ovni_emu *emu)
|
||||
|
||||
write_row_cpu(emu);
|
||||
write_row_thread(emu);
|
||||
|
||||
copy_configs(emu);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -46,6 +46,9 @@ function(ovni_test source)
|
||||
list(APPEND OVNI_TEST_ENV
|
||||
"OVNI_CURRENT_DIR=${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
list(APPEND OVNI_TEST_ENV
|
||||
"OVNI_CONFIG_DIR=${CMAKE_SOURCE_DIR}/cfg")
|
||||
|
||||
if(OVNI_TEST_SORT)
|
||||
list(APPEND OVNI_TEST_ENV "OVNI_DO_SORT=1")
|
||||
endif()
|
||||
|
Loading…
Reference in New Issue
Block a user