[hipl-commit] [tiny] Rev 3761: Improved dependency check on daemon startup.

  • From: Tim Just <tim.just@xxxxxxxxxxxxxx>
  • To: hipl-commit@xxxxxxxxxxxxx
  • Date: Thu, 1 Apr 2010 18:38:09 +0300

Committer: Tim Just <tim.just@xxxxxxxxxxxxxx>
Date: 01/04/2010 at 18:38:09
Revision: 3761
Revision-id: tim.just@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Branch nick: tiny

Log:
  Improved dependency check on daemon startup.
  
  Now the dependencies are only checked for enabled modules. Therefore you
  can disable a required module, if you simultaneously disable the dependent
  one.
  
  Also simplified the structure of generated header files and their creation
  in process_modules.py.

Modified:
  M  hipd/init.c
  M  process_modules.py

=== modified file 'hipd/init.c'
--- hipd/init.c 2010-03-31 16:20:58 +0000
+++ hipd/init.c 2010-04-01 15:38:03 +0000
@@ -760,7 +760,7 @@
  */
 int hipd_init(int flush_ipsec, int killold)
 {
-    int err              = 0, certerr = 0, hitdberr = 0, i;
+    int err = 0, certerr = 0, hitdberr = 0, i, j;
     unsigned int mtu_val = HIP_HIT_DEV_MTU;
     char str[64];
     char mtu[16];
@@ -965,25 +965,25 @@
 
     /* Initialize modules */
     HIP_INFO("Initializing modules.\n");
-    /* Check if a required module was disabled. */
-    for (i = 0; i < num_required_modules_hipd; i++) {
-        HIP_IFEL(lmod_module_disabled(required_modules_hipd[i]),
-                 -1,
-                 "The required module <%s> was disabled.\n",
-                 required_modules_hipd[i]);
-    }
-
-    for (i = 0; i < num_modules_hipd; i++) {
-        HIP_DEBUG("module: %s\n", modules_hipd[i]);
-        if (lmod_module_disabled(modules_hipd[i])) {
+    for (i = 0; i < hipd_num_modules; i++) {
+        HIP_DEBUG("module: %s\n", hipd_modules[i].name);
+        if (lmod_module_disabled(hipd_modules[i].name)) {
             HIP_DEBUG("state:  DISABLED\n");
             continue;
         } else {
             HIP_DEBUG("state:  ENABLED\n");
-            HIP_IFEL(hipd_init_functions[i](),
-                     -1,
-                     "Module initialization failed.\n");
+            /* Check dependencies */
+            for (j = 0; j < hipd_modules[i].num_required_moduels; j++) {
+                
HIP_IFEL(lmod_module_disabled(hipd_modules[i].required_modules_hipd[j]),
+                         -1,
+                         "The module <%s> is required by <%s>, but was 
disabled.\n",
+                         hipd_modules[i].required_modules_hipd[j],
+                         hipd_modules[i].name);
+            }
         }
+        HIP_IFEL(hipd_modules[i].init_function(),
+                 -1,
+                 "Module initialization failed.\n");
     }
 
     hip_init_sockets();

=== modified file 'process_modules.py'
--- process_modules.py  2010-03-31 15:16:34 +0000
+++ process_modules.py  2010-04-01 15:38:03 +0000
@@ -12,11 +12,11 @@
 HEADER_FILE_DIR    = MODULES_DIR
 HEADER_FILE_SUFFIX = '_modules.h'
 
-WARNING_STRING = 'WARNING This file was generated by process_modules.py - '
-WARNING_STRING += 'Do NOT edit!'
+WARNING_STRING = 'WARNING This file was generated by ' + __file__ + ' - '
+WARNING_STRING += 'DO NOT EDIT!'
 
 # Parses the XML document at 'path' and returns a dictionary with module info
-def parse_module_info(path, required_modules):
+def parse_xml_info(path):
 
     file = open(path, "r")
     dom = xml.dom.minidom.parse(file)
@@ -38,7 +38,6 @@
                 current_req['maxversion'] = 
str(node.attributes['maxversion'].value)
 
             module_info['requires'].append(current_req)
-            required_modules.add(current_req['name'])
 
     module_info['conflicts'] = []
     if 0 < len(dom.getElementsByTagName('conflicts')):
@@ -66,7 +65,7 @@
         app_info['init_function'] = 
str(current_app.attributes['init_function'].value)
         module_info['application'][name] = app_info
 
-    return (module_name, module_info, required_modules)
+    return (module_name, module_info)
 
 # Tries to read the XML configuration files for all sub-folders in the given
 # directory and returns a dictionary containing the module information
@@ -74,7 +73,6 @@
 
     # Initialize output variable
     module_info = {}
-    required_modules = set()
 
     # Iterate through all sub directories in MODULES_DIR
     for current_module in glob.glob(MODULES_DIR + '/*/'):
@@ -91,8 +89,7 @@
 
         try:
             path = os.path.join(current_module, MODULE_INFO_FILE)
-            (module_name, info, required_modules) = parse_module_info(path,
-                                                                      
required_modules)
+            (module_name, info) = parse_xml_info(path)
             print '|    state:        ' + 'ENABLED'
             print '|    version:      ' + info['version'] + '\n|'
             module_info[module_name] = info
@@ -101,15 +98,11 @@
             print '\'' + path + '\' failed!'
             print '|    ...ignoring this directory\n|'
 
-    return (module_info, required_modules)
+    return (module_info)
 
 # Checks the module_info data structure for missing dependencies and conflicts
 # between modules. Returns a
-def process_module_info(module_info):
-
-    includes = {}
-    init_functions = {}
-    num_modules = {}
+def check_dependencies(module_info):
 
     for current_module in module_info.keys():
         # Check for dependencies
@@ -142,104 +135,78 @@
                     print '|    ERROR ' + current_module + ' conflicts with 
module ' + conflict['name'] + ' (version ' + con_version + ')'
                     sys.exit('|    ...abort current run. Please check module 
configuration\n|')
 
-    for current_module in module_info.keys():
-        for app_name in module_info[current_module]['application'].keys():
-            # Build includes
-            if includes.has_key(app_name):
-                tmp = includes.pop(app_name)
-            else:
-                tmp = []
-
-            
tmp.append(module_info[current_module]['application'][app_name]['header_file'])
-            includes[app_name] = tmp
-
-            # Build init_functions
-            if init_functions.has_key(app_name):
-                tmp = init_functions.pop(app_name)
-            else:
-                tmp = []
-
-            
tmp.append(module_info[current_module]['application'][app_name]['init_function'])
-            init_functions[app_name] = tmp
-
-    return (includes, init_functions)
-
 # Creates a C header file with the given filename an the needed includes,
 # the number of init functions per application and an array of function
 # pointers for each application
-def create_header_files(output_dir, suffix, applications, includes, 
init_functions, enabled_modules, required_modules):
+def create_header_files(applications, module_info):
 
-    if False == os.path.isdir(output_dir):
-        os.mkdir(output_dir)
+    if False == os.path.isdir(HEADER_FILE_DIR):
+        os.mkdir(HEADER_FILE_DIR)
 
     for current_app in applications:
 
-        hdr_file_path = os.path.join(output_dir, current_app + suffix)
+        hdr_file_path = os.path.join(HEADER_FILE_DIR,
+                                     current_app + HEADER_FILE_SUFFIX)
 
         try:
             hdr_file = open(hdr_file_path, 'w')
             try:
                 app_string = 'HIP_MODULES_' + current_app.upper() + 
'_MODULES_H'
-                init_function_string = 'static int (*' + current_app
-                init_function_string += '_init_functions[])(void) = {'
-                module_string = 'const char *modules_' + current_app + '[] = {'
-                required_module_string = 'const char *required_modules_'
-                required_module_string += current_app + '[] = {'
-
                 hdr_file.write('/* ' + WARNING_STRING + ' */\n')
                 hdr_file.write('#ifndef ' + app_string + '\n')
                 hdr_file.write('#define ' + app_string + '\n')
 
-                if includes.has_key(current_app) and 
init_functions.has_key(current_app):
-                    num_modules = str(len(init_functions[current_app]));
-                    for current in includes[current_app]:
-                        hdr_file.write('\n#include \"' + current + '\"')
-
-                    hdr_file.write('\n\nconst int num_modules_' + current_app)
-                    hdr_file.write(' = ' + num_modules + ';\n')
-                    hdr_file.write('\nconst int num_required_modules_' + 
current_app + ' = ')
-                    hdr_file.write(str(len(required_modules)) + ';\n\n')
-                    hdr_file.write(module_string)
-
-                    first_loop = True
-                    for module in enabled_modules:
-                        if first_loop != True:
-                            hdr_file.write(',\n')
-                            for i in range(len(module_string)):
-                                hdr_file.write(' ')
-                        hdr_file.write('"' + module + '"')
-                        first_loop = False
-                    hdr_file.write('};\n\n')
-
-                    hdr_file.write(required_module_string)
-
-                    first_loop = True
-                    for module in required_modules:
-                        if first_loop != True:
-                            hdr_file.write(',\n')
-                            for i in range(len(required_module_string)):
-                                hdr_file.write(' ')
-                        hdr_file.write('"' + module + '"')
-                        first_loop = False
-                    hdr_file.write('};\n\n')
-                    hdr_file.write(init_function_string)
-
-                    first_loop = True
-                    for function in init_functions[current_app]:
-                        if first_loop != True:
-                            hdr_file.write(',\n')
-                            for i in range(len(init_function_string)):
-                                hdr_file.write(' ')
-                        hdr_file.write('&' + function)
-                        first_loop = False
-                    hdr_file.write('};')
-                else:
-                    hdr_file.write('\nconst int num_modules_' + current_app)
-                    hdr_file.write(' = 0;\n\nconst int num_required_modules_')
-                    hdr_file.write(current_app + ' = 0;\n\n')
-                    hdr_file.write(module_string + '};')
-                    hdr_file.write('\n\n' + required_module_string + '};')
-                    hdr_file.write('\n\n' + init_function_string + '};')
+                info_string  = 'struct module_info ' + current_app
+                info_string += '_modules[] = {'
+                first_loop           = True
+                num_spaces           = len(info_string)
+                num_modules          = 0
+                max_required_modules = 0
+
+                for current_module in module_info:
+                    if 
module_info[current_module]['application'].has_key(current_app):
+                        app_info = 
module_info[current_module]['application'][current_app]
+                        num_modules += 1
+                        hdr_file.write('\n#include \"' + 
app_info['header_file'] + '\"')
+
+                        num_required_modules = 
len(module_info[current_module]['requires'])
+                        if num_required_modules > max_required_modules:
+                            max_required_modules = num_required_modules
+                        if first_loop != True:
+                            info_string += ',\n'
+                            for i in range(num_spaces):
+                                info_string += ' '
+                        info_string += '{"' + current_module + '", '
+                        info_string += str(num_required_modules) + ', '
+
+                        first_loop_1 = True
+                        info_string += '{'
+                        for required_module in 
module_info[current_module]['requires']:
+                            if first_loop_1 != True:
+                                info_string += ', '
+                            info_string += '"' + required_module['name'] + '"'
+                            first_loop_1 = False
+                        info_string += '}'
+                        info_string += ', &' + app_info['init_function'] + '}'
+                        first_loop = False
+
+                info_string += '};'
+
+                info_struct  = '\n\n#define MAX_REQUIRED_MODULES '
+                info_struct += str(max_required_modules)
+                info_struct += '\n\nstruct module_info {\n'
+                info_struct += '    const char *name;\n'
+                info_struct += '    const int   num_required_moduels;\n'
+                info_struct += '    const char *required_modules_hipd['
+                info_struct += 'MAX_REQUIRED_MODULES];\n'
+                info_struct += '    int       (*init_function)(void);\n'
+                info_struct += '};\n\n'
+                hdr_file.write(info_struct)
+                hdr_file.write('/* Number of modules - determined during build 
process. */')
+                hdr_file.write('\nconst int ' + current_app + '_num_modules')
+                hdr_file.write(' = ' + str(num_modules) + ';\n\n')
+
+                hdr_file.write(info_string)
 
                 hdr_file.write('\n\n#endif /* ' + app_string + ' */\n')
                 print '|    created file: ' + hdr_file_path
@@ -272,18 +239,12 @@
     if disabled_modules:
         disabled_modules = disabled_modules.rsplit(',')
 
-    (module_info, required_modules) = read_module_info(os.path.join(srcdir, 
MODULES_DIR),
-                                                       disabled_modules)
-
-    (includes, init_functions) = process_module_info(module_info)
-
-    create_header_files(HEADER_FILE_DIR,
-                        HEADER_FILE_SUFFIX,
-                        applications,
-                        includes,
-                        init_functions,
-                        module_info.keys(),
-                        required_modules)
+    (module_info) = read_module_info(os.path.join(srcdir, MODULES_DIR),
+                                     disabled_modules)
+
+    check_dependencies(module_info)
+
+    create_header_files(applications, module_info)
 
 if __name__ == "__main__":
     main()

Other related posts:

  • » [hipl-commit] [tiny] Rev 3761: Improved dependency check on daemon startup. - Tim Just