]> git.itanic.dy.fi Git - rrdd/blobdiff - rrdtool.c
Convert rrdtool to use work queues instead of forks
[rrdd] / rrdtool.c
index df9b5c80fba4f788855b9f0c3fe3ceb888137ee1..58c0f57b069cfcadcc3728f76f4330f836b4e71d 100644 (file)
--- a/rrdtool.c
+++ b/rrdtool.c
@@ -45,10 +45,6 @@ int rrdtool_draw_image(struct rrd_image *image)
        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;
@@ -100,14 +96,15 @@ int rrdtool_draw_image(struct rrd_image *image)
 
        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;
 }
@@ -255,7 +252,7 @@ static int write_to_logfile(struct rrd_database *rrd, const char *data)
        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 */
@@ -270,10 +267,6 @@ int rrdtool_update_data(struct rrd_database *rrd)
        };
        int l;
 
-       rrd->last_update = time(0);
-       if (do_fork())
-               return 0;
-
        l = sprintf(data, "N:");
 
        if (rrd->parser && rrd->parser->parse) {
@@ -297,8 +290,15 @@ int rrdtool_update_data(struct rrd_database *rrd)
        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);
 }
 
 /*