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)
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Asan UBsan." FORCE)
|
||||||
endif(NOT CMAKE_BUILD_TYPE)
|
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)
|
include(CheckIPOSupported)
|
||||||
check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C)
|
check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C)
|
||||||
|
|
||||||
@ -70,4 +74,4 @@ if(BUILD_TESTING)
|
|||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
endif()
|
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.
|
directory containing the runtime trace.
|
||||||
- Finally run the `ovniemu ovni` command to generate the Paraver traces.
|
- Finally run the `ovniemu ovni` command to generate the Paraver traces.
|
||||||
- Use the command `wxparaver ovni/cpu.prv` to load the CPU trace.
|
- 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.
|
interested in, to open a timeline view.
|
||||||
|
@ -8,6 +8,9 @@ add_library(ovni SHARED
|
|||||||
|
|
||||||
target_include_directories(ovni PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
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
|
add_executable(ovniemu
|
||||||
chan.c
|
chan.c
|
||||||
emu.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 <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include "chan.h"
|
#include "chan.h"
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "ovni.h"
|
#include "ovni.h"
|
||||||
@ -1039,6 +1041,149 @@ emu_init(struct ovni_emu *emu, int argc, char *argv[])
|
|||||||
emu->total_nthreads);
|
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
|
static void
|
||||||
emu_post(struct ovni_emu *emu)
|
emu_post(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
@ -1048,6 +1193,8 @@ emu_post(struct ovni_emu *emu)
|
|||||||
|
|
||||||
write_row_cpu(emu);
|
write_row_cpu(emu);
|
||||||
write_row_thread(emu);
|
write_row_thread(emu);
|
||||||
|
|
||||||
|
copy_configs(emu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -46,6 +46,9 @@ function(ovni_test source)
|
|||||||
list(APPEND OVNI_TEST_ENV
|
list(APPEND OVNI_TEST_ENV
|
||||||
"OVNI_CURRENT_DIR=${CMAKE_CURRENT_BINARY_DIR}")
|
"OVNI_CURRENT_DIR=${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
|
||||||
|
list(APPEND OVNI_TEST_ENV
|
||||||
|
"OVNI_CONFIG_DIR=${CMAKE_SOURCE_DIR}/cfg")
|
||||||
|
|
||||||
if(OVNI_TEST_SORT)
|
if(OVNI_TEST_SORT)
|
||||||
list(APPEND OVNI_TEST_ENV "OVNI_DO_SORT=1")
|
list(APPEND OVNI_TEST_ENV "OVNI_DO_SORT=1")
|
||||||
endif()
|
endif()
|
||||||
|
Loading…
Reference in New Issue
Block a user