------------------------------------------------------------
revno: 582
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: tridge
timestamp: Thu 2007-07-19 13:36:00 +1000
message:
  make sure we still run events when waiting for ctdb_event_script()
modified:
  server/eventscript.c           eventscript.c-20070704074533-95f10rsay8um8wrr-1
=== modified file 'server/eventscript.c'
--- a/server/eventscript.c      2007-07-12 23:35:46 +0000
+++ b/server/eventscript.c      2007-07-19 03:36:00 +0000
@@ -58,22 +58,6 @@
        return ret;
 }
 
-/*
-  run the event script
- */
-int ctdb_event_script(struct ctdb_context *ctdb, const char *fmt, ...)
-{
-       va_list ap;
-       int ret;
-
-       va_start(ap, fmt);
-       ret = ctdb_event_script_v(ctdb, fmt, ap);
-       va_end(ap);
-
-       return ret;
-}
-
-
 struct ctdb_event_script_state {
        struct ctdb_context *ctdb;
        pid_t child;
@@ -131,15 +115,14 @@
   run the event script in the background, calling the callback when 
   finished
  */
-int ctdb_event_script_callback(struct ctdb_context *ctdb, 
-                              struct timeval timeout,
-                              TALLOC_CTX *mem_ctx,
-                              void (*callback)(struct ctdb_context *, int, 
void *),
-                              void *private_data,
-                              const char *fmt, ...)
+static int ctdb_event_script_callback_v(struct ctdb_context *ctdb, 
+                                       struct timeval timeout,
+                                       TALLOC_CTX *mem_ctx,
+                                       void (*callback)(struct ctdb_context *, 
int, void *),
+                                       void *private_data,
+                                       const char *fmt, va_list ap)
 {
        struct ctdb_event_script_state *state;
-       va_list ap;
        int ret;
 
        state = talloc(mem_ctx, struct ctdb_event_script_state);
@@ -170,9 +153,7 @@
                        ctdb_restore_scheduler(ctdb);
                }
                set_close_on_exec(state->fd[1]);
-               va_start(ap, fmt);
                ret = ctdb_event_script_v(ctdb, fmt, ap);
-               va_end(ap);
                _exit(ret);
        }
 
@@ -191,3 +172,69 @@
 }
 
 
+/*
+  run the event script in the background, calling the callback when 
+  finished
+ */
+int ctdb_event_script_callback(struct ctdb_context *ctdb, 
+                              struct timeval timeout,
+                              TALLOC_CTX *mem_ctx,
+                              void (*callback)(struct ctdb_context *, int, 
void *),
+                              void *private_data,
+                              const char *fmt, ...)
+{
+       va_list ap;
+       int ret;
+
+       va_start(ap, fmt);
+       ret = ctdb_event_script_callback_v(ctdb, timeout, mem_ctx, callback, 
private_data, fmt, ap);
+       va_end(ap);
+
+       return ret;
+}
+
+
+struct callback_status {
+       bool done;
+       int status;
+};
+
+/*
+  called when ctdb_event_script() finishes
+ */
+static void event_script_callback(struct ctdb_context *ctdb, int status, void 
*private_data)
+{
+       struct callback_status *s = (struct callback_status *)private_data;
+       s->done = true;
+       s->status = status;
+}
+
+/*
+  run the event script, waiting for it to complete. Used when the caller 
doesn't want to 
+  continue till the event script has finished.
+ */
+int ctdb_event_script(struct ctdb_context *ctdb, const char *fmt, ...)
+{
+       va_list ap;
+       int ret;
+       TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
+       struct callback_status status;
+
+       va_start(ap, fmt);
+       ret = ctdb_event_script_callback_v(ctdb, timeval_zero(), tmp_ctx, 
event_script_callback, &status, fmt, ap);
+       va_end(ap);
+
+       if (ret != 0) {
+               talloc_free(tmp_ctx);
+               return ret;
+       }
+
+       status.status = -1;
+       status.done = false;
+
+       while (status.done == false && event_loop_once(ctdb->ev) == 0) /* noop 
*/;
+
+       talloc_free(tmp_ctx);
+
+       return status.status;
+}

Reply via email to