242
243 (void) fmd_conf_getprop(fmd.d_conf, "client.memlim",
244 &mp->mod_stats->ms_memlimit.fmds_value.ui64);
245
246 (void) fmd_conf_getprop(fmd.d_conf, "client.buflim",
247 &mp->mod_stats->ms_buflimit.fmds_value.ui64);
248
249 (void) fmd_conf_getprop(fmd.d_conf, "client.thrlim",
250 &mp->mod_stats->ms_thrlimit.fmds_value.ui32);
251
252 (void) fmd_conf_getprop(fmd.d_conf, "client.doorthrlim",
253 &mp->mod_stats->ms_doorthrlimit.fmds_value.ui32);
254
255 (void) fmd_conf_getprop(fmd.d_conf, "client.xprtlim",
256 &mp->mod_stats->ms_xprtlimit.fmds_value.ui32);
257
258 (void) fmd_conf_getprop(fmd.d_conf, "client.xprtqlim",
259 &mp->mod_stats->ms_xprtqlimit.fmds_value.ui32);
260
261 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.save",
262 &mp->mod_stats->ms_ckpt_save.fmds_value.bool);
263
264 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.restore",
265 &mp->mod_stats->ms_ckpt_restore.fmds_value.bool);
266
267 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.zero",
268 &mp->mod_stats->ms_ckpt_zeroed.fmds_value.bool);
269
270 if (mp->mod_stats->ms_ckpt_zeroed.fmds_value.bool)
271 fmd_ckpt_delete(mp); /* blow away any pre-existing checkpoint */
272
273 /*
274 * Place a hold on the module and grab the module lock before creating
275 * the module's thread to ensure that it cannot destroy the module and
276 * that it cannot call ops->mop_init() before we're done setting up.
277 * NOTE: from now on, we must use fmd_module_rele() for error paths.
278 */
279 fmd_module_hold(mp);
280 (void) pthread_mutex_lock(&mp->mod_lock);
281 mp->mod_stats->ms_loadtime.fmds_value.ui64 = gethrtime();
282 mp->mod_thread = fmd_thread_create(mp, fmd_module_start, mp);
283
284 if (mp->mod_thread == NULL) {
285 fmd_error(EFMD_MOD_THR, "failed to create thread for %s", path);
286 (void) pthread_mutex_unlock(&mp->mod_lock);
287 fmd_module_rele(mp);
288 return (NULL);
289 }
290
|
242
243 (void) fmd_conf_getprop(fmd.d_conf, "client.memlim",
244 &mp->mod_stats->ms_memlimit.fmds_value.ui64);
245
246 (void) fmd_conf_getprop(fmd.d_conf, "client.buflim",
247 &mp->mod_stats->ms_buflimit.fmds_value.ui64);
248
249 (void) fmd_conf_getprop(fmd.d_conf, "client.thrlim",
250 &mp->mod_stats->ms_thrlimit.fmds_value.ui32);
251
252 (void) fmd_conf_getprop(fmd.d_conf, "client.doorthrlim",
253 &mp->mod_stats->ms_doorthrlimit.fmds_value.ui32);
254
255 (void) fmd_conf_getprop(fmd.d_conf, "client.xprtlim",
256 &mp->mod_stats->ms_xprtlimit.fmds_value.ui32);
257
258 (void) fmd_conf_getprop(fmd.d_conf, "client.xprtqlim",
259 &mp->mod_stats->ms_xprtqlimit.fmds_value.ui32);
260
261 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.save",
262 &mp->mod_stats->ms_ckpt_save.fmds_value.b);
263
264 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.restore",
265 &mp->mod_stats->ms_ckpt_restore.fmds_value.b);
266
267 (void) fmd_conf_getprop(fmd.d_conf, "ckpt.zero",
268 &mp->mod_stats->ms_ckpt_zeroed.fmds_value.b);
269
270 if (mp->mod_stats->ms_ckpt_zeroed.fmds_value.b)
271 fmd_ckpt_delete(mp); /* blow away any pre-existing checkpoint */
272
273 /*
274 * Place a hold on the module and grab the module lock before creating
275 * the module's thread to ensure that it cannot destroy the module and
276 * that it cannot call ops->mop_init() before we're done setting up.
277 * NOTE: from now on, we must use fmd_module_rele() for error paths.
278 */
279 fmd_module_hold(mp);
280 (void) pthread_mutex_lock(&mp->mod_lock);
281 mp->mod_stats->ms_loadtime.fmds_value.ui64 = gethrtime();
282 mp->mod_thread = fmd_thread_create(mp, fmd_module_start, mp);
283
284 if (mp->mod_thread == NULL) {
285 fmd_error(EFMD_MOD_THR, "failed to create thread for %s", path);
286 (void) pthread_mutex_unlock(&mp->mod_lock);
287 fmd_module_rele(mp);
288 return (NULL);
289 }
290
|