diff liboctave/system/child-list.h @ 22049:ccf50f029999

move octave_child_list to separate file and define inside namespace * liboctave/system/child-list.cc, liboctave/system/child-list.h: New files. * liboctave/system/module.mk: Update. * sighandlers.h, sighandlers.cc: Move octave_child and octave_child_list classes to separate files in liboctave and defined inside the octave namespace. Change all uses.
author John W. Eaton <jwe@octave.org>
date Wed, 06 Jul 2016 14:57:54 -0400
parents
children bac0d6f07a3e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/system/child-list.h	Wed Jul 06 14:57:54 2016 -0400
@@ -0,0 +1,136 @@
+/*
+
+Copyright (C) 1993-2015 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if ! defined (octave_child_list_h)
+#define octave_child_list_h 1
+
+#include "octave-config.h"
+
+#include <csignal>
+
+#include <sys/types.h>
+
+#include "base-list.h"
+
+namespace octave
+{
+  class
+  OCTAVE_API
+  child
+  {
+  public:
+
+    // Do whatever to handle event for child with PID (might not
+    // actually be dead, could just be stopped).  Return true if
+    // the list element corresponding to PID should be removed from
+    // list.  This function should not call any functions that modify
+    // the child_list.
+
+    typedef bool (*child_event_handler) (pid_t, int);
+
+    child (pid_t id = -1, child_event_handler f = 0)
+      : pid (id), handler (f), have_status (0), status (0) { }
+
+    child (const child& oc)
+      : pid (oc.pid), handler (oc.handler),
+      have_status (oc.have_status), status (oc.status) { }
+
+    child& operator = (const child& oc)
+      {
+        if (&oc != this)
+          {
+            pid = oc.pid;
+            handler = oc.handler;
+            have_status = oc.have_status;
+            status = oc.status;
+          }
+        return *this;
+      }
+
+    ~child (void) { }
+
+    // The process id of this child.
+    pid_t pid;
+
+    // The function we call if an event happens for this child.
+    child_event_handler handler;
+
+    // Nonzero if this child has stopped or terminated.
+    sig_atomic_t have_status;
+
+    // The status of this child; 0 if running, otherwise a status value
+    // from waitpid.
+    int status;
+  };
+
+  class
+  OCTAVE_API
+  child_list
+  {
+  protected:
+
+    child_list (void) { }
+
+    class child_list_rep : public octave_base_list<child>
+    {
+    public:
+
+      void insert (pid_t pid, child::child_event_handler f);
+
+      void reap (void);
+
+      bool wait (void);
+    };
+
+  public:
+
+    ~child_list (void) { }
+
+    static void insert (pid_t pid, child::child_event_handler f);
+
+    static void reap (void);
+
+    static bool wait (void);
+
+    static void remove (pid_t pid);
+
+  private:
+
+    static bool instance_ok (void);
+
+    static child_list_rep *instance;
+
+    static void cleanup_instance (void) { delete instance; instance = 0; }
+  };
+}
+
+#if defined (OCTAVE_USE_DEPRECATED_FUNCTIONS)
+
+OCTAVE_DEPRECATED ("use 'octave::child' instead")
+typedef octave::child octave_child;
+
+OCTAVE_DEPRECATED ("use 'octave::child_list' instead")
+typedef octave::child_list octave_child_list;
+
+#endif
+
+#endif