sigemptyset(&sigmask);
sigaddset(&sigmask, SIGCHLD);
- /* Block SIGCHLD so that it becomes readable via signalfd */
- ret = sigprocmask(SIG_BLOCK, &sigmask, NULL);
- if (ret < 0) {
- pr_err("Failed to sigprocmask: %m\n");
- }
-
signal_handler.fd = signalfd(-1, &sigmask, SFD_CLOEXEC);
if (job_request_handler.fd < 0) {
pr_err("Failed to create signal_fd: %m\n");
for (i = 0; i < max_jobs; i++)
pthread_create(&thread[i], NULL, worker_thread, (void *)i);
- /*
- * Magic sleep. There are too many fork() calls at the moment
- * so we must ensure our threads don't print anything out
- * while a fork() is executed. Otherwise the child will
- * inherit glibc internal locks while they are locked, and
- * function calls such as printf will deadlock.
- */
- sleep(1);
-
return 0;
}
time_t t = time(0);
const char *updatestr = "Last update %d.%m.%Y %T (%Z)";
- pid = do_fork_limited();
- if (pid)
- return pid;
-
pr_info("Drawing image %s\n", image->image_filename);
tmpfile[0] = 0;
rename(tmpfile, image->image_filename);
- exit(0);
+ return 0;
}
int rrdtool_draw_images(struct rrd_image **image)
{
int i;
for (i = 0; image[i]; i++)
- rrdtool_draw_image(image[i]);
+ queue_work(WORK_PRIORITY_LOW, "rrdtool_draw_image",
+ rrdtool_draw_image, image[i]);
return 0;
}
return ret < 0 ? ret : 0;
}
-int rrdtool_update_data(struct rrd_database *rrd)
+static int do_rrdtool_update_data(struct rrd_database *rrd)
{
int pid;
char data[RRD_DATA_MAX_LEN + 3]; /* 3 == "N:" + NULL termination */
};
int l;
- rrd->last_update = time(0);
- if (do_fork())
- return 0;
-
l = sprintf(data, "N:");
if (rrd->parser && rrd->parser->parse) {
if (rrd->images)
rrdtool_draw_images(rrd->images);
- while (harvest_zombies(0));
- exit(0);
+ return 0;
+}
+
+int rrdtool_update_data(struct rrd_database *rrd)
+{
+ rrd->last_update = time(0);
+
+ return queue_work(WORK_PRIORITY_HIGH, "rrdtool_update_data",
+ do_rrdtool_update_data, rrd);
}
/*