1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _FMD_MODULE_H 28 #define _FMD_MODULE_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/types.h> 33 #include <fm/diagcode.h> 34 #include <pthread.h> 35 #include <setjmp.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 #include <fmd_conf.h> 42 #include <fmd_list.h> 43 #include <fmd_serd.h> 44 #include <fmd_buf.h> 45 #include <fmd_api.h> 46 47 struct fmd_module; /* see below */ 48 struct fmd_thread; /* see <fmd_thread.h> */ 49 struct fmd_eventq; /* see <fmd_eventq.h> */ 50 struct fmd_idspace; /* see <fmd_idspace.h> */ 51 struct fmd_ustat; /* see <fmd_ustat.h> */ 52 struct fmd_ustat_snap; /* see <fmd_ustat.h> */ 53 54 typedef struct fmd_modops { 55 int (*mop_init)(struct fmd_module *); 56 int (*mop_fini)(struct fmd_module *); 57 void (*mop_dispatch)(struct fmd_module *, struct fmd_event *); 58 } fmd_modops_t; 59 60 typedef struct fmd_modhash { 61 pthread_rwlock_t mh_lock; /* r/w lock to protect hash */ 62 struct fmd_module **mh_hash; /* hash bucket array */ 63 uint_t mh_hashlen; /* size of hash bucket array */ 64 uint_t mh_nelems; /* number of modules in hash */ 65 } fmd_modhash_t; 66 67 /* 68 * Statistics maintained by fmd itself on behalf of all modules for fmstat(1M). 69 * NOTE: FMD_TYPE_STRING statistics should not be used here. If they are 70 * required in the future, the FMD_ADM_MODDSTAT service routine must change. 71 */ 72 typedef struct fmd_modstat { 73 fmd_stat_t ms_loadtime; /* hrtime at which module was loaded */ 74 fmd_stat_t ms_snaptime; /* hrtime of recent stats snapshot */ 75 fmd_stat_t ms_dispatched; /* total events dispatched to queue */ 76 fmd_stat_t ms_dequeued; /* total events dequeued by module */ 77 fmd_stat_t ms_prdequeued; /* protocol events dequeued by module */ 78 fmd_stat_t ms_accepted; /* total events accepted by module */ 79 fmd_stat_t ms_dropped; /* total events dropped by module */ 80 fmd_stat_t ms_wcnt; /* count of events waiting on queue */ 81 fmd_stat_t ms_wtime; /* total wait time (pre-dispatch) */ 82 fmd_stat_t ms_wlentime; /* total wait length * time product */ 83 fmd_stat_t ms_wlastupdate; /* hrtime of last wait queue update */ 84 fmd_stat_t ms_dtime; /* total dispatch time */ 85 fmd_stat_t ms_dlastupdate; /* hrtime of last dispatch */ 86 fmd_stat_t ms_debugdrop; /* dropped debug messages */ 87 fmd_stat_t ms_memtotal; /* total space allocated by module */ 88 fmd_stat_t ms_memlimit; /* limit on space allocated by module */ 89 fmd_stat_t ms_buftotal; /* total space consumed by buffers */ 90 fmd_stat_t ms_buflimit; /* limit on space consumed by buffers */ 91 fmd_stat_t ms_thrtotal; /* total number of auxiliary threads */ 92 fmd_stat_t ms_thrlimit; /* limit on auxiliary threads */ 93 fmd_stat_t ms_caseopen; /* cases currently open */ 94 fmd_stat_t ms_casesolved; /* total cases solved by module */ 95 fmd_stat_t ms_caseclosed; /* total cases closed by module */ 96 fmd_stat_t ms_ckpt_save; /* save checkpoints for module */ 97 fmd_stat_t ms_ckpt_restore; /* restore checkpoints for module */ 98 fmd_stat_t ms_ckpt_zeroed; /* checkpoint was zeroed at startup */ 99 fmd_stat_t ms_ckpt_cnt; /* number of checkpoints taken */ 100 fmd_stat_t ms_ckpt_time; /* total checkpoint time */ 101 } fmd_modstat_t; 102 103 typedef struct fmd_module { 104 fmd_list_t mod_list; /* linked list next/prev pointers */ 105 pthread_mutex_t mod_lock; /* lock for mod_cv/owner/flags/refs */ 106 pthread_cond_t mod_cv; /* condition variable for waiters */ 107 pthread_t mod_owner; /* tid of thread that set MOD_LOCK */ 108 uint_t mod_refs; /* module reference count */ 109 uint_t mod_flags; /* miscellaneous flags (see below) */ 110 uint64_t mod_gen; /* module checkpoint generation */ 111 int mod_error; /* error return from module thread */ 112 jmp_buf mod_jmpbuf; /* setjmp data for fmd_module_enter() */ 113 fmd_modhash_t *mod_hash; /* containing namespace (ro) */ 114 struct fmd_module *mod_next; /* next module in fmd_modhash chain */ 115 char *mod_name; /* basename of module (ro) */ 116 char *mod_path; /* full pathname of module file (ro) */ 117 char *mod_ckpt; /* pathname of checkpoint dir (ro) */ 118 nvlist_t *mod_fmri; /* fmri for this module */ 119 const fmd_modops_t *mod_ops; /* module class ops vector (ro) */ 120 void *mod_data; /* data private to module ops vector */ 121 fmd_hdl_info_t *mod_info; /* module info registered with handle */ 122 void *mod_spec; /* fmd_hdl_get/setspecific data value */ 123 int mod_argc; /* size of mod_argv formals array */ 124 fmd_conf_formal_t *mod_argv; /* array of conf file formals */ 125 fmd_conf_t *mod_conf; /* configuration properties (ro) */ 126 struct fm_dc_handle **mod_dictv; /* libdiagcode dictionaries */ 127 int mod_dictc; /* size of mod_dictv array */ 128 size_t mod_codelen; /* libdiagcode maximum string length */ 129 struct fmd_eventq *mod_queue; /* eventq associated with module (ro) */ 130 struct fmd_ustat *mod_ustat; /* collection of custom statistics */ 131 pthread_mutex_t mod_stats_lock; /* lock protecting mod_stats data */ 132 fmd_modstat_t *mod_stats; /* fmd built-in per-module statistics */ 133 struct fmd_thread *mod_thread; /* thread associated with module (ro) */ 134 struct fmd_idspace *mod_threads; /* idspace for alternate thread ids */ 135 struct fmd_idspace *mod_timerids; /* idspace for timer identifiers */ 136 fmd_list_t mod_cases; /* list of cases owned by this module */ 137 fmd_buf_hash_t mod_bufs; /* hash of bufs owned by this module */ 138 fmd_serd_hash_t mod_serds; /* hash of serd engs owned by module */ 139 } fmd_module_t; 140 141 #define FMD_MOD_INIT 0x001 /* mod_ops->mop_init() has completed */ 142 #define FMD_MOD_FINI 0x002 /* mod_ops->mop_fini() has completed */ 143 #define FMD_MOD_QUIT 0x004 /* module has been requested to quit */ 144 #define FMD_MOD_FAIL 0x008 /* unrecoverable error has occurred */ 145 #define FMD_MOD_LOCK 0x010 /* lock bit for fmd_module_lock() */ 146 #define FMD_MOD_BUSY 0x020 /* module is busy executing a call */ 147 #define FMD_MOD_MDIRTY 0x040 /* module meta state needs checkpoint */ 148 #define FMD_MOD_CDIRTY 0x080 /* module case state needs checkpoint */ 149 #define FMD_MOD_STSUB 0x100 /* stats subscriber is waiting */ 150 #define FMD_MOD_STPUB 0x200 /* stats publisher is waiting */ 151 152 typedef struct fmd_modtimer { 153 fmd_module_t *mt_mod; /* module that installed this timer */ 154 void *mt_arg; /* module private timer argument */ 155 id_t mt_id; /* timer ID (or -1 if still pending) */ 156 } fmd_modtimer_t; 157 158 extern const fmd_modops_t fmd_bltin_ops; /* see fmd/common/fmd_builtin.c */ 159 extern const fmd_modops_t fmd_rtld_ops; /* see fmd/common/fmd_rtld.c */ 160 extern const fmd_modops_t fmd_proc_ops; /* see fmd/common/fmd_proc.c */ 161 162 extern fmd_module_t *fmd_module_create(const char *, const fmd_modops_t *); 163 extern void fmd_module_unload(fmd_module_t *); 164 extern void fmd_module_destroy(fmd_module_t *); 165 166 extern void fmd_module_dispatch(fmd_module_t *, fmd_event_t *); 167 extern void fmd_module_timeout(fmd_modtimer_t *, id_t, hrtime_t); 168 extern void fmd_module_gc(fmd_module_t *); 169 extern void fmd_module_trygc(fmd_module_t *); 170 171 extern int fmd_module_contains(fmd_module_t *, fmd_event_t *); 172 extern void fmd_module_setdirty(fmd_module_t *); 173 extern void fmd_module_setcdirty(fmd_module_t *); 174 extern void fmd_module_clrdirty(fmd_module_t *); 175 extern void fmd_module_commit(fmd_module_t *); 176 177 extern void fmd_module_lock(fmd_module_t *); 178 extern void fmd_module_unlock(fmd_module_t *); 179 extern int fmd_module_trylock(fmd_module_t *); 180 extern int fmd_module_locked(fmd_module_t *); 181 182 extern void fmd_module_unregister(fmd_module_t *); 183 extern int fmd_module_enter(fmd_module_t *, void (*)(fmd_hdl_t *)); 184 extern void fmd_module_exit(fmd_module_t *); 185 extern void fmd_module_abort(fmd_module_t *, int); 186 187 extern void fmd_module_hold(fmd_module_t *); 188 extern void fmd_module_rele(fmd_module_t *); 189 190 extern int fmd_module_dc_opendict(fmd_module_t *, const char *); 191 extern int fmd_module_dc_key2code(fmd_module_t *, 192 char *const [], char *, size_t); 193 194 extern fmd_modhash_t *fmd_modhash_create(void); 195 extern void fmd_modhash_destroy(fmd_modhash_t *); 196 197 extern fmd_module_t *fmd_modhash_load(fmd_modhash_t *, 198 const char *, const fmd_modops_t *); 199 200 extern void fmd_modhash_loadall(fmd_modhash_t *, 201 const fmd_conf_path_t *, const fmd_modops_t *); 202 203 extern fmd_module_t *fmd_modhash_lookup(fmd_modhash_t *, const char *); 204 extern int fmd_modhash_unload(fmd_modhash_t *, const char *); 205 206 extern void fmd_modhash_apply(fmd_modhash_t *, void (*)(fmd_module_t *)); 207 extern void fmd_modhash_tryapply(fmd_modhash_t *, void (*)(fmd_module_t *)); 208 extern void fmd_modhash_dispatch(fmd_modhash_t *, fmd_event_t *); 209 210 extern void fmd_modstat_eventq_dispatch(fmd_module_t *); 211 extern void fmd_modstat_eventq_dequeue(fmd_module_t *, uint_t); 212 extern void fmd_modstat_eventq_done(fmd_module_t *); 213 extern void fmd_modstat_publish(fmd_module_t *); 214 extern int fmd_modstat_snapshot(fmd_module_t *, struct fmd_ustat_snap *); 215 216 #ifdef __cplusplus 217 } 218 #endif 219 220 #endif /* _FMD_MODULE_H */ 221