]> git.ipfire.org Git - pakfire.git/commitdiff
jobs: Have them monitor themselves and update their state
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 4 Oct 2024 17:50:29 +0000 (17:50 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 4 Oct 2024 17:50:29 +0000 (17:50 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/daemon.c
src/libpakfire/include/pakfire/daemon.h
src/libpakfire/job.c

index b546231ef3fc6839c985c60d883e55c881a6259b..ea9a05ac498b4e2ed688d722793decce2a3f1da9 100644 (file)
@@ -744,32 +744,11 @@ ERROR:
 }
 
 /*
-       Called after a new job has been launched to register with the daemon's event loop.
+       Called after a job has exited
 */
-int pakfire_daemon_job_launched(struct pakfire_daemon* daemon,
-               struct pakfire_job* job, int pidfd) {
-       int r;
-
-       CTX_DEBUG(daemon->ctx, "Registering job %p with PIDFD %d\n", job, pidfd);
-
-       r = sd_event_add_child_pidfd(daemon->loop, NULL, pidfd,
-               WEXITED, pakfire_job_exited, job);
-       if (r < 0) {
-               CTX_DEBUG(daemon->ctx, "Could not register the job with the event loop: %s\n", strerror(-r));
-
-               return r;
-       }
-
-       return 0;
-}
-
-/*
-       Called after a job has exited.
-*/
-int pakfire_daemon_job_exited(struct pakfire_daemon* daemon, struct pakfire_job* job) {
-       CTX_DEBUG(daemon->ctx, "Deregistering job %p\n", job);
+int pakfire_daemon_job_finished(struct pakfire_daemon* daemon, struct pakfire_job* job) {
+       CTX_DEBUG(daemon->ctx, "Removing job %p\n", job);
 
-#if 0
        for (unsigned int i = 0; i < MAX_JOBS; i++) {
                if (daemon->jobs[i] != job)
                        continue;
@@ -780,7 +759,6 @@ int pakfire_daemon_job_exited(struct pakfire_daemon* daemon, struct pakfire_job*
 
                break;
        }
-#endif
 
        return 0;
 }
index 59e94e4d31870eb3f434b72e7590b7b478a65220..dd9ca597ec6a2333900a24abacf08afe514267d1 100644 (file)
@@ -38,10 +38,7 @@ struct pakfire_httpclient* pakfire_daemon_httpclient(struct pakfire_daemon* daem
 
 int pakfire_daemon_main(struct pakfire_daemon* daemon);
 
-int pakfire_daemon_job_launched(
-       struct pakfire_daemon* daemon, struct pakfire_job* job, int pidfd);
-int pakfire_daemon_job_exited(
-       struct pakfire_daemon* daemon, struct pakfire_job* job);
+int pakfire_daemon_job_finished(struct pakfire_daemon* daemon, struct pakfire_job* job);
 
 #endif /* PAKFIRE_PRIVATE */
 #endif /* PAKFIRE_DAEMON_H */
index 9197ecf80dc6deeff63b4c74055c54d1fdf05b28..7fdac057b356236b42088b2d7133e8a86317fc48 100644 (file)
@@ -82,6 +82,8 @@ struct pakfire_job {
        enum {
                PAKFIRE_JOB_STATE_INIT = 0,
                PAKFIRE_JOB_STATE_LAUNCHED,
+               PAKFIRE_JOB_STATE_EXITED,
+               PAKFIRE_JOB_STATE_KILLED,
        } state;
 };
 
@@ -222,15 +224,52 @@ static void pakfire_job_free(struct pakfire_job* job) {
 }
 
 /*
+       This method is triggered by SIGCHLD whenever the job exits
+*/
+int pakfire_job_exited(sd_event_source* s, const siginfo_t* si, void* data) {
+       struct pakfire_job* job = data;
+       char job_id[UUID_STR_LEN];
+       int r;
+
+       // Format the job ID as string
+       uuid_unparse(job->job_id, job_id);
+
+       switch (si->si_code) {
+               case CLD_EXITED:
+                       CTX_DEBUG(job->ctx, "Job %s has exited with status code %d\n",
+                               job_id, si->si_status);
+
+                       // Update state
+                       job->state = PAKFIRE_JOB_STATE_EXITED;
+
+                       break;
+
+               case CLD_KILLED:
+                       CTX_ERROR(job->ctx, "Job %s has been killed by signal %d\n",
+                               job_id, si->si_signo);
+
+                       // Update state
+                       job->state = PAKFIRE_JOB_STATE_KILLED;
 
+                       break;
+       }
+
+       return 0;
+}
+
+/*
+       Called to initialize the parent process.
 */
 static int pakfire_job_parent(struct pakfire_job* job) {
        int r;
 
-       // Tell the daemon process that the job has been launched
-       r = pakfire_daemon_job_launched(job->daemon, job, job->pidfd);
-       if (r < 0)
+       // Register the PID file descriptor
+       r = sd_event_add_child_pidfd(job->loop, NULL, job->pidfd, WEXITED, pakfire_job_exited, job);
+       if (r < 0) {
+               CTX_DEBUG(job->ctx, "Could not register the job with the event loop: %s\n", strerror(-r));
+
                return r;
+       }
 
        return 0;
 }
@@ -487,34 +526,3 @@ int pakfire_job_terminate(struct pakfire_job* job, int signal) {
 
        return 0;
 }
-
-/*
-       This method is triggered by SIGCHLD whenever the job exits.
-*/
-int pakfire_job_exited(sd_event_source* s, const siginfo_t* si, void* data) {
-       struct pakfire_job* job = data;
-       char job_id[UUID_STR_LEN];
-       int r;
-
-       // Format the job ID as string
-       uuid_unparse(job->job_id, job_id);
-
-       switch (si->si_code) {
-               case CLD_EXITED:
-                       CTX_DEBUG(job->ctx, "Job %s has exited with status code %d\n",
-                               job_id, si->si_status);
-                       break;
-
-               case CLD_KILLED:
-                       CTX_ERROR(job->ctx, "Job %s has been killed by signal %d\n",
-                               job_id, si->si_signo);
-                       break;
-       }
-
-       // Let the daemon know this job has exited
-       r = pakfire_daemon_job_exited(job->daemon, job);
-       if (r)
-               return r;
-
-       return 0;
-}