Annotation of embedaddon/bmon/src/module.c, revision 1.1
1.1 ! misho 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>