Change RPC dispatch to use an array lookup for handler functions

上级 746f4373
Thu Dec 4 22:01:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
* qemud/remote.c: Change from a giant switch() on RPC number
into a simple array lookup of RPC handler function
* qemud/Makefile.am, qemud/remote_generate_stubs.pl: Change
generator to produce a union of data types for O(1) dispatch
* qemud/remote_dispatch_*: Re-generate files
Thu Dec 4 21:49:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
Per object locking implementation
......
......@@ -5,8 +5,9 @@ DAEMON_SOURCES = \
qemud.c qemud.h \
remote.c \
remote_dispatch_prototypes.h \
remote_dispatch_localvars.h \
remote_dispatch_proc_switch.h \
remote_dispatch_table.h \
remote_dispatch_args.h \
remote_dispatch_ret.h \
remote_protocol.h remote_protocol.c
AVAHI_SOURCES = \
......@@ -179,17 +180,22 @@ endif
remote.c: remote_dispatch_prototypes.h \
remote_dispatch_localvars.h \
remote_dispatch_proc_switch.h
remote_dispatch_table.h \
remote_dispatch_args.h \
remote_dispatch_ret.h
remote_dispatch_prototypes.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -i $(srcdir)/remote_protocol.x > $@
perl -w $(srcdir)/remote_generate_stubs.pl -p $(srcdir)/remote_protocol.x > $@
remote_dispatch_localvars.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -v $(srcdir)/remote_protocol.x > $@
remote_dispatch_table.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -t $(srcdir)/remote_protocol.x > $@
remote_dispatch_args.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -a $(srcdir)/remote_protocol.x > $@
remote_dispatch_ret.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -r $(srcdir)/remote_protocol.x > $@
remote_dispatch_proc_switch.h: $(srcdir)/remote_generate_stubs.pl remote_protocol.x
perl -w $(srcdir)/remote_generate_stubs.pl -w $(srcdir)/remote_protocol.x > $@
if LIBVIRT_INIT_SCRIPTS_RED_HAT
install-init: libvirtd.init
......
......@@ -71,11 +71,30 @@ static void make_nonnull_node_device (remote_nonnull_node_device *dev_dst, virNo
#include "remote_dispatch_prototypes.h"
typedef union {
#include "remote_dispatch_args.h"
} dispatch_args;
typedef union {
#include "remote_dispatch_ret.h"
} dispatch_ret;
typedef int (*dispatch_fn) (struct qemud_server *server,
struct qemud_client *client,
remote_message_header *req,
char *args,
char *ret);
dispatch_args *args,
dispatch_ret *ret);
typedef struct {
dispatch_fn fn;
xdrproc_t args_filter;
xdrproc_t ret_filter;
} dispatch_data;
static const dispatch_data const dispatch_table[] = {
#include "remote_dispatch_table.h"
};
/* Prototypes */
static void
......@@ -94,13 +113,13 @@ remoteDispatchClientRequest (struct qemud_server *server,
{
XDR xdr;
remote_message_header req, rep;
dispatch_fn fn;
xdrproc_t args_filter = (xdrproc_t) xdr_void;
xdrproc_t ret_filter = (xdrproc_t) xdr_void;
char *args = NULL, *ret = NULL;
dispatch_args args;
dispatch_ret ret;
const dispatch_data *data = NULL;
int rv, len;
#include "remote_dispatch_localvars.h"
memset(&args, 0, sizeof args);
memset(&ret, 0, sizeof ret);
/* Parse the header. */
xdrmem_create (&xdr, client->buffer, client->bufferLength, XDR_DECODE);
......@@ -155,31 +174,27 @@ remoteDispatchClientRequest (struct qemud_server *server,
}
}
/* Based on the procedure number, dispatch. In future we may base
* this on the version number as well.
*/
switch (req.proc) {
#include "remote_dispatch_proc_switch.h"
default:
if (req.proc >= ARRAY_CARDINALITY(dispatch_table) ||
dispatch_table[req.proc].fn == NULL) {
remoteDispatchError (client, &req, _("unknown procedure: %d"),
req.proc);
xdr_destroy (&xdr);
return;
}
/* Parse args. */
if (!(*args_filter) (&xdr, args)) {
data = &(dispatch_table[req.proc]);
/* De-serialize args off the wire */
if (!((data->args_filter)(&xdr, &args))) {
remoteDispatchError (client, &req, "%s", _("parse args failed"));
xdr_destroy (&xdr);
return;
}
xdr_destroy (&xdr);
/* Call function. */
rv = fn (server, client, &req, args, ret);
xdr_free (args_filter, args);
rv = (data->fn)(server, client, &req, &args, &ret);
xdr_free (data->args_filter, (char*)&args);
/* Dispatch function must return -2, -1 or 0. Anything else is
* an internal error.
......@@ -210,25 +225,25 @@ remoteDispatchClientRequest (struct qemud_server *server,
if (!xdr_int (&xdr, &len)) {
remoteDispatchError (client, &req, "%s", _("dummy length"));
xdr_destroy (&xdr);
if (rv == 0) xdr_free (ret_filter, ret);
if (rv == 0) xdr_free (data->ret_filter, (char*)&ret);
return;
}
if (!xdr_remote_message_header (&xdr, &rep)) {
remoteDispatchError (client, &req, "%s", _("serialise reply header"));
xdr_destroy (&xdr);
if (rv == 0) xdr_free (ret_filter, ret);
if (rv == 0) xdr_free (data->ret_filter, (char*)&ret);
return;
}
/* If OK, serialise return structure, if error serialise error. */
if (rv == 0) {
if (!(*ret_filter) (&xdr, ret)) {
if (!((data->ret_filter) (&xdr, &ret))) {
remoteDispatchError (client, &req, "%s", _("serialise return struct"));
xdr_destroy (&xdr);
return;
}
xdr_free (ret_filter, ret);
xdr_free (data->ret_filter, (char*)&ret);
} else /* error */ {
virErrorPtr verr;
remote_error error;
......
/* Automatically generated by remote_generate_stubs.pl.
* Do not edit this file. Any changes you make will be lost.
*/
remote_open_args val_remote_open_args;
remote_get_max_vcpus_args val_remote_get_max_vcpus_args;
remote_domain_attach_device_args val_remote_domain_attach_device_args;
remote_domain_create_args val_remote_domain_create_args;
remote_domain_create_xml_args val_remote_domain_create_xml_args;
remote_domain_define_xml_args val_remote_domain_define_xml_args;
remote_domain_destroy_args val_remote_domain_destroy_args;
remote_domain_detach_device_args val_remote_domain_detach_device_args;
remote_domain_dump_xml_args val_remote_domain_dump_xml_args;
remote_domain_get_autostart_args val_remote_domain_get_autostart_args;
remote_domain_get_info_args val_remote_domain_get_info_args;
remote_domain_get_max_memory_args val_remote_domain_get_max_memory_args;
remote_domain_get_max_vcpus_args val_remote_domain_get_max_vcpus_args;
remote_domain_get_os_type_args val_remote_domain_get_os_type_args;
remote_domain_get_vcpus_args val_remote_domain_get_vcpus_args;
remote_list_defined_domains_args val_remote_list_defined_domains_args;
remote_domain_lookup_by_id_args val_remote_domain_lookup_by_id_args;
remote_domain_lookup_by_name_args val_remote_domain_lookup_by_name_args;
remote_domain_lookup_by_uuid_args val_remote_domain_lookup_by_uuid_args;
remote_domain_pin_vcpu_args val_remote_domain_pin_vcpu_args;
remote_domain_reboot_args val_remote_domain_reboot_args;
remote_domain_resume_args val_remote_domain_resume_args;
remote_domain_set_autostart_args val_remote_domain_set_autostart_args;
remote_domain_set_max_memory_args val_remote_domain_set_max_memory_args;
remote_domain_set_memory_args val_remote_domain_set_memory_args;
remote_domain_set_vcpus_args val_remote_domain_set_vcpus_args;
remote_domain_shutdown_args val_remote_domain_shutdown_args;
remote_domain_suspend_args val_remote_domain_suspend_args;
remote_domain_undefine_args val_remote_domain_undefine_args;
remote_list_defined_networks_args val_remote_list_defined_networks_args;
remote_list_domains_args val_remote_list_domains_args;
remote_list_networks_args val_remote_list_networks_args;
remote_network_create_args val_remote_network_create_args;
remote_network_create_xml_args val_remote_network_create_xml_args;
remote_network_define_xml_args val_remote_network_define_xml_args;
remote_network_destroy_args val_remote_network_destroy_args;
remote_network_dump_xml_args val_remote_network_dump_xml_args;
remote_network_get_autostart_args val_remote_network_get_autostart_args;
remote_network_get_bridge_name_args val_remote_network_get_bridge_name_args;
remote_network_lookup_by_name_args val_remote_network_lookup_by_name_args;
remote_network_lookup_by_uuid_args val_remote_network_lookup_by_uuid_args;
remote_network_set_autostart_args val_remote_network_set_autostart_args;
remote_network_undefine_args val_remote_network_undefine_args;
remote_domain_core_dump_args val_remote_domain_core_dump_args;
remote_domain_restore_args val_remote_domain_restore_args;
remote_domain_save_args val_remote_domain_save_args;
remote_domain_get_scheduler_type_args val_remote_domain_get_scheduler_type_args;
remote_domain_get_scheduler_parameters_args val_remote_domain_get_scheduler_parameters_args;
remote_domain_set_scheduler_parameters_args val_remote_domain_set_scheduler_parameters_args;
remote_supports_feature_args val_remote_supports_feature_args;
remote_domain_migrate_prepare_args val_remote_domain_migrate_prepare_args;
remote_domain_migrate_perform_args val_remote_domain_migrate_perform_args;
remote_domain_migrate_finish_args val_remote_domain_migrate_finish_args;
remote_domain_block_stats_args val_remote_domain_block_stats_args;
remote_domain_interface_stats_args val_remote_domain_interface_stats_args;
remote_auth_sasl_start_args val_remote_auth_sasl_start_args;
remote_auth_sasl_step_args val_remote_auth_sasl_step_args;
remote_list_storage_pools_args val_remote_list_storage_pools_args;
remote_list_defined_storage_pools_args val_remote_list_defined_storage_pools_args;
remote_find_storage_pool_sources_args val_remote_find_storage_pool_sources_args;
remote_storage_pool_create_xml_args val_remote_storage_pool_create_xml_args;
remote_storage_pool_define_xml_args val_remote_storage_pool_define_xml_args;
remote_storage_pool_create_args val_remote_storage_pool_create_args;
remote_storage_pool_build_args val_remote_storage_pool_build_args;
remote_storage_pool_destroy_args val_remote_storage_pool_destroy_args;
remote_storage_pool_delete_args val_remote_storage_pool_delete_args;
remote_storage_pool_undefine_args val_remote_storage_pool_undefine_args;
remote_storage_pool_refresh_args val_remote_storage_pool_refresh_args;
remote_storage_pool_lookup_by_name_args val_remote_storage_pool_lookup_by_name_args;
remote_storage_pool_lookup_by_uuid_args val_remote_storage_pool_lookup_by_uuid_args;
remote_storage_pool_lookup_by_volume_args val_remote_storage_pool_lookup_by_volume_args;
remote_storage_pool_get_info_args val_remote_storage_pool_get_info_args;
remote_storage_pool_dump_xml_args val_remote_storage_pool_dump_xml_args;
remote_storage_pool_get_autostart_args val_remote_storage_pool_get_autostart_args;
remote_storage_pool_set_autostart_args val_remote_storage_pool_set_autostart_args;
remote_storage_pool_num_of_volumes_args val_remote_storage_pool_num_of_volumes_args;
remote_storage_pool_list_volumes_args val_remote_storage_pool_list_volumes_args;
remote_storage_vol_create_xml_args val_remote_storage_vol_create_xml_args;
remote_storage_vol_delete_args val_remote_storage_vol_delete_args;
remote_storage_vol_lookup_by_name_args val_remote_storage_vol_lookup_by_name_args;
remote_storage_vol_lookup_by_key_args val_remote_storage_vol_lookup_by_key_args;
remote_storage_vol_lookup_by_path_args val_remote_storage_vol_lookup_by_path_args;
remote_storage_vol_get_info_args val_remote_storage_vol_get_info_args;
remote_storage_vol_dump_xml_args val_remote_storage_vol_dump_xml_args;
remote_storage_vol_get_path_args val_remote_storage_vol_get_path_args;
remote_node_get_cells_free_memory_args val_remote_node_get_cells_free_memory_args;
remote_domain_block_peek_args val_remote_domain_block_peek_args;
remote_domain_memory_peek_args val_remote_domain_memory_peek_args;
remote_domain_migrate_prepare2_args val_remote_domain_migrate_prepare2_args;
remote_domain_migrate_finish2_args val_remote_domain_migrate_finish2_args;
remote_node_num_of_devices_args val_remote_node_num_of_devices_args;
remote_node_list_devices_args val_remote_node_list_devices_args;
remote_node_device_lookup_by_name_args val_remote_node_device_lookup_by_name_args;
remote_node_device_dump_xml_args val_remote_node_device_dump_xml_args;
remote_node_device_get_parent_args val_remote_node_device_get_parent_args;
remote_node_device_num_of_caps_args val_remote_node_device_num_of_caps_args;
remote_node_device_list_caps_args val_remote_node_device_list_caps_args;
/* Automatically generated by remote_generate_stubs.pl.
* Do not edit this file. Any changes you make will be lost.
*/
remote_domain_lookup_by_uuid_args lv_remote_domain_lookup_by_uuid_args;
remote_domain_lookup_by_uuid_ret lv_remote_domain_lookup_by_uuid_ret;
remote_storage_pool_list_volumes_args lv_remote_storage_pool_list_volumes_args;
remote_storage_pool_list_volumes_ret lv_remote_storage_pool_list_volumes_ret;
remote_domain_events_deregister_ret lv_remote_domain_events_deregister_ret;
remote_node_device_get_parent_args lv_remote_node_device_get_parent_args;
remote_node_device_get_parent_ret lv_remote_node_device_get_parent_ret;
remote_domain_shutdown_args lv_remote_domain_shutdown_args;
remote_list_defined_domains_args lv_remote_list_defined_domains_args;
remote_list_defined_domains_ret lv_remote_list_defined_domains_ret;
remote_get_capabilities_ret lv_remote_get_capabilities_ret;
remote_storage_vol_create_xml_args lv_remote_storage_vol_create_xml_args;
remote_storage_vol_create_xml_ret lv_remote_storage_vol_create_xml_ret;
remote_domain_set_max_memory_args lv_remote_domain_set_max_memory_args;
remote_auth_sasl_init_ret lv_remote_auth_sasl_init_ret;
remote_domain_get_os_type_args lv_remote_domain_get_os_type_args;
remote_domain_get_os_type_ret lv_remote_domain_get_os_type_ret;
remote_domain_get_autostart_args lv_remote_domain_get_autostart_args;
remote_domain_get_autostart_ret lv_remote_domain_get_autostart_ret;
remote_domain_set_vcpus_args lv_remote_domain_set_vcpus_args;
remote_get_hostname_ret lv_remote_get_hostname_ret;
remote_domain_events_register_ret lv_remote_domain_events_register_ret;
remote_network_undefine_args lv_remote_network_undefine_args;
remote_domain_create_args lv_remote_domain_create_args;
remote_network_destroy_args lv_remote_network_destroy_args;
remote_storage_vol_lookup_by_key_args lv_remote_storage_vol_lookup_by_key_args;
remote_storage_vol_lookup_by_key_ret lv_remote_storage_vol_lookup_by_key_ret;
remote_storage_pool_lookup_by_uuid_args lv_remote_storage_pool_lookup_by_uuid_args;
remote_storage_pool_lookup_by_uuid_ret lv_remote_storage_pool_lookup_by_uuid_ret;
remote_domain_pin_vcpu_args lv_remote_domain_pin_vcpu_args;
remote_list_defined_networks_args lv_remote_list_defined_networks_args;
remote_list_defined_networks_ret lv_remote_list_defined_networks_ret;
remote_network_create_xml_args lv_remote_network_create_xml_args;
remote_network_create_xml_ret lv_remote_network_create_xml_ret;
remote_node_device_list_caps_args lv_remote_node_device_list_caps_args;
remote_node_device_list_caps_ret lv_remote_node_device_list_caps_ret;
remote_open_args lv_remote_open_args;
remote_storage_pool_refresh_args lv_remote_storage_pool_refresh_args;
remote_storage_vol_lookup_by_path_args lv_remote_storage_vol_lookup_by_path_args;
remote_storage_vol_lookup_by_path_ret lv_remote_storage_vol_lookup_by_path_ret;
remote_list_domains_args lv_remote_list_domains_args;
remote_list_domains_ret lv_remote_list_domains_ret;
remote_network_define_xml_args lv_remote_network_define_xml_args;
remote_network_define_xml_ret lv_remote_network_define_xml_ret;
remote_get_type_ret lv_remote_get_type_ret;
remote_domain_block_peek_args lv_remote_domain_block_peek_args;
remote_domain_block_peek_ret lv_remote_domain_block_peek_ret;
remote_storage_vol_delete_args lv_remote_storage_vol_delete_args;
remote_network_dump_xml_args lv_remote_network_dump_xml_args;
remote_network_dump_xml_ret lv_remote_network_dump_xml_ret;
remote_domain_reboot_args lv_remote_domain_reboot_args;
remote_domain_set_memory_args lv_remote_domain_set_memory_args;
remote_storage_pool_destroy_args lv_remote_storage_pool_destroy_args;
remote_domain_set_scheduler_parameters_args lv_remote_domain_set_scheduler_parameters_args;
remote_auth_polkit_ret lv_remote_auth_polkit_ret;
remote_auth_sasl_start_args lv_remote_auth_sasl_start_args;
remote_auth_sasl_start_ret lv_remote_auth_sasl_start_ret;
remote_domain_interface_stats_args lv_remote_domain_interface_stats_args;
remote_domain_interface_stats_ret lv_remote_domain_interface_stats_ret;
remote_storage_pool_dump_xml_args lv_remote_storage_pool_dump_xml_args;
remote_storage_pool_dump_xml_ret lv_remote_storage_pool_dump_xml_ret;
remote_storage_pool_create_xml_args lv_remote_storage_pool_create_xml_args;
remote_storage_pool_create_xml_ret lv_remote_storage_pool_create_xml_ret;
remote_storage_pool_build_args lv_remote_storage_pool_build_args;
remote_storage_pool_delete_args lv_remote_storage_pool_delete_args;
remote_storage_pool_lookup_by_volume_args lv_remote_storage_pool_lookup_by_volume_args;
remote_storage_pool_lookup_by_volume_ret lv_remote_storage_pool_lookup_by_volume_ret;
remote_domain_get_max_vcpus_args lv_remote_domain_get_max_vcpus_args;
remote_domain_get_max_vcpus_ret lv_remote_domain_get_max_vcpus_ret;
remote_node_device_num_of_caps_args lv_remote_node_device_num_of_caps_args;
remote_node_device_num_of_caps_ret lv_remote_node_device_num_of_caps_ret;
remote_domain_get_info_args lv_remote_domain_get_info_args;
remote_domain_get_info_ret lv_remote_domain_get_info_ret;
remote_storage_pool_num_of_volumes_args lv_remote_storage_pool_num_of_volumes_args;
remote_storage_pool_num_of_volumes_ret lv_remote_storage_pool_num_of_volumes_ret;
remote_supports_feature_args lv_remote_supports_feature_args;
remote_supports_feature_ret lv_remote_supports_feature_ret;
remote_domain_lookup_by_name_args lv_remote_domain_lookup_by_name_args;
remote_domain_lookup_by_name_ret lv_remote_domain_lookup_by_name_ret;
remote_storage_pool_set_autostart_args lv_remote_storage_pool_set_autostart_args;
remote_domain_resume_args lv_remote_domain_resume_args;
remote_network_get_bridge_name_args lv_remote_network_get_bridge_name_args;
remote_network_get_bridge_name_ret lv_remote_network_get_bridge_name_ret;
remote_domain_destroy_args lv_remote_domain_destroy_args;
remote_find_storage_pool_sources_args lv_remote_find_storage_pool_sources_args;
remote_find_storage_pool_sources_ret lv_remote_find_storage_pool_sources_ret;
remote_node_num_of_devices_args lv_remote_node_num_of_devices_args;
remote_node_num_of_devices_ret lv_remote_node_num_of_devices_ret;
remote_auth_sasl_step_args lv_remote_auth_sasl_step_args;
remote_auth_sasl_step_ret lv_remote_auth_sasl_step_ret;
remote_domain_migrate_finish_args lv_remote_domain_migrate_finish_args;
remote_domain_migrate_finish_ret lv_remote_domain_migrate_finish_ret;
remote_domain_get_vcpus_args lv_remote_domain_get_vcpus_args;
remote_domain_get_vcpus_ret lv_remote_domain_get_vcpus_ret;
remote_domain_get_scheduler_parameters_args lv_remote_domain_get_scheduler_parameters_args;
remote_domain_get_scheduler_parameters_ret lv_remote_domain_get_scheduler_parameters_ret;
remote_node_get_info_ret lv_remote_node_get_info_ret;
remote_node_device_dump_xml_args lv_remote_node_device_dump_xml_args;
remote_node_device_dump_xml_ret lv_remote_node_device_dump_xml_ret;
remote_node_device_lookup_by_name_args lv_remote_node_device_lookup_by_name_args;
remote_node_device_lookup_by_name_ret lv_remote_node_device_lookup_by_name_ret;
remote_network_lookup_by_name_args lv_remote_network_lookup_by_name_args;
remote_network_lookup_by_name_ret lv_remote_network_lookup_by_name_ret;
remote_domain_memory_peek_args lv_remote_domain_memory_peek_args;
remote_domain_memory_peek_ret lv_remote_domain_memory_peek_ret;
remote_num_of_defined_domains_ret lv_remote_num_of_defined_domains_ret;
remote_node_list_devices_args lv_remote_node_list_devices_args;
remote_node_list_devices_ret lv_remote_node_list_devices_ret;
remote_domain_block_stats_args lv_remote_domain_block_stats_args;
remote_domain_block_stats_ret lv_remote_domain_block_stats_ret;
remote_domain_detach_device_args lv_remote_domain_detach_device_args;
remote_num_of_storage_pools_ret lv_remote_num_of_storage_pools_ret;
remote_domain_save_args lv_remote_domain_save_args;
remote_domain_migrate_prepare_args lv_remote_domain_migrate_prepare_args;
remote_domain_migrate_prepare_ret lv_remote_domain_migrate_prepare_ret;
remote_domain_create_xml_args lv_remote_domain_create_xml_args;
remote_domain_create_xml_ret lv_remote_domain_create_xml_ret;
remote_domain_undefine_args lv_remote_domain_undefine_args;
remote_node_get_cells_free_memory_args lv_remote_node_get_cells_free_memory_args;
remote_node_get_cells_free_memory_ret lv_remote_node_get_cells_free_memory_ret;
remote_domain_get_scheduler_type_args lv_remote_domain_get_scheduler_type_args;
remote_domain_get_scheduler_type_ret lv_remote_domain_get_scheduler_type_ret;
remote_get_version_ret lv_remote_get_version_ret;
remote_domain_suspend_args lv_remote_domain_suspend_args;
remote_storage_pool_lookup_by_name_args lv_remote_storage_pool_lookup_by_name_args;
remote_storage_pool_lookup_by_name_ret lv_remote_storage_pool_lookup_by_name_ret;
remote_network_set_autostart_args lv_remote_network_set_autostart_args;
remote_network_get_autostart_args lv_remote_network_get_autostart_args;
remote_network_get_autostart_ret lv_remote_network_get_autostart_ret;
remote_storage_pool_create_args lv_remote_storage_pool_create_args;
remote_auth_list_ret lv_remote_auth_list_ret;
remote_num_of_defined_storage_pools_ret lv_remote_num_of_defined_storage_pools_ret;
remote_domain_core_dump_args lv_remote_domain_core_dump_args;
remote_list_defined_storage_pools_args lv_remote_list_defined_storage_pools_args;
remote_list_defined_storage_pools_ret lv_remote_list_defined_storage_pools_ret;
remote_domain_event_ret lv_remote_domain_event_ret;
remote_domain_get_max_memory_args lv_remote_domain_get_max_memory_args;
remote_domain_get_max_memory_ret lv_remote_domain_get_max_memory_ret;
remote_num_of_domains_ret lv_remote_num_of_domains_ret;
remote_list_networks_args lv_remote_list_networks_args;
remote_list_networks_ret lv_remote_list_networks_ret;
remote_storage_pool_undefine_args lv_remote_storage_pool_undefine_args;
remote_domain_migrate_finish2_args lv_remote_domain_migrate_finish2_args;
remote_domain_migrate_finish2_ret lv_remote_domain_migrate_finish2_ret;
remote_domain_set_autostart_args lv_remote_domain_set_autostart_args;
remote_storage_pool_get_autostart_args lv_remote_storage_pool_get_autostart_args;
remote_storage_pool_get_autostart_ret lv_remote_storage_pool_get_autostart_ret;
remote_node_get_free_memory_ret lv_remote_node_get_free_memory_ret;
remote_domain_migrate_prepare2_args lv_remote_domain_migrate_prepare2_args;
remote_domain_migrate_prepare2_ret lv_remote_domain_migrate_prepare2_ret;
remote_storage_vol_get_path_args lv_remote_storage_vol_get_path_args;
remote_storage_vol_get_path_ret lv_remote_storage_vol_get_path_ret;
remote_domain_lookup_by_id_args lv_remote_domain_lookup_by_id_args;
remote_domain_lookup_by_id_ret lv_remote_domain_lookup_by_id_ret;
remote_get_uri_ret lv_remote_get_uri_ret;
remote_domain_attach_device_args lv_remote_domain_attach_device_args;
remote_num_of_networks_ret lv_remote_num_of_networks_ret;
remote_storage_pool_get_info_args lv_remote_storage_pool_get_info_args;
remote_storage_pool_get_info_ret lv_remote_storage_pool_get_info_ret;
remote_list_storage_pools_args lv_remote_list_storage_pools_args;
remote_list_storage_pools_ret lv_remote_list_storage_pools_ret;
remote_domain_restore_args lv_remote_domain_restore_args;
remote_network_create_args lv_remote_network_create_args;
remote_num_of_defined_networks_ret lv_remote_num_of_defined_networks_ret;
remote_storage_vol_lookup_by_name_args lv_remote_storage_vol_lookup_by_name_args;
remote_storage_vol_lookup_by_name_ret lv_remote_storage_vol_lookup_by_name_ret;
remote_storage_pool_define_xml_args lv_remote_storage_pool_define_xml_args;
remote_storage_pool_define_xml_ret lv_remote_storage_pool_define_xml_ret;
remote_network_lookup_by_uuid_args lv_remote_network_lookup_by_uuid_args;
remote_network_lookup_by_uuid_ret lv_remote_network_lookup_by_uuid_ret;
remote_storage_vol_get_info_args lv_remote_storage_vol_get_info_args;
remote_storage_vol_get_info_ret lv_remote_storage_vol_get_info_ret;
remote_domain_define_xml_args lv_remote_domain_define_xml_args;
remote_domain_define_xml_ret lv_remote_domain_define_xml_ret;
remote_storage_vol_dump_xml_args lv_remote_storage_vol_dump_xml_args;
remote_storage_vol_dump_xml_ret lv_remote_storage_vol_dump_xml_ret;
remote_domain_dump_xml_args lv_remote_domain_dump_xml_args;
remote_domain_dump_xml_ret lv_remote_domain_dump_xml_ret;
remote_get_max_vcpus_args lv_remote_get_max_vcpus_args;
remote_get_max_vcpus_ret lv_remote_get_max_vcpus_ret;
remote_domain_migrate_perform_args lv_remote_domain_migrate_perform_args;
此差异已折叠。
/* Automatically generated by remote_generate_stubs.pl.
* Do not edit this file. Any changes you make will be lost.
*/
remote_get_type_ret val_remote_get_type_ret;
remote_get_version_ret val_remote_get_version_ret;
remote_get_max_vcpus_ret val_remote_get_max_vcpus_ret;
remote_node_get_info_ret val_remote_node_get_info_ret;
remote_get_capabilities_ret val_remote_get_capabilities_ret;
remote_domain_create_xml_ret val_remote_domain_create_xml_ret;
remote_domain_define_xml_ret val_remote_domain_define_xml_ret;
remote_domain_dump_xml_ret val_remote_domain_dump_xml_ret;
remote_domain_get_autostart_ret val_remote_domain_get_autostart_ret;
remote_domain_get_info_ret val_remote_domain_get_info_ret;
remote_domain_get_max_memory_ret val_remote_domain_get_max_memory_ret;
remote_domain_get_max_vcpus_ret val_remote_domain_get_max_vcpus_ret;
remote_domain_get_os_type_ret val_remote_domain_get_os_type_ret;
remote_domain_get_vcpus_ret val_remote_domain_get_vcpus_ret;
remote_list_defined_domains_ret val_remote_list_defined_domains_ret;
remote_domain_lookup_by_id_ret val_remote_domain_lookup_by_id_ret;
remote_domain_lookup_by_name_ret val_remote_domain_lookup_by_name_ret;
remote_domain_lookup_by_uuid_ret val_remote_domain_lookup_by_uuid_ret;
remote_num_of_defined_domains_ret val_remote_num_of_defined_domains_ret;
remote_list_defined_networks_ret val_remote_list_defined_networks_ret;
remote_list_domains_ret val_remote_list_domains_ret;
remote_list_networks_ret val_remote_list_networks_ret;
remote_network_create_xml_ret val_remote_network_create_xml_ret;
remote_network_define_xml_ret val_remote_network_define_xml_ret;
remote_network_dump_xml_ret val_remote_network_dump_xml_ret;
remote_network_get_autostart_ret val_remote_network_get_autostart_ret;
remote_network_get_bridge_name_ret val_remote_network_get_bridge_name_ret;
remote_network_lookup_by_name_ret val_remote_network_lookup_by_name_ret;
remote_network_lookup_by_uuid_ret val_remote_network_lookup_by_uuid_ret;
remote_num_of_defined_networks_ret val_remote_num_of_defined_networks_ret;
remote_num_of_domains_ret val_remote_num_of_domains_ret;
remote_num_of_networks_ret val_remote_num_of_networks_ret;
remote_domain_get_scheduler_type_ret val_remote_domain_get_scheduler_type_ret;
remote_domain_get_scheduler_parameters_ret val_remote_domain_get_scheduler_parameters_ret;
remote_get_hostname_ret val_remote_get_hostname_ret;
remote_supports_feature_ret val_remote_supports_feature_ret;
remote_domain_migrate_prepare_ret val_remote_domain_migrate_prepare_ret;
remote_domain_migrate_finish_ret val_remote_domain_migrate_finish_ret;
remote_domain_block_stats_ret val_remote_domain_block_stats_ret;
remote_domain_interface_stats_ret val_remote_domain_interface_stats_ret;
remote_auth_list_ret val_remote_auth_list_ret;
remote_auth_sasl_init_ret val_remote_auth_sasl_init_ret;
remote_auth_sasl_start_ret val_remote_auth_sasl_start_ret;
remote_auth_sasl_step_ret val_remote_auth_sasl_step_ret;
remote_auth_polkit_ret val_remote_auth_polkit_ret;
remote_num_of_storage_pools_ret val_remote_num_of_storage_pools_ret;
remote_list_storage_pools_ret val_remote_list_storage_pools_ret;
remote_num_of_defined_storage_pools_ret val_remote_num_of_defined_storage_pools_ret;
remote_list_defined_storage_pools_ret val_remote_list_defined_storage_pools_ret;
remote_find_storage_pool_sources_ret val_remote_find_storage_pool_sources_ret;
remote_storage_pool_create_xml_ret val_remote_storage_pool_create_xml_ret;
remote_storage_pool_define_xml_ret val_remote_storage_pool_define_xml_ret;
remote_storage_pool_lookup_by_name_ret val_remote_storage_pool_lookup_by_name_ret;
remote_storage_pool_lookup_by_uuid_ret val_remote_storage_pool_lookup_by_uuid_ret;
remote_storage_pool_lookup_by_volume_ret val_remote_storage_pool_lookup_by_volume_ret;
remote_storage_pool_get_info_ret val_remote_storage_pool_get_info_ret;
remote_storage_pool_dump_xml_ret val_remote_storage_pool_dump_xml_ret;
remote_storage_pool_get_autostart_ret val_remote_storage_pool_get_autostart_ret;
remote_storage_pool_num_of_volumes_ret val_remote_storage_pool_num_of_volumes_ret;
remote_storage_pool_list_volumes_ret val_remote_storage_pool_list_volumes_ret;
remote_storage_vol_create_xml_ret val_remote_storage_vol_create_xml_ret;
remote_storage_vol_lookup_by_name_ret val_remote_storage_vol_lookup_by_name_ret;
remote_storage_vol_lookup_by_key_ret val_remote_storage_vol_lookup_by_key_ret;
remote_storage_vol_lookup_by_path_ret val_remote_storage_vol_lookup_by_path_ret;
remote_storage_vol_get_info_ret val_remote_storage_vol_get_info_ret;
remote_storage_vol_dump_xml_ret val_remote_storage_vol_dump_xml_ret;
remote_storage_vol_get_path_ret val_remote_storage_vol_get_path_ret;
remote_node_get_cells_free_memory_ret val_remote_node_get_cells_free_memory_ret;
remote_node_get_free_memory_ret val_remote_node_get_free_memory_ret;
remote_domain_block_peek_ret val_remote_domain_block_peek_ret;
remote_domain_memory_peek_ret val_remote_domain_memory_peek_ret;
remote_domain_events_register_ret val_remote_domain_events_register_ret;
remote_domain_events_deregister_ret val_remote_domain_events_deregister_ret;
remote_domain_event_ret val_remote_domain_event_ret;
remote_domain_migrate_prepare2_ret val_remote_domain_migrate_prepare2_ret;
remote_domain_migrate_finish2_ret val_remote_domain_migrate_finish2_ret;
remote_get_uri_ret val_remote_get_uri_ret;
remote_node_num_of_devices_ret val_remote_node_num_of_devices_ret;
remote_node_list_devices_ret val_remote_node_list_devices_ret;
remote_node_device_lookup_by_name_ret val_remote_node_device_lookup_by_name_ret;
remote_node_device_dump_xml_ret val_remote_node_device_dump_xml_ret;
remote_node_device_get_parent_ret val_remote_node_device_get_parent_ret;
remote_node_device_num_of_caps_ret val_remote_node_device_num_of_caps_ret;
remote_node_device_list_caps_ret val_remote_node_device_list_caps_ret;
此差异已折叠。
......@@ -12,8 +12,8 @@ use strict;
use Getopt::Std;
# Command line options.
our ($opt_c, $opt_d, $opt_i, $opt_s, $opt_v, $opt_w);
getopts ('cdisvw');
our ($opt_p, $opt_t, $opt_a, $opt_r, $opt_d);
getopts ('ptard');
# Convert name_of_call to NameOfCall.
sub name_to_ProcName {
......@@ -25,7 +25,17 @@ sub name_to_ProcName {
# Read the input file (usually remote_protocol.x) and form an
# opinion about the name, args and return type of each RPC.
my ($name, $ProcName, %calls);
my ($name, $ProcName, $id, %calls, @calls);
# REMOTE_PROC_CLOSE has no args or ret.
$calls{close} = {
name => "close",
ProcName => "Close",
UC_NAME => "CLOSE",
args => "void",
ret => "void",
};
while (<>) {
if (/^struct remote_(.*)_args/) {
$name = $1;
......@@ -57,18 +67,15 @@ while (<>) {
ret => "remote_${name}_ret"
}
}
} elsif (/^\s*REMOTE_PROC_(.*?)\s+=\s+(\d+),?$/) {
$name = lc $1;
$id = $2;
$ProcName = name_to_ProcName ($name);
$calls[$id] = $calls{$name};
}
}
# REMOTE_PROC_CLOSE has no args or ret.
$calls{close} = {
name => "close",
ProcName => "Close",
UC_NAME => "CLOSE",
args => "void",
ret => "void",
};
#----------------------------------------------------------------------
# Output
......@@ -90,135 +97,59 @@ if ($opt_d) {
}
# Prototypes for dispatch functions ("remote_dispatch_prototypes.h").
elsif ($opt_i) {
elsif ($opt_p) {
my @keys = sort (keys %calls);
foreach (@keys) {
print "static int remoteDispatch$calls{$_}->{ProcName} (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, $calls{$_}->{args} *args, $calls{$_}->{ret} *ret);\n";
}
}
# Local variables used inside remoteDispatchClientRequest
# ("remote_dispatch_localvars.h").
elsif ($opt_v) {
my @values = values %calls;
foreach (@values) {
if ($_->{args} ne "void") {
print "$_->{args} lv_$_->{args};\n";
}
if ($_->{ret} ne "void") {
print "$_->{ret} lv_$_->{ret};\n";
# Union of all arg types
# ("remote_dispatch_args.h").
elsif ($opt_a) {
for ($id = 0 ; $id <= $#calls ; $id++) {
if (defined $calls[$id] &&
$calls[$id]->{args} ne "void") {
print " $calls[$id]->{args} val_$calls[$id]->{args};\n";
}
}
}
# Inside the switch statement, prepare the 'fn', 'args_filter', etc
# ("remote_dispatch_proc_switch.h").
elsif ($opt_w) {
my @keys = sort (keys %calls);
foreach (@keys) {
print "case REMOTE_PROC_$calls{$_}->{UC_NAME}:\n";
print " fn = (dispatch_fn) remoteDispatch$calls{$_}->{ProcName};\n";
if ($calls{$_}->{args} ne "void") {
print " args_filter = (xdrproc_t) xdr_$calls{$_}->{args};\n";
print " args = (char *) &lv_$calls{$_}->{args};\n";
print " memset (&lv_$calls{$_}->{args}, 0, sizeof lv_$calls{$_}->{args});\n"
}
if ($calls{$_}->{ret} ne "void") {
print " ret_filter = (xdrproc_t) xdr_$calls{$_}->{ret};\n";
print " ret = (char *) &lv_$calls{$_}->{ret};\n";
print " memset (&lv_$calls{$_}->{ret}, 0, sizeof lv_$calls{$_}->{ret});\n"
# Union of all arg types
# ("remote_dispatch_ret.h").
elsif ($opt_r) {
for ($id = 0 ; $id <= $#calls ; $id++) {
if (defined $calls[$id] &&
$calls[$id]->{ret} ne "void") {
print " $calls[$id]->{ret} val_$calls[$id]->{ret};\n";
}
print " break;\n";
}
}
# Generate client stubs - just used to generate the first
# version of the stubs in remote_internal.c. They need
# hand-hacking afterwards.
elsif ($opt_c) {
my @keys = sort (keys %calls);
foreach (@keys) {
my $args = $calls{$_}->{args};
my $argsvoid = $args eq "void";
my $ret = $calls{$_}->{ret};
my $retvoid = $ret eq "void";
print "static @@\n";
print "remote$calls{$_}->{ProcName} (@@)\n";
print "{\n";
if (!$argsvoid) {
print " $args args;\n";
}
if (!$retvoid) {
print " $ret ret;\n";
}
print " GET_PRIVATE (conn, @@);\n";
print "\n";
if (!$argsvoid) {
print " @@\n";
print "\n";
}
if (!$retvoid) {
print " memset (&ret, 0, sizeof ret);\n";
}
print " if (call (conn, priv, 0, REMOTE_PROC_$calls{$_}->{UC_NAME},\n";
print " (xdrproc_t) xdr_$args, (char *) ";
if ($argsvoid) {
print "NULL";
} else {
print "&args";
}
print ",\n";
print " (xdrproc_t) xdr_$ret, (char *) ";
if ($retvoid) {
print "NULL";
# Inside the switch statement, prepare the 'fn', 'args_filter', etc
# ("remote_dispatch_table.h").
elsif ($opt_t) {
for ($id = 0 ; $id <= $#calls ; $id++) {
if (defined $calls[$id]) {
print "{ /* $calls[$id]->{ProcName} => $id */\n";
print " .fn = (dispatch_fn) remoteDispatch$calls[$id]->{ProcName},\n";
if ($calls[$id]->{args} ne "void") {
print " .args_filter = (xdrproc_t) xdr_$calls[$id]->{args},\n";
} else {
print " .args_filter = (xdrproc_t) xdr_void,\n";
}
if ($calls[$id]->{ret} ne "void") {
print " .ret_filter = (xdrproc_t) xdr_$calls[$id]->{ret},\n";
} else {
print " .ret_filter = (xdrproc_t) xdr_void,\n";
}
print "},\n";
} else {
print "&ret";
}
print ") == -1)\n";
print " return -1;\n";
print "\n @@\n";
print "}\n\n";
}
}
# Generate server stubs - just used to generate the first
# version of the stubs in remote.c. They need hand-hacking
# afterwards.
elsif ($opt_s) {
my @keys = sort (keys %calls);
foreach (@keys) {
my $args = $calls{$_}->{args};
my $argsvoid = $args eq "void";
my $ret = $calls{$_}->{ret};
my $retvoid = $ret eq "void";
print "static int\n";
print "remoteDispatch$calls{$_}->{ProcName} (struct qemud_server *server,\n";
print " struct qemud_client *client,\n";
print " remote_message_header *req,\n";
print " remote_get_max_vcpus_args *args,\n";
print " remote_get_max_vcpus_ret *ret)\n";
print "{\n";
if (!$argsvoid || !$retvoid) {
print " @@\n";
}
print " CHECK_CONN;\n";
print "\n";
if (!$argsvoid) {
print " @@\n";
print "\n";
}
print " @@ = vir$calls{$_}->{ProcName} (@@);\n";
print " if (@@) return -1;\n";
print "\n";
if (!$retvoid) {
print " @@\n";
print "\n";
print "{ /* (unused) => $id */\n";
print " .fn = NULL,\n";
print " .args_filter = (xdrproc_t) xdr_void,\n";
print " .ret_filter = (xdrproc_t) xdr_void,\n";
print "},\n";
}
print " return 0;\n";
print "}\n\n";
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
新手
引导
客服 返回
顶部