xref: /illumos-gate/usr/src/cmd/fm/fmd/common/fmd_module.h (revision 4de2612967d06c4fdbf524a62556a1e8118a006f)
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