Lines Matching refs:sp

234 	fmd_scheme_t *sp = fmd_alloc(sizeof (fmd_scheme_t), FMD_SLEEP);  in fmd_scheme_create()  local
236 (void) pthread_mutex_init(&sp->sch_lock, NULL); in fmd_scheme_create()
237 (void) pthread_cond_init(&sp->sch_cv, NULL); in fmd_scheme_create()
238 (void) pthread_mutex_init(&sp->sch_opslock, NULL); in fmd_scheme_create()
240 sp->sch_next = NULL; in fmd_scheme_create()
241 sp->sch_name = fmd_strdup(name, FMD_SLEEP); in fmd_scheme_create()
242 sp->sch_dlp = NULL; in fmd_scheme_create()
243 sp->sch_refs = 1; in fmd_scheme_create()
244 sp->sch_loaded = 0; in fmd_scheme_create()
245 sp->sch_ops = _fmd_scheme_default_ops; in fmd_scheme_create()
247 return (sp); in fmd_scheme_create()
251 fmd_scheme_destroy(fmd_scheme_t *sp) in fmd_scheme_destroy() argument
253 ASSERT(MUTEX_HELD(&sp->sch_lock)); in fmd_scheme_destroy()
254 ASSERT(sp->sch_refs == 0); in fmd_scheme_destroy()
256 if (sp->sch_dlp != NULL) { in fmd_scheme_destroy()
257 TRACE((FMD_DBG_FMRI, "dlclose scheme %s", sp->sch_name)); in fmd_scheme_destroy()
259 if (sp->sch_ops.sop_fini != NULL) in fmd_scheme_destroy()
260 sp->sch_ops.sop_fini(); in fmd_scheme_destroy()
262 (void) dlclose(sp->sch_dlp); in fmd_scheme_destroy()
265 fmd_strfree(sp->sch_name); in fmd_scheme_destroy()
266 fmd_free(sp, sizeof (fmd_scheme_t)); in fmd_scheme_destroy()
274 fmd_scheme_t *sp; in fmd_scheme_hash_create() local
284 sp = fmd_scheme_create(FM_FMRI_SCHEME_FMD); in fmd_scheme_hash_create()
285 sp->sch_ops = _fmd_scheme_builtin_ops; in fmd_scheme_hash_create()
286 sp->sch_loaded = FMD_B_TRUE; in fmd_scheme_hash_create()
287 shp->sch_hash[fmd_strhash(sp->sch_name) % shp->sch_hashlen] = sp; in fmd_scheme_hash_create()
295 fmd_scheme_t *sp, *np; in fmd_scheme_hash_destroy() local
299 for (sp = shp->sch_hash[i]; sp != NULL; sp = np) { in fmd_scheme_hash_destroy()
300 np = sp->sch_next; in fmd_scheme_hash_destroy()
301 sp->sch_next = NULL; in fmd_scheme_hash_destroy()
302 fmd_scheme_hash_release(shp, sp); in fmd_scheme_hash_destroy()
314 fmd_scheme_t *sp, *np; in fmd_scheme_hash_trygc() local
321 for (sp = shp->sch_hash[i]; sp != NULL; sp = np) { in fmd_scheme_hash_trygc()
322 np = sp->sch_next; in fmd_scheme_hash_trygc()
323 sp->sch_next = NULL; in fmd_scheme_hash_trygc()
324 fmd_scheme_hash_release(shp, sp); in fmd_scheme_hash_trygc()
333 fmd_scheme_rtld_init(fmd_scheme_t *sp) in fmd_scheme_rtld_init() argument
339 if ((p = dlsym(sp->sch_dlp, opd->opd_name)) != NULL) in fmd_scheme_rtld_init()
340 *(void **)((uintptr_t)&sp->sch_ops + opd->opd_off) = p; in fmd_scheme_rtld_init()
349 fmd_scheme_t *sp; in fmd_scheme_hash_xlookup() local
353 for (sp = shp->sch_hash[h]; sp != NULL; sp = sp->sch_next) { in fmd_scheme_hash_xlookup()
354 if (strcmp(sp->sch_name, name) == 0) in fmd_scheme_hash_xlookup()
358 return (sp); in fmd_scheme_hash_xlookup()
370 fmd_scheme_t *sp, *nsp = NULL; in fmd_scheme_hash_lookup() local
381 if ((sp = fmd_scheme_hash_xlookup(shp, name, h)) == NULL) { in fmd_scheme_hash_lookup()
386 if ((sp = fmd_scheme_hash_xlookup(shp, name, h)) == NULL) { in fmd_scheme_hash_lookup()
388 shp->sch_hash[h] = sp = nsp; in fmd_scheme_hash_lookup()
399 (void) pthread_mutex_lock(&sp->sch_lock); in fmd_scheme_hash_lookup()
411 "%s/%s.so", shp->sch_dirpath, sp->sch_name); in fmd_scheme_hash_lookup()
413 TRACE((FMD_DBG_FMRI, "dlopen scheme %s", sp->sch_name)); in fmd_scheme_hash_lookup()
414 sp->sch_dlp = dlopen(path, RTLD_LOCAL | RTLD_NOW); in fmd_scheme_hash_lookup()
416 if (sp->sch_dlp == NULL) { in fmd_scheme_hash_lookup()
420 } else if (fmd_scheme_rtld_init(sp) != 0 || in fmd_scheme_hash_lookup()
421 sp->sch_ops.sop_init() != 0) { in fmd_scheme_hash_lookup()
424 (void) dlclose(sp->sch_dlp); in fmd_scheme_hash_lookup()
425 sp->sch_dlp = NULL; in fmd_scheme_hash_lookup()
426 sp->sch_ops = _fmd_scheme_default_ops; in fmd_scheme_hash_lookup()
429 sp->sch_loaded = FMD_B_TRUE; /* set regardless of success */ in fmd_scheme_hash_lookup()
430 sp->sch_refs++; in fmd_scheme_hash_lookup()
431 ASSERT(sp->sch_refs != 0); in fmd_scheme_hash_lookup()
433 (void) pthread_cond_broadcast(&sp->sch_cv); in fmd_scheme_hash_lookup()
434 (void) pthread_mutex_unlock(&sp->sch_lock); in fmd_scheme_hash_lookup()
437 while (!sp->sch_loaded) in fmd_scheme_hash_lookup()
438 (void) pthread_cond_wait(&sp->sch_cv, &sp->sch_lock); in fmd_scheme_hash_lookup()
440 sp->sch_refs++; in fmd_scheme_hash_lookup()
441 ASSERT(sp->sch_refs != 0); in fmd_scheme_hash_lookup()
442 (void) pthread_mutex_unlock(&sp->sch_lock); in fmd_scheme_hash_lookup()
445 return (sp); in fmd_scheme_hash_lookup()
454 fmd_scheme_hash_release(fmd_scheme_hash_t *shp, fmd_scheme_t *sp) in fmd_scheme_hash_release() argument
456 (void) pthread_mutex_lock(&sp->sch_lock); in fmd_scheme_hash_release()
458 ASSERT(sp->sch_refs != 0); in fmd_scheme_hash_release()
459 if (--sp->sch_refs == 0) in fmd_scheme_hash_release()
460 fmd_scheme_destroy(sp); in fmd_scheme_hash_release()
462 (void) pthread_mutex_unlock(&sp->sch_lock); in fmd_scheme_hash_release()