aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-09-26 09:56:25 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-09-26 09:56:25 -0400
commit3e610e935858995f411df7bb0a77e2efeeae3d66 (patch)
tree03cd872c7d756b5c2d3165d83afc4fd15676c86c
parent71b45aa6ba60a651185cf47792fbf61b7e2b07a8 (diff)
downloadstasis-3e610e935858995f411df7bb0a77e2efeeae3d66.tar.gz
Implement cmd and working_dir
-rw-r--r--include/multiprocessing.h2
-rw-r--r--src/multiprocessing.c29
-rw-r--r--tests/test_multiprocessing.c4
3 files changed, 16 insertions, 19 deletions
diff --git a/include/multiprocessing.h b/include/multiprocessing.h
index aac6d18..d4213d2 100644
--- a/include/multiprocessing.h
+++ b/include/multiprocessing.h
@@ -95,7 +95,7 @@ struct MultiProcessingPool *mp_pool_init(const char *ident, const char *log_root
* @return pointer to MultiProcessingTask structure
* @return NULL on error
*/
-struct MultiProcessingTask *mp_pool_task(struct MultiProcessingPool *pool, const char *ident, char *cmd);
+struct MultiProcessingTask *mp_pool_task(struct MultiProcessingPool *pool, const char *ident, char *working_dir, char *cmd);
/**
* Execute all tasks in a pool
diff --git a/src/multiprocessing.c b/src/multiprocessing.c
index 433d57a..5c66672 100644
--- a/src/multiprocessing.c
+++ b/src/multiprocessing.c
@@ -7,8 +7,7 @@ static struct MultiProcessingTask *mp_pool_next_available(struct MultiProcessing
return &pool->task[pool->num_used];
}
-int child(struct MultiProcessingPool *pool, struct MultiProcessingTask *task, const char *cmd) {
- char *cwd = NULL;
+int child(struct MultiProcessingPool *pool, struct MultiProcessingTask *task) {
FILE *fp_log = NULL;
// The task starts inside the requested working directory
@@ -42,23 +41,14 @@ int child(struct MultiProcessingPool *pool, struct MultiProcessingTask *task, co
timebuf[strlen(timebuf) ? strlen(timebuf) - 1 : 0] = 0;
}
- // Get the path to the current working directory
- // Used by the log header. Informative only.
- cwd = getcwd(NULL, PATH_MAX);
- if (!cwd) {
- perror(cwd);
- exit(1);
- }
-
// Generate log header
fprintf(fp_log, "# STARTED: %s\n", timebuf ? timebuf : "unknown");
fprintf(fp_log, "# PID: %d\n", task->parent_pid);
- fprintf(fp_log, "# WORKDIR: %s\n", cwd);
- fprintf(fp_log, "# COMMAND:\n%s\n", cmd);
+ fprintf(fp_log, "# WORKDIR: %s\n", task->working_dir);
+ fprintf(fp_log, "# COMMAND:\n%s\n", task->cmd);
fprintf(fp_log, "# OUTPUT:\n");
// Commit header to log file / clean up
fflush(fp_log);
- guard_free(cwd);
// Execute task
fflush(stdout);
@@ -87,18 +77,18 @@ int parent(struct MultiProcessingPool *pool, struct MultiProcessingTask *task, p
return 0;
}
-static int mp_task_fork(struct MultiProcessingPool *pool, struct MultiProcessingTask *task, const char *cmd) {
+static int mp_task_fork(struct MultiProcessingPool *pool, struct MultiProcessingTask *task) {
pid_t pid = fork();
int child_status = 0;
if (pid == -1) {
return -1;
} else if (pid == 0) {
- child(pool, task, cmd);
+ child(pool, task);
}
return parent(pool, task, pid, &child_status);
}
-struct MultiProcessingTask *mp_pool_task(struct MultiProcessingPool *pool, const char *ident, char *cmd) {
+struct MultiProcessingTask *mp_pool_task(struct MultiProcessingPool *pool, const char *ident, char *working_dir, char *cmd) {
struct MultiProcessingTask *slot = mp_pool_next_available(pool);
if (pool->num_used != pool->num_alloc) {
pool->num_used++;
@@ -118,6 +108,13 @@ struct MultiProcessingTask *mp_pool_task(struct MultiProcessingPool *pool, const
strcat(slot->log_file, pool->log_root);
strcat(slot->log_file, "/");
+ // Set working directory
+ if (isempty(working_dir)) {
+ strcpy(slot->working_dir, ".");
+ } else {
+ strcpy(slot->working_dir, working_dir);
+ }
+
// Create a temporary file to act as our intermediate command script
FILE *tp = NULL;
char *t_name;
diff --git a/tests/test_multiprocessing.c b/tests/test_multiprocessing.c
index e1a84e3..5b3d9d1 100644
--- a/tests/test_multiprocessing.c
+++ b/tests/test_multiprocessing.c
@@ -58,7 +58,7 @@ void test_mp_task() {
struct MultiProcessingTask *task;
char task_name[100] = {0};
sprintf(task_name, "mytask%zu", i);
- STASIS_ASSERT_FATAL((task = mp_pool_task(pool, task_name, commands[i])) != NULL, "Task should not be NULL");
+ STASIS_ASSERT_FATAL((task = mp_pool_task(pool, task_name, NULL, commands[i])) != NULL, "Task should not be NULL");
STASIS_ASSERT(task->pid != 0, "PID should be non-zero at this point");
STASIS_ASSERT(task->parent_pid != MP_POOL_PID_UNUSED, "Parent PID should be non-zero");
STASIS_ASSERT(task->status == -1, "Status should be -1 (not started yet)");
@@ -102,7 +102,7 @@ void test_mp_pool_workflow() {
struct MultiProcessingPool *p;
struct MultiProcessingTask *task;
STASIS_ASSERT((p = mp_pool_init("workflow", "mplogs")) != NULL, "Failed to initialize pool");
- STASIS_ASSERT((task = mp_pool_task(p, "task", (char *) test->input_cmd)) != NULL, "Failed to queue task");
+ STASIS_ASSERT((task = mp_pool_task(p, "task", NULL, (char *) test->input_cmd)) != NULL, "Failed to queue task");
STASIS_ASSERT(mp_pool_join(p, get_cpu_count(), test->input_join_flags) == test->expected_result, "Unexpected result");
STASIS_ASSERT(task->status == test->expected_status, "Unexpected status");
STASIS_ASSERT(task->signaled_by == test->expected_signal, "Unexpected signal");