File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bmon / src / module.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Wed Jul 30 07:55:27 2014 UTC (9 years, 11 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    1: /*
    2:  * module.c               Module API
    3:  *
    4:  * Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
    5:  * Copyright (c) 2013 Red Hat, Inc.
    6:  *
    7:  * Permission is hereby granted, free of charge, to any person obtaining a
    8:  * copy of this software and associated documentation files (the "Software"),
    9:  * to deal in the Software without restriction, including without limitation
   10:  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   11:  * and/or sell copies of the Software, and to permit persons to whom the
   12:  * Software is furnished to do so, subject to the following conditions:
   13:  *
   14:  * The above copyright notice and this permission notice shall be included
   15:  * in all copies or substantial portions of the Software.
   16:  *
   17:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   18:  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   19:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
   20:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   21:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   22:  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   23:  * DEALINGS IN THE SOFTWARE.
   24:  */
   25: 
   26: #include <bmon/bmon.h>
   27: #include <bmon/module.h>
   28: #include <bmon/utils.h>
   29: 
   30: static LIST_HEAD(subsys_list);
   31: 
   32: static void module_foreach(struct bmon_subsys *ss, void (*cb)(struct bmon_module *))
   33: {
   34: 	struct bmon_module *m;
   35: 
   36: 	list_for_each_entry(m, &ss->s_mod_list, m_list)
   37: 		cb(m);
   38: }
   39: 
   40: void module_foreach_run_enabled_pre(struct bmon_subsys *ss)
   41: {
   42: 	struct bmon_module *m;
   43: 
   44: 	list_for_each_entry(m, &ss->s_mod_list, m_list)
   45: 		if (m->m_flags & BMON_MODULE_ENABLED && m->m_pre)
   46: 			m->m_pre();
   47: }
   48: 
   49: void module_foreach_run_enabled(struct bmon_subsys *ss)
   50: {
   51: 	struct bmon_module *m;
   52: 
   53: 	list_for_each_entry(m, &ss->s_mod_list, m_list)
   54: 		if (m->m_flags & BMON_MODULE_ENABLED && m->m_do)
   55: 			m->m_do();
   56: }
   57: 
   58: void module_foreach_run_enabled_post(struct bmon_subsys *ss)
   59: {
   60: 	struct bmon_module *m;
   61: 
   62: 	list_for_each_entry(m, &ss->s_mod_list, m_list)
   63: 		if (m->m_flags & BMON_MODULE_ENABLED && m->m_post)
   64: 			m->m_post();
   65: }
   66: 
   67: static struct bmon_module *module_lookup(struct bmon_subsys *ss, const char *name)
   68: {
   69: 	struct bmon_module *m;
   70: 
   71: 	list_for_each_entry(m, &ss->s_mod_list, m_list)
   72: 		if (!strcmp(m->m_name, name))
   73: 			return m;
   74: 
   75: 	return NULL;
   76: }
   77: 
   78: static void module_list(struct bmon_subsys *ss, struct list_head *list)
   79: {
   80: 	printf("%s modules:\n", ss->s_name);
   81: 	if (list_empty(list))
   82: 		printf("\tNo %s modules found.\n", ss->s_name);
   83: 	else {
   84: 		struct bmon_module *m;
   85: 
   86: 		list_for_each_entry(m, list, m_list)
   87: 			printf("\t%s\n", m->m_name);
   88: 	}
   89: }
   90: 
   91: static int module_configure(struct bmon_module *m, module_conf_t *cfg)
   92: {
   93: 	DBG("Configuring module %s", m->m_name);
   94: 
   95: 	if (m->m_parse_opt && cfg) {
   96: 		tv_t *tv;
   97: 
   98: 		list_for_each_entry(tv, &cfg->m_attrs, tv_list)
   99: 			m->m_parse_opt(tv->tv_type, tv->tv_value);
  100: 	}
  101: 
  102: 	if (m->m_probe && !m->m_probe())
  103: 		return -EINVAL;
  104: 
  105: 	m->m_flags |= BMON_MODULE_ENABLED;
  106: 	m->m_subsys->s_nmod++;
  107: 
  108: 	return 0;
  109: }
  110: 
  111: int module_register(struct bmon_subsys *ss, struct bmon_module *m)
  112: {
  113: 	if (m->m_subsys)
  114: 		return -EBUSY;
  115: 
  116: 	list_add_tail(&m->m_list, &ss->s_mod_list);
  117: 	m->m_subsys = ss;
  118: 	return 0;
  119: }
  120: 
  121: static void __auto_load(struct bmon_module *m)
  122: {
  123: 	if ((m->m_flags & BMON_MODULE_AUTO) &&
  124: 	    !(m->m_flags & BMON_MODULE_ENABLED)) {
  125: 		if (module_configure(m, NULL) == 0)
  126: 			DBG("Auto-enabled module %s", m->m_name);
  127: 	}
  128: }
  129: 
  130: int module_set(struct bmon_subsys *ss, const char *name)
  131: {
  132: 	struct bmon_module *mod;
  133: 	struct list_head *list;
  134: 	LIST_HEAD(tmp_list);
  135: 	module_conf_t *m;
  136: 
  137: 	if (!name || !strcasecmp(name, "list")) {
  138: 		module_list(ss, &ss->s_mod_list);
  139: 		return 1;
  140: 	}
  141: 	
  142: 	parse_module_param(name, &tmp_list);
  143: 
  144: 	list_for_each_entry(m, &tmp_list, m_list) {
  145: 		if (!(mod = module_lookup(ss, m->m_name)))
  146: 			quit("Unknown %s module: %s\n", ss->s_name, m->m_name);
  147: 
  148: 		if (module_configure(mod, m) == 0)
  149: 			DBG("Enabled module %s", mod->m_name);
  150: 	}
  151: 
  152: 	module_foreach(ss, __auto_load);
  153: 
  154: 	if (!ss->s_nmod)
  155: 		quit("No working %s module found\n", ss->s_name);
  156: 
  157: 	DBG("Configured modules");
  158: 
  159: 	return 0;
  160: }
  161: 
  162: static void __module_init(struct bmon_module *m)
  163: {
  164: 	if (m->m_init) {
  165: 		DBG("Initializing %s...", m->m_name);
  166: 		if (m->m_init())
  167: 			m->m_flags &= ~BMON_MODULE_ENABLED;
  168: 	}
  169: }
  170: 
  171: void module_init(void)
  172: {
  173: 	struct bmon_subsys *ss;
  174: 
  175: 	DBG("Initializing modules");
  176: 
  177: 	list_for_each_entry(ss, &subsys_list, s_list) {
  178: 		if (ss->s_activate_default)
  179: 			ss->s_activate_default();
  180: 
  181: 		module_foreach(ss, __module_init);
  182: 	}
  183: }
  184: 
  185: static void __module_shutdown(struct bmon_module *m)
  186: {
  187: 	if (m->m_shutdown) {
  188: 		DBG("Shutting down %s...", m->m_name);
  189: 		m->m_shutdown();
  190: 		m->m_flags &= ~BMON_MODULE_ENABLED;
  191: 	}
  192: }
  193: 
  194: void module_shutdown(void)
  195: {
  196: 	DBG("Shutting down modules");
  197: 
  198: 	struct bmon_subsys *ss;
  199: 
  200: 	list_for_each_entry(ss, &subsys_list, s_list)
  201: 		module_foreach(ss, __module_shutdown);
  202: }
  203: 
  204: void module_register_subsys(struct bmon_subsys *ss)
  205: {
  206: 	DBG("Module %s registered", ss->s_name);
  207: 
  208: 	list_add_tail(&ss->s_list, &subsys_list);
  209: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>