8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / fm / fmd / common / fmd_module.h
blob04917065b76709bf5c71e02815225fc2cb6fdce4
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
26 #ifndef _FMD_MODULE_H
27 #define _FMD_MODULE_H
29 #include <sys/types.h>
30 #include <fm/diagcode.h>
31 #include <pthread.h>
32 #include <setjmp.h>
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
38 #include <fmd_conf.h>
39 #include <fmd_list.h>
40 #include <fmd_serd.h>
41 #include <fmd_buf.h>
42 #include <fmd_api.h>
43 #include <fmd_eventq.h>
44 #include <fmd_topo.h>
46 struct fmd_module; /* see below */
47 struct fmd_thread; /* see <fmd_thread.h> */
48 struct fmd_idspace; /* see <fmd_idspace.h> */
49 struct fmd_ustat; /* see <fmd_ustat.h> */
50 struct fmd_ustat_snap; /* see <fmd_ustat.h> */
52 typedef struct fmd_modops {
53 int (*mop_init)(struct fmd_module *);
54 int (*mop_fini)(struct fmd_module *);
55 void (*mop_dispatch)(struct fmd_module *, struct fmd_event *);
56 int (*mop_transport)(struct fmd_module *,
57 fmd_xprt_t *, struct fmd_event *);
58 } fmd_modops_t;
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;
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.
72 typedef struct fmd_modstat {
73 fmd_eventqstat_t ms_evqstat; /* stats for main module event queue */
74 fmd_stat_t ms_loadtime; /* hrtime at which module was loaded */
75 fmd_stat_t ms_snaptime; /* hrtime of recent stats snapshot */
76 fmd_stat_t ms_accepted; /* total events accepted by module */
77 fmd_stat_t ms_debugdrop; /* dropped debug messages */
78 fmd_stat_t ms_memtotal; /* total space allocated by module */
79 fmd_stat_t ms_memlimit; /* limit on space allocated by module */
80 fmd_stat_t ms_buftotal; /* total space consumed by buffers */
81 fmd_stat_t ms_buflimit; /* limit on space consumed by buffers */
82 fmd_stat_t ms_thrtotal; /* total number of auxiliary threads */
83 fmd_stat_t ms_thrlimit; /* limit on auxiliary threads */
84 fmd_stat_t ms_doorthrtotal; /* total number of doorserver threads */
85 fmd_stat_t ms_doorthrlimit; /* limit on doorserver threads */
86 fmd_stat_t ms_caseopen; /* cases currently open */
87 fmd_stat_t ms_casesolved; /* total cases solved by module */
88 fmd_stat_t ms_caseclosed; /* total cases closed by module */
89 fmd_stat_t ms_ckpt_save; /* save checkpoints for module */
90 fmd_stat_t ms_ckpt_restore; /* restore checkpoints for module */
91 fmd_stat_t ms_ckpt_zeroed; /* checkpoint was zeroed at startup */
92 fmd_stat_t ms_ckpt_cnt; /* number of checkpoints taken */
93 fmd_stat_t ms_ckpt_time; /* total checkpoint time */
94 fmd_stat_t ms_xprtopen; /* total number of open transports */
95 fmd_stat_t ms_xprtlimit; /* limit on number of open transports */
96 fmd_stat_t ms_xprtqlimit; /* limit on transport eventq length */
97 } fmd_modstat_t;
99 typedef struct fmd_module {
100 fmd_list_t mod_list; /* linked list next/prev pointers */
101 pthread_mutex_t mod_lock; /* lock for mod_cv/owner/flags/refs */
102 pthread_cond_t mod_cv; /* condition variable for waiters */
103 pthread_t mod_owner; /* tid of thread that set MOD_LOCK */
104 uint_t mod_refs; /* module reference count */
105 uint_t mod_flags; /* miscellaneous flags (see below) */
106 uint64_t mod_gen; /* module checkpoint generation */
107 int mod_error; /* error return from module thread */
108 jmp_buf mod_jmpbuf; /* setjmp data for fmd_module_enter() */
109 fmd_modhash_t *mod_hash; /* containing namespace (ro) */
110 struct fmd_module *mod_next; /* next module in fmd_modhash chain */
111 char *mod_name; /* basename of module (ro) */
112 char *mod_path; /* full pathname of module file (ro) */
113 char *mod_ckpt; /* pathname of checkpoint dir (ro) */
114 nvlist_t *mod_fmri; /* fmri for this module */
115 const fmd_modops_t *mod_ops; /* module class ops vector (ro) */
116 void *mod_data; /* data private to module ops vector */
117 fmd_hdl_info_t *mod_info; /* module info registered with handle */
118 void *mod_spec; /* fmd_hdl_get/setspecific data value */
119 int mod_argc; /* size of mod_argv formals array */
120 fmd_conf_formal_t *mod_argv; /* array of conf file formals */
121 fmd_conf_t *mod_conf; /* configuration properties (ro) */
122 struct fm_dc_handle **mod_dictv; /* libdiagcode dictionaries */
123 int mod_dictc; /* size of mod_dictv array */
124 size_t mod_codelen; /* libdiagcode maximum string length */
125 struct fmd_eventq *mod_queue; /* eventq associated with module (ro) */
126 struct fmd_ustat *mod_ustat; /* collection of custom statistics */
127 pthread_mutex_t mod_stats_lock; /* lock protecting mod_stats data */
128 fmd_modstat_t *mod_stats; /* fmd built-in per-module statistics */
129 struct fmd_thread *mod_thread; /* thread associated with module (ro) */
130 struct fmd_idspace *mod_threads; /* idspace for alternate thread ids */
131 struct fmd_idspace *mod_timerids; /* idspace for timer identifiers */
132 fmd_list_t mod_cases; /* list of cases owned by this module */
133 fmd_buf_hash_t mod_bufs; /* hash of bufs owned by this module */
134 fmd_serd_hash_t mod_serds; /* hash of serd engs owned by module */
135 fmd_list_t mod_transports; /* list of transports owned by module */
136 fmd_list_t mod_topolist; /* list of held topo handles */
137 fmd_topo_t *mod_topo_current; /* current libtopo snapshot */
138 char *mod_vers; /* a copy of module version string */
139 nv_alloc_t mod_nva_sleep; /* module nvalloc routines (sleep) */
140 nv_alloc_t mod_nva_nosleep; /* module nvalloc routines (nosleep) */
141 } fmd_module_t;
143 #define FMD_MOD_INIT 0x001 /* mod_ops->mop_init() has completed */
144 #define FMD_MOD_FINI 0x002 /* mod_ops->mop_fini() has completed */
145 #define FMD_MOD_QUIT 0x004 /* module has been requested to quit */
146 #define FMD_MOD_FAIL 0x008 /* unrecoverable error has occurred */
147 #define FMD_MOD_LOCK 0x010 /* lock bit for fmd_module_lock() */
148 #define FMD_MOD_BUSY 0x020 /* module is busy executing a call */
149 #define FMD_MOD_MDIRTY 0x040 /* module meta state needs checkpoint */
150 #define FMD_MOD_CDIRTY 0x080 /* module case state needs checkpoint */
151 #define FMD_MOD_STSUB 0x100 /* stats subscriber is waiting */
152 #define FMD_MOD_STPUB 0x200 /* stats publisher is waiting */
154 typedef struct fmd_modtimer {
155 fmd_module_t *mt_mod; /* module that installed this timer */
156 void *mt_arg; /* module private timer argument */
157 id_t mt_id; /* timer ID (or -1 if still pending) */
158 } fmd_modtimer_t;
160 typedef struct fmd_modtopo {
161 fmd_list_t mt_link; /* link on module topo list */
162 fmd_topo_t *mt_topo; /* topo handle */
163 } fmd_modtopo_t;
165 extern const fmd_modops_t fmd_bltin_ops; /* see fmd/common/fmd_builtin.c */
166 extern const fmd_modops_t fmd_rtld_ops; /* see fmd/common/fmd_rtld.c */
167 extern const fmd_modops_t fmd_proc_ops; /* see fmd/common/fmd_proc.c */
169 extern fmd_module_t *fmd_module_create(const char *, const fmd_modops_t *);
170 extern void fmd_module_unload(fmd_module_t *);
171 extern void fmd_module_destroy(fmd_module_t *);
173 extern void fmd_module_dispatch(fmd_module_t *, fmd_event_t *);
174 extern int fmd_module_transport(fmd_module_t *, fmd_xprt_t *, fmd_event_t *);
175 extern void fmd_module_timeout(fmd_modtimer_t *, id_t, hrtime_t);
176 extern void fmd_module_gc(fmd_module_t *);
177 extern void fmd_module_trygc(fmd_module_t *);
179 extern int fmd_module_contains(fmd_module_t *, fmd_event_t *);
180 extern void fmd_module_setdirty(fmd_module_t *);
181 extern void fmd_module_setcdirty(fmd_module_t *);
182 extern void fmd_module_clrdirty(fmd_module_t *);
183 extern void fmd_module_commit(fmd_module_t *);
185 extern void fmd_module_lock(fmd_module_t *);
186 extern void fmd_module_unlock(fmd_module_t *);
187 extern int fmd_module_trylock(fmd_module_t *);
188 extern int fmd_module_locked(fmd_module_t *);
190 extern void fmd_module_unregister(fmd_module_t *);
191 extern int fmd_module_enter(fmd_module_t *, void (*)(fmd_hdl_t *));
192 extern void fmd_module_exit(fmd_module_t *);
193 extern void fmd_module_abort(fmd_module_t *, int) __NORETURN;
195 extern void fmd_module_hold(fmd_module_t *);
196 extern void fmd_module_rele(fmd_module_t *);
198 extern int fmd_module_dc_opendict(fmd_module_t *, const char *);
199 extern int fmd_module_dc_key2code(fmd_module_t *,
200 char *const [], char *, size_t);
202 extern fmd_modhash_t *fmd_modhash_create(void);
203 extern void fmd_modhash_destroy(fmd_modhash_t *);
205 extern fmd_module_t *fmd_modhash_load(fmd_modhash_t *,
206 const char *, const fmd_modops_t *);
208 extern void fmd_modhash_loadall(fmd_modhash_t *,
209 const fmd_conf_path_t *, const fmd_modops_t *, const char *);
211 extern fmd_module_t *fmd_modhash_lookup(fmd_modhash_t *, const char *);
212 extern int fmd_modhash_unload(fmd_modhash_t *, const char *);
214 extern void fmd_modhash_apply(fmd_modhash_t *, void (*)(fmd_module_t *));
215 extern void fmd_modhash_tryapply(fmd_modhash_t *, void (*)(fmd_module_t *));
216 extern void fmd_modhash_dispatch(fmd_modhash_t *, fmd_event_t *);
218 extern void fmd_modstat_publish(fmd_module_t *);
219 extern int fmd_modstat_snapshot(fmd_module_t *, struct fmd_ustat_snap *);
221 extern struct topo_hdl *fmd_module_topo_hold(fmd_module_t *);
222 extern int fmd_module_topo_rele(fmd_module_t *, struct topo_hdl *);
224 extern nv_alloc_ops_t fmd_module_nva_ops_sleep;
225 extern nv_alloc_ops_t fmd_module_nva_ops_nosleep;
227 #ifdef __cplusplus
229 #endif
231 #endif /* _FMD_MODULE_H */