<title>SPARC Architectural Model: Device and Utility API
</title>
<body bgcolor=
"#FFFFFF" LANG=
"en-US">
mmi_register_config_cb
</h2>
<ul>mmi_register_config_cb - Register callback for configuration events
</ul>
<font color=
"#0000FF">#include
"mmi.h"</font>
<p>typedef enum {MMI_CONFIG_NEW_MODULE, MMI_CONFIG_DELETE_MODULE, MMI_CONFIG_INIT_DONE} mmi_config_t;
<p>typedef void (*
<i>fn_config_cb
</i>) (void *
<i>cb_data
</i>,
module_t *
<i>target
</i>, const char *
<i>target_name
</i>, mmi_config_t
<i>event
</i>);
<p>bool_t mmi_register_config_cb (module_t *
<i>module
</i>, fn_config_cb
<i>config_cb
</i>);
Register
<i>config_cb
</i> callback for
<i>module
</i>.
The callback is used to act on configuration events:
<p>MMI_CONFIG_NEW_MODULE: reports that
<i>target
</i> has been loaded.
At this point, it is possible to call
<b>mmi_get_interface
</b> for
<i>target
</i>.
<p>MMI_CONFIG_DELETE_MODULE: reports that
<i>target
</i> has been unloaded.
1) A module detects that itself is being unloaded, and frees any resources.
2) A module detects that another module it has in interface or other reference to is unloaded. Dangling pointers must be deleted.
<p>MMI_CONFIG_INIT_DONE: reports that simulator initialization is complete.
The module can reference CPU and other data structures at this point.
<p><b>mmi_register_config_cb
</b> has several side effects:
1) all other modules are notified that the caller is available (MMI_CONFIG_NEW_MODULE),
2) the caller is notified of all modules already loaded (MMI_CONFIG_NEW_MODULE),
3) the caller is notified immediately if simulator initialization is complete (MMI_CONFIG_INIT_DONE).
static void module_reconfig(void *cb_data, module_t *target, const char *target_name, mmi_config_t ev)
Module *module = (Module*)cb_data;
if (target == module-
>getInstance()) {
if (ev == MMI_CONFIG_DELETE_MODULE)
else if (ev == MMI_CONFIG_INIT_DONE)
} else if (ev == MMI_CONFIG_NEW_MODULE) {
module-
>module_added(target, target_name);
} else if (ev == MMI_CONFIG_DELETE_MODULE) {
module-
>module_deleted(target, target_name);
// called during ldm and sysconf, after _init
static void module_create_instance(const char *modname, const char *instance_name)
module_t *instance = mmi_register_module(modname, instance_name, Module::get_help_string());
Module *module = Module::create(modname, instance_name);
fprintf(stderr,
"Module: Could not create object for <%s>\n", instance_name);
mmi_unregister_module(instance);
fprintf(stderr,
"Module: modname <%s> instance_name <%s>\n", modname, instance_name);
module_parse_args(module, instance);
if (!module-
>check_args()) {
mmi_unregister_module(instance);
mmi_register_cb_data(instance, module);
mmi_register_interface_cb(instance, module_get_interface);
mmi_register_modinfo_cb(instance, module_get_modinfo);
mmi_register_config_cb(instance, module_reconfig);
// module init, called during dlopen
fprintf (stderr, MODNAME
": _init()\n");
if (! mmi_register_instance_creator (MODNAME, module_create_instance )) {
fprintf (stderr, MODNAME
": Failed to load\n");
// called by dlclose during uldm and exit
<a href=
"intro.html">intro
</a>,
<a href=
"mmi_register_module.html">mmi_unregister_module
</a>