Skip to content
  • Markus Armbruster's avatar
    05875687
    qmp: Dumb down how we run QMP command registration · 05875687
    Markus Armbruster authored
    
    
    The way we get QMP commands registered is high tech:
    
    * qapi-commands.py generates qmp_init_marshal() that does the actual work
    
    * it also generates the magic to register it as a MODULE_INIT_QAPI
      function, so it runs when someone calls
      module_call_init(MODULE_INIT_QAPI)
    
    * main() calls module_call_init()
    
    QEMU needs to register a few non-qapified commands.  Same high tech
    works: monitor.c has its own qmp_init_marshal() along with the magic
    to make it run in module_call_init(MODULE_INIT_QAPI).
    
    QEMU also needs to unregister commands that are not wanted in this
    build's configuration (commit 5032a16d).  Simple enough:
    qmp_unregister_commands_hack().  The difficulty is to make it run
    after the generated qmp_init_marshal().  We can't simply run it in
    monitor.c's qmp_init_marshal(), because the order in which the
    registered functions run is indeterminate.  So qmp_init_marshal()
    registers qmp_unregister_commands_hack() separately.  Since
    registering *appends* to the list of registered functions, this will
    make it run after all the functions that have been registered already.
    
    I suspect it takes a long and expensive computer science education to
    not find this silly.
    
    Dumb it down as follows:
    
    * Drop MODULE_INIT_QAPI entirely
    
    * Give the generated qmp_init_marshal() external linkage.
    
    * Call it instead of module_call_init(MODULE_INIT_QAPI)
    
    * Except in QEMU proper, call new monitor_init_qmp_commands() that in
      turn calls the generated qmp_init_marshal(), registers the
      additional commands and unregisters the unwanted ones.
    
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Message-Id: <1488544368-30622-5-git-send-email-armbru@redhat.com>
    05875687
    qmp: Dumb down how we run QMP command registration
    Markus Armbruster authored
    
    
    The way we get QMP commands registered is high tech:
    
    * qapi-commands.py generates qmp_init_marshal() that does the actual work
    
    * it also generates the magic to register it as a MODULE_INIT_QAPI
      function, so it runs when someone calls
      module_call_init(MODULE_INIT_QAPI)
    
    * main() calls module_call_init()
    
    QEMU needs to register a few non-qapified commands.  Same high tech
    works: monitor.c has its own qmp_init_marshal() along with the magic
    to make it run in module_call_init(MODULE_INIT_QAPI).
    
    QEMU also needs to unregister commands that are not wanted in this
    build's configuration (commit 5032a16d).  Simple enough:
    qmp_unregister_commands_hack().  The difficulty is to make it run
    after the generated qmp_init_marshal().  We can't simply run it in
    monitor.c's qmp_init_marshal(), because the order in which the
    registered functions run is indeterminate.  So qmp_init_marshal()
    registers qmp_unregister_commands_hack() separately.  Since
    registering *appends* to the list of registered functions, this will
    make it run after all the functions that have been registered already.
    
    I suspect it takes a long and expensive computer science education to
    not find this silly.
    
    Dumb it down as follows:
    
    * Drop MODULE_INIT_QAPI entirely
    
    * Give the generated qmp_init_marshal() external linkage.
    
    * Call it instead of module_call_init(MODULE_INIT_QAPI)
    
    * Except in QEMU proper, call new monitor_init_qmp_commands() that in
      turn calls the generated qmp_init_marshal(), registers the
      additional commands and unregisters the unwanted ones.
    
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Message-Id: <1488544368-30622-5-git-send-email-armbru@redhat.com>
Loading