Lines Matching refs:refcnt

2112 idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj)  in idm_refcnt_init()  argument
2114 bzero(refcnt, sizeof (*refcnt)); in idm_refcnt_init()
2115 idm_refcnt_reset(refcnt); in idm_refcnt_init()
2116 refcnt->ir_referenced_obj = referenced_obj; in idm_refcnt_init()
2117 bzero(&refcnt->ir_audit_buf, sizeof (refcnt_audit_buf_t)); in idm_refcnt_init()
2118 refcnt->ir_audit_buf.anb_max_index = REFCNT_AUDIT_BUF_MAX_REC - 1; in idm_refcnt_init()
2119 mutex_init(&refcnt->ir_mutex, NULL, MUTEX_DEFAULT, NULL); in idm_refcnt_init()
2120 cv_init(&refcnt->ir_cv, NULL, CV_DEFAULT, NULL); in idm_refcnt_init()
2124 idm_refcnt_destroy(idm_refcnt_t *refcnt) in idm_refcnt_destroy() argument
2131 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_destroy()
2132 ASSERT(refcnt->ir_refcnt == 0); in idm_refcnt_destroy()
2133 cv_destroy(&refcnt->ir_cv); in idm_refcnt_destroy()
2134 mutex_destroy(&refcnt->ir_mutex); in idm_refcnt_destroy()
2138 idm_refcnt_reset(idm_refcnt_t *refcnt) in idm_refcnt_reset() argument
2140 refcnt->ir_waiting = REF_NOWAIT; in idm_refcnt_reset()
2141 refcnt->ir_refcnt = 0; in idm_refcnt_reset()
2145 idm_refcnt_hold(idm_refcnt_t *refcnt) in idm_refcnt_hold() argument
2151 ASSERT(refcnt->ir_waiting == REF_NOWAIT); in idm_refcnt_hold()
2153 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_hold()
2154 refcnt->ir_refcnt++; in idm_refcnt_hold()
2155 REFCNT_AUDIT(refcnt); in idm_refcnt_hold()
2156 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_hold()
2162 idm_refcnt_t *refcnt = refcnt_void; in idm_refcnt_unref_task() local
2164 REFCNT_AUDIT(refcnt); in idm_refcnt_unref_task()
2165 (*refcnt->ir_cb)(refcnt->ir_referenced_obj); in idm_refcnt_unref_task()
2169 idm_refcnt_rele(idm_refcnt_t *refcnt) in idm_refcnt_rele() argument
2171 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_rele()
2172 ASSERT(refcnt->ir_refcnt > 0); in idm_refcnt_rele()
2173 refcnt->ir_refcnt--; in idm_refcnt_rele()
2174 REFCNT_AUDIT(refcnt); in idm_refcnt_rele()
2175 if (refcnt->ir_waiting == REF_NOWAIT) { in idm_refcnt_rele()
2177 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_rele()
2186 if (refcnt->ir_refcnt == 0) { in idm_refcnt_rele()
2187 if (refcnt->ir_waiting == REF_WAIT_ASYNC) { in idm_refcnt_rele()
2189 &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == in idm_refcnt_rele()
2194 } else if (refcnt->ir_waiting == REF_WAIT_SYNC) { in idm_refcnt_rele()
2195 cv_signal(&refcnt->ir_cv); in idm_refcnt_rele()
2198 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_rele()
2202 idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func) in idm_refcnt_rele_and_destroy() argument
2204 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_rele_and_destroy()
2205 ASSERT(refcnt->ir_refcnt > 0); in idm_refcnt_rele_and_destroy()
2206 refcnt->ir_refcnt--; in idm_refcnt_rele_and_destroy()
2207 REFCNT_AUDIT(refcnt); in idm_refcnt_rele_and_destroy()
2214 if (refcnt->ir_refcnt == 0) { in idm_refcnt_rele_and_destroy()
2215 refcnt->ir_cb = cb_func; in idm_refcnt_rele_and_destroy()
2216 refcnt->ir_waiting = REF_WAIT_ASYNC; in idm_refcnt_rele_and_destroy()
2218 &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == in idm_refcnt_rele_and_destroy()
2224 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_rele_and_destroy()
2228 idm_refcnt_wait_ref(idm_refcnt_t *refcnt) in idm_refcnt_wait_ref() argument
2230 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_wait_ref()
2231 refcnt->ir_waiting = REF_WAIT_SYNC; in idm_refcnt_wait_ref()
2232 REFCNT_AUDIT(refcnt); in idm_refcnt_wait_ref()
2233 while (refcnt->ir_refcnt != 0) in idm_refcnt_wait_ref()
2234 cv_wait(&refcnt->ir_cv, &refcnt->ir_mutex); in idm_refcnt_wait_ref()
2235 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_wait_ref()
2239 idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func) in idm_refcnt_async_wait_ref() argument
2241 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_async_wait_ref()
2242 refcnt->ir_waiting = REF_WAIT_ASYNC; in idm_refcnt_async_wait_ref()
2243 refcnt->ir_cb = cb_func; in idm_refcnt_async_wait_ref()
2244 REFCNT_AUDIT(refcnt); in idm_refcnt_async_wait_ref()
2250 if (refcnt->ir_refcnt == 0) { in idm_refcnt_async_wait_ref()
2252 &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == in idm_refcnt_async_wait_ref()
2259 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_async_wait_ref()
2263 idm_refcnt_destroy_unref_obj(idm_refcnt_t *refcnt, in idm_refcnt_destroy_unref_obj() argument
2266 mutex_enter(&refcnt->ir_mutex); in idm_refcnt_destroy_unref_obj()
2267 if (refcnt->ir_refcnt == 0) { in idm_refcnt_destroy_unref_obj()
2268 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_destroy_unref_obj()
2269 (*cb_func)(refcnt->ir_referenced_obj); in idm_refcnt_destroy_unref_obj()
2272 mutex_exit(&refcnt->ir_mutex); in idm_refcnt_destroy_unref_obj()
2284 idm_refcnt_is_held(idm_refcnt_t *refcnt) in idm_refcnt_is_held() argument
2286 if (refcnt->ir_refcnt < 0) in idm_refcnt_is_held()
2289 if (refcnt->ir_refcnt == 0) in idm_refcnt_is_held()
2292 if (refcnt->ir_waiting == REF_NOWAIT && refcnt->ir_refcnt > 0) in idm_refcnt_is_held()