diff mbox series

[07/15] chardev: do not use machine_init_done

Message ID 20201202081854.4126071-8-pbonzini@redhat.com
State New
Headers show
Series Finish cleaning up qemu_init | expand

Commit Message

Paolo Bonzini Dec. 2, 2020, 8:18 a.m. UTC
machine_init_done is not the right flag to check when preconfig
is taken into account; for example "./qemu-system-x86_64 -serial
mon:stdio -preconfig" does not print the QEMU monitor header until after
exit_preconfig.  Add back a custom bool for mux character devices.  This
partially undoes commit c7278b4355 ("chardev: introduce chr_machine_done
hook", 2018-03-12), cut keeps the cleaner logic using a function pointer
in ChardevClass.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 chardev/char-mux.c        | 38 ++++++++++++++++++---
 chardev/chardev-sysemu.c  | 69 ---------------------------------------
 chardev/meson.build       |  2 +-
 hw/core/machine.c         |  2 +-
 include/chardev/char.h    |  6 ++--
 include/sysemu/sysemu.h   |  2 --
 softmmu/vl.c              |  3 ++
 stubs/machine-init-done.c |  8 -----
 stubs/meson.build         |  1 -
 9 files changed, 43 insertions(+), 88 deletions(-)
 delete mode 100644 chardev/chardev-sysemu.c
 delete mode 100644 stubs/machine-init-done.c

Comments

Igor Mammedov Dec. 7, 2020, 3:15 p.m. UTC | #1
On Wed,  2 Dec 2020 03:18:46 -0500
Paolo Bonzini <pbonzini@redhat.com> wrote:

> machine_init_done is not the right flag to check when preconfig
> is taken into account; for example "./qemu-system-x86_64 -serial
> mon:stdio -preconfig" does not print the QEMU monitor header until after
> exit_preconfig.  Add back a custom bool for mux character devices.  This
> partially undoes commit c7278b4355 ("chardev: introduce chr_machine_done
> hook", 2018-03-12), cut keeps the cleaner logic using a function pointer
                      ^^^
did you mean
s/cut/but/

> in ChardevClass.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>


> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  chardev/char-mux.c        | 38 ++++++++++++++++++---
>  chardev/chardev-sysemu.c  | 69 ---------------------------------------
>  chardev/meson.build       |  2 +-
>  hw/core/machine.c         |  2 +-
>  include/chardev/char.h    |  6 ++--
>  include/sysemu/sysemu.h   |  2 --
>  softmmu/vl.c              |  3 ++
>  stubs/machine-init-done.c |  8 -----
>  stubs/meson.build         |  1 -
>  9 files changed, 43 insertions(+), 88 deletions(-)
>  delete mode 100644 chardev/chardev-sysemu.c
>  delete mode 100644 stubs/machine-init-done.c
> 
> diff --git a/chardev/char-mux.c b/chardev/char-mux.c
> index 6f980bb836..72beef29d2 100644
> --- a/chardev/char-mux.c
> +++ b/chardev/char-mux.c
> @@ -33,6 +33,13 @@
>  
>  /* MUX driver for serial I/O splitting */
>  
> +/*
> + * Set to false by suspend_mux_open.  Open events are delayed until
> + * resume_mux_open.  Usually suspend_mux_open is called before
> + * command line processing and resume_mux_open afterwards.
> + */
> +static bool muxes_opened = true;
> +
>  /* Called with chr_write_lock held.  */
>  static int mux_chr_write(Chardev *chr, const uint8_t *buf, int len)
>  {
> @@ -237,7 +244,7 @@ void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event)
>      MuxChardev *d = MUX_CHARDEV(chr);
>      int i;
>  
> -    if (!machine_init_done) {
> +    if (!muxes_opened) {
>          return;
>      }
>  
> @@ -328,7 +335,7 @@ static void qemu_chr_open_mux(Chardev *chr,
>      /* only default to opened state if we've realized the initial
>       * set of muxes
>       */
> -    *be_opened = machine_init_done;
> +    *be_opened = muxes_opened;
>      qemu_chr_fe_init(&d->chr, drv, errp);
>  }
>  
> @@ -360,19 +367,42 @@ static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
>   * mux will receive CHR_EVENT_OPENED notifications for the BE
>   * immediately.
>   */
> -static int open_muxes(Chardev *chr)
> +static void open_muxes(Chardev *chr)
>  {
>      /* send OPENED to all already-attached FEs */
>      mux_chr_send_all_event(chr, CHR_EVENT_OPENED);
> +
>      /*
>       * mark mux as OPENED so any new FEs will immediately receive
>       * OPENED event
>       */
>      chr->be_open = 1;
> +}
> +
> +void suspend_mux_open(void)
> +{
> +    muxes_opened = false;
> +}
> +
> +static int chardev_options_parsed_cb(Object *child, void *opaque)
> +{
> +    Chardev *chr = (Chardev *)child;
> +    ChardevClass *class = CHARDEV_GET_CLASS(chr);
> +
> +    if (!chr->be_open && class->chr_options_parsed) {
> +        class->chr_options_parsed(chr);
> +    }
>  
>      return 0;
>  }
>  
> +void resume_mux_open(void)
> +{
> +    muxes_opened = true;
> +    object_child_foreach(get_chardevs_root(),
> +                         chardev_options_parsed_cb, NULL);
> +}
> +
>  static void char_mux_class_init(ObjectClass *oc, void *data)
>  {
>      ChardevClass *cc = CHARDEV_CLASS(oc);
> @@ -383,7 +413,7 @@ static void char_mux_class_init(ObjectClass *oc, void *data)
>      cc->chr_accept_input = mux_chr_accept_input;
>      cc->chr_add_watch = mux_chr_add_watch;
>      cc->chr_be_event = mux_chr_be_event;
> -    cc->chr_machine_done = open_muxes;
> +    cc->chr_options_parsed = open_muxes;
>      cc->chr_update_read_handler = mux_chr_update_read_handlers;
>  }
>  
> diff --git a/chardev/chardev-sysemu.c b/chardev/chardev-sysemu.c
> deleted file mode 100644
> index eecdc615ee..0000000000
> --- a/chardev/chardev-sysemu.c
> +++ /dev/null
> @@ -1,69 +0,0 @@
> -/*
> - * QEMU System Emulator
> - *
> - * Copyright (c) 2003-2008 Fabrice Bellard
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a copy
> - * of this software and associated documentation files (the "Software"), to deal
> - * in the Software without restriction, including without limitation the rights
> - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> - * copies of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be included in
> - * all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> - * THE SOFTWARE.
> - */
> -
> -#include "qemu/osdep.h"
> -#include "sysemu/sysemu.h"
> -#include "chardev/char.h"
> -#include "qemu/error-report.h"
> -#include "chardev-internal.h"
> -
> -static int chardev_machine_done_notify_one(Object *child, void *opaque)
> -{
> -    Chardev *chr = (Chardev *)child;
> -    ChardevClass *class = CHARDEV_GET_CLASS(chr);
> -
> -    if (class->chr_machine_done) {
> -        return class->chr_machine_done(chr);
> -    }
> -
> -    return 0;
> -}
> -
> -static void chardev_machine_done_hook(Notifier *notifier, void *unused)
> -{
> -    int ret = object_child_foreach(get_chardevs_root(),
> -                                   chardev_machine_done_notify_one, NULL);
> -
> -    if (ret) {
> -        error_report("Failed to call chardev machine_done hooks");
> -        exit(1);
> -    }
> -}
> -
> -
> -static Notifier chardev_machine_done_notify = {
> -    .notify = chardev_machine_done_hook,
> -};
> -
> -static void register_types(void)
> -{
> -    /*
> -     * This must be done after machine init, since we register FEs with muxes
> -     * as part of realize functions like serial_isa_realizefn when -nographic
> -     * is specified.
> -     */
> -    qemu_add_machine_init_done_notifier(&chardev_machine_done_notify);
> -}
> -
> -type_init(register_types);
> diff --git a/chardev/meson.build b/chardev/meson.build
> index 859d8b04d4..4e19722c5e 100644
> --- a/chardev/meson.build
> +++ b/chardev/meson.build
> @@ -25,7 +25,7 @@ chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
>  
>  chardev_ss = chardev_ss.apply(config_host, strict: false)
>  
> -softmmu_ss.add(files('chardev-sysemu.c', 'msmouse.c', 'wctablet.c', 'testdev.c'))
> +softmmu_ss.add(files('msmouse.c', 'wctablet.c', 'testdev.c'))
>  
>  chardev_modules = {}
>  
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 025c4f9749..40876ddd8e 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -1176,7 +1176,7 @@ void machine_run_board_init(MachineState *machine)
>  static NotifierList machine_init_done_notifiers =
>      NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);
>  
> -bool machine_init_done;
> +static bool machine_init_done;
>  
>  void qemu_add_machine_init_done_notifier(Notifier *notify)
>  {
> diff --git a/include/chardev/char.h b/include/chardev/char.h
> index db42f0a8c6..4181a2784a 100644
> --- a/include/chardev/char.h
> +++ b/include/chardev/char.h
> @@ -270,8 +270,7 @@ struct ChardevClass {
>      void (*chr_set_echo)(Chardev *chr, bool echo);
>      void (*chr_set_fe_open)(Chardev *chr, int fe_open);
>      void (*chr_be_event)(Chardev *s, QEMUChrEvent event);
> -    /* Return 0 if succeeded, 1 if failed */
> -    int (*chr_machine_done)(Chardev *chr);
> +    void (*chr_options_parsed)(Chardev *chr);
>  };
>  
>  Chardev *qemu_chardev_new(const char *id, const char *typename,
> @@ -283,6 +282,9 @@ extern int term_escape_char;
>  GSource *qemu_chr_timeout_add_ms(Chardev *chr, guint ms,
>                                   GSourceFunc func, void *private);
>  
> +void suspend_mux_open(void);
> +void resume_mux_open(void);
> +
>  /* console.c */
>  void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp);
>  
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 0e7b405d22..9b47cdca55 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -16,8 +16,6 @@ extern bool qemu_uuid_set;
>  void qemu_add_exit_notifier(Notifier *notify);
>  void qemu_remove_exit_notifier(Notifier *notify);
>  
> -extern bool machine_init_done;
> -
>  void qemu_run_machine_init_done_notifiers(void);
>  void qemu_add_machine_init_done_notifier(Notifier *notify);
>  void qemu_remove_machine_init_done_notifier(Notifier *notify);
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index d8af26c281..8e18c52f6e 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -3462,6 +3462,8 @@ void qemu_init(int argc, char **argv, char **envp)
>  
>      qemu_create_machine(select_machine());
>  
> +    suspend_mux_open();
> +
>      qemu_disable_default_devices();
>      qemu_create_default_devices();
>      qemu_create_early_backends();
> @@ -3525,4 +3527,5 @@ void qemu_init(int argc, char **argv, char **envp)
>      }
>      accel_setup_post(current_machine);
>      os_setup_post();
> +    resume_mux_open();
>  }
> diff --git a/stubs/machine-init-done.c b/stubs/machine-init-done.c
> deleted file mode 100644
> index cd8e81392d..0000000000
> --- a/stubs/machine-init-done.c
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#include "qemu/osdep.h"
> -#include "sysemu/sysemu.h"
> -
> -bool machine_init_done = true;
> -
> -void qemu_add_machine_init_done_notifier(Notifier *notify)
> -{
> -}
> diff --git a/stubs/meson.build b/stubs/meson.build
> index cc56c83063..80b1d81a31 100644
> --- a/stubs/meson.build
> +++ b/stubs/meson.build
> @@ -21,7 +21,6 @@ stub_ss.add(files('iothread-lock.c'))
>  stub_ss.add(files('isa-bus.c'))
>  stub_ss.add(files('is-daemonized.c'))
>  stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c'))
> -stub_ss.add(files('machine-init-done.c'))
>  stub_ss.add(files('migr-blocker.c'))
>  stub_ss.add(files('monitor.c'))
>  stub_ss.add(files('monitor-core.c'))
diff mbox series

Patch

diff --git a/chardev/char-mux.c b/chardev/char-mux.c
index 6f980bb836..72beef29d2 100644
--- a/chardev/char-mux.c
+++ b/chardev/char-mux.c
@@ -33,6 +33,13 @@ 
 
 /* MUX driver for serial I/O splitting */
 
+/*
+ * Set to false by suspend_mux_open.  Open events are delayed until
+ * resume_mux_open.  Usually suspend_mux_open is called before
+ * command line processing and resume_mux_open afterwards.
+ */
+static bool muxes_opened = true;
+
 /* Called with chr_write_lock held.  */
 static int mux_chr_write(Chardev *chr, const uint8_t *buf, int len)
 {
@@ -237,7 +244,7 @@  void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event)
     MuxChardev *d = MUX_CHARDEV(chr);
     int i;
 
-    if (!machine_init_done) {
+    if (!muxes_opened) {
         return;
     }
 
@@ -328,7 +335,7 @@  static void qemu_chr_open_mux(Chardev *chr,
     /* only default to opened state if we've realized the initial
      * set of muxes
      */
-    *be_opened = machine_init_done;
+    *be_opened = muxes_opened;
     qemu_chr_fe_init(&d->chr, drv, errp);
 }
 
@@ -360,19 +367,42 @@  static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
  * mux will receive CHR_EVENT_OPENED notifications for the BE
  * immediately.
  */
-static int open_muxes(Chardev *chr)
+static void open_muxes(Chardev *chr)
 {
     /* send OPENED to all already-attached FEs */
     mux_chr_send_all_event(chr, CHR_EVENT_OPENED);
+
     /*
      * mark mux as OPENED so any new FEs will immediately receive
      * OPENED event
      */
     chr->be_open = 1;
+}
+
+void suspend_mux_open(void)
+{
+    muxes_opened = false;
+}
+
+static int chardev_options_parsed_cb(Object *child, void *opaque)
+{
+    Chardev *chr = (Chardev *)child;
+    ChardevClass *class = CHARDEV_GET_CLASS(chr);
+
+    if (!chr->be_open && class->chr_options_parsed) {
+        class->chr_options_parsed(chr);
+    }
 
     return 0;
 }
 
+void resume_mux_open(void)
+{
+    muxes_opened = true;
+    object_child_foreach(get_chardevs_root(),
+                         chardev_options_parsed_cb, NULL);
+}
+
 static void char_mux_class_init(ObjectClass *oc, void *data)
 {
     ChardevClass *cc = CHARDEV_CLASS(oc);
@@ -383,7 +413,7 @@  static void char_mux_class_init(ObjectClass *oc, void *data)
     cc->chr_accept_input = mux_chr_accept_input;
     cc->chr_add_watch = mux_chr_add_watch;
     cc->chr_be_event = mux_chr_be_event;
-    cc->chr_machine_done = open_muxes;
+    cc->chr_options_parsed = open_muxes;
     cc->chr_update_read_handler = mux_chr_update_read_handlers;
 }
 
diff --git a/chardev/chardev-sysemu.c b/chardev/chardev-sysemu.c
deleted file mode 100644
index eecdc615ee..0000000000
--- a/chardev/chardev-sysemu.c
+++ /dev/null
@@ -1,69 +0,0 @@ 
-/*
- * QEMU System Emulator
- *
- * Copyright (c) 2003-2008 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "qemu/osdep.h"
-#include "sysemu/sysemu.h"
-#include "chardev/char.h"
-#include "qemu/error-report.h"
-#include "chardev-internal.h"
-
-static int chardev_machine_done_notify_one(Object *child, void *opaque)
-{
-    Chardev *chr = (Chardev *)child;
-    ChardevClass *class = CHARDEV_GET_CLASS(chr);
-
-    if (class->chr_machine_done) {
-        return class->chr_machine_done(chr);
-    }
-
-    return 0;
-}
-
-static void chardev_machine_done_hook(Notifier *notifier, void *unused)
-{
-    int ret = object_child_foreach(get_chardevs_root(),
-                                   chardev_machine_done_notify_one, NULL);
-
-    if (ret) {
-        error_report("Failed to call chardev machine_done hooks");
-        exit(1);
-    }
-}
-
-
-static Notifier chardev_machine_done_notify = {
-    .notify = chardev_machine_done_hook,
-};
-
-static void register_types(void)
-{
-    /*
-     * This must be done after machine init, since we register FEs with muxes
-     * as part of realize functions like serial_isa_realizefn when -nographic
-     * is specified.
-     */
-    qemu_add_machine_init_done_notifier(&chardev_machine_done_notify);
-}
-
-type_init(register_types);
diff --git a/chardev/meson.build b/chardev/meson.build
index 859d8b04d4..4e19722c5e 100644
--- a/chardev/meson.build
+++ b/chardev/meson.build
@@ -25,7 +25,7 @@  chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
 
 chardev_ss = chardev_ss.apply(config_host, strict: false)
 
-softmmu_ss.add(files('chardev-sysemu.c', 'msmouse.c', 'wctablet.c', 'testdev.c'))
+softmmu_ss.add(files('msmouse.c', 'wctablet.c', 'testdev.c'))
 
 chardev_modules = {}
 
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 025c4f9749..40876ddd8e 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -1176,7 +1176,7 @@  void machine_run_board_init(MachineState *machine)
 static NotifierList machine_init_done_notifiers =
     NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);
 
-bool machine_init_done;
+static bool machine_init_done;
 
 void qemu_add_machine_init_done_notifier(Notifier *notify)
 {
diff --git a/include/chardev/char.h b/include/chardev/char.h
index db42f0a8c6..4181a2784a 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -270,8 +270,7 @@  struct ChardevClass {
     void (*chr_set_echo)(Chardev *chr, bool echo);
     void (*chr_set_fe_open)(Chardev *chr, int fe_open);
     void (*chr_be_event)(Chardev *s, QEMUChrEvent event);
-    /* Return 0 if succeeded, 1 if failed */
-    int (*chr_machine_done)(Chardev *chr);
+    void (*chr_options_parsed)(Chardev *chr);
 };
 
 Chardev *qemu_chardev_new(const char *id, const char *typename,
@@ -283,6 +282,9 @@  extern int term_escape_char;
 GSource *qemu_chr_timeout_add_ms(Chardev *chr, guint ms,
                                  GSourceFunc func, void *private);
 
+void suspend_mux_open(void);
+void resume_mux_open(void);
+
 /* console.c */
 void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp);
 
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 0e7b405d22..9b47cdca55 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -16,8 +16,6 @@  extern bool qemu_uuid_set;
 void qemu_add_exit_notifier(Notifier *notify);
 void qemu_remove_exit_notifier(Notifier *notify);
 
-extern bool machine_init_done;
-
 void qemu_run_machine_init_done_notifiers(void);
 void qemu_add_machine_init_done_notifier(Notifier *notify);
 void qemu_remove_machine_init_done_notifier(Notifier *notify);
diff --git a/softmmu/vl.c b/softmmu/vl.c
index d8af26c281..8e18c52f6e 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -3462,6 +3462,8 @@  void qemu_init(int argc, char **argv, char **envp)
 
     qemu_create_machine(select_machine());
 
+    suspend_mux_open();
+
     qemu_disable_default_devices();
     qemu_create_default_devices();
     qemu_create_early_backends();
@@ -3525,4 +3527,5 @@  void qemu_init(int argc, char **argv, char **envp)
     }
     accel_setup_post(current_machine);
     os_setup_post();
+    resume_mux_open();
 }
diff --git a/stubs/machine-init-done.c b/stubs/machine-init-done.c
deleted file mode 100644
index cd8e81392d..0000000000
--- a/stubs/machine-init-done.c
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#include "qemu/osdep.h"
-#include "sysemu/sysemu.h"
-
-bool machine_init_done = true;
-
-void qemu_add_machine_init_done_notifier(Notifier *notify)
-{
-}
diff --git a/stubs/meson.build b/stubs/meson.build
index cc56c83063..80b1d81a31 100644
--- a/stubs/meson.build
+++ b/stubs/meson.build
@@ -21,7 +21,6 @@  stub_ss.add(files('iothread-lock.c'))
 stub_ss.add(files('isa-bus.c'))
 stub_ss.add(files('is-daemonized.c'))
 stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c'))
-stub_ss.add(files('machine-init-done.c'))
 stub_ss.add(files('migr-blocker.c'))
 stub_ss.add(files('monitor.c'))
 stub_ss.add(files('monitor-core.c'))