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]
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
29 #include <sys/types.h>
30 #include <fm/diagcode.h>
43 #include <fmd_eventq.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
*);
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 */
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 */
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) */
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) */
160 typedef struct fmd_modtopo
{
161 fmd_list_t mt_link
; /* link on module topo list */
162 fmd_topo_t
*mt_topo
; /* topo handle */
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
;
231 #endif /* _FMD_MODULE_H */