Lines Matching refs:chandle
69 smb_cache_create(smb_cache_t *chandle, uint32_t waittime, in smb_cache_create() argument
75 assert(chandle); in smb_cache_create()
78 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_create()
79 if (chandle->ch_state != SMB_CACHE_STATE_NOCACHE) { in smb_cache_create()
80 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_create()
84 avl_create(&chandle->ch_cache, cmpfn, sizeof (smb_cache_node_t), in smb_cache_create()
87 chandle->ch_state = SMB_CACHE_STATE_READY; in smb_cache_create()
88 chandle->ch_nops = 0; in smb_cache_create()
89 chandle->ch_wait = waittime; in smb_cache_create()
90 chandle->ch_sequence = random(); in smb_cache_create()
91 chandle->ch_datasz = datasz; in smb_cache_create()
92 chandle->ch_free = freefn; in smb_cache_create()
93 chandle->ch_copy = copyfn; in smb_cache_create()
94 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_create()
106 smb_cache_destroy(smb_cache_t *chandle) in smb_cache_destroy() argument
108 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_destroy()
109 switch (chandle->ch_state) { in smb_cache_destroy()
112 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_destroy()
119 chandle->ch_state = SMB_CACHE_STATE_DESTROYING; in smb_cache_destroy()
121 while (chandle->ch_nops > 0) in smb_cache_destroy()
122 (void) cond_wait(&chandle->ch_cv, &chandle->ch_mtx); in smb_cache_destroy()
124 smb_cache_destroy_nodes(chandle); in smb_cache_destroy()
126 avl_destroy(&chandle->ch_cache); in smb_cache_destroy()
127 chandle->ch_state = SMB_CACHE_STATE_NOCACHE; in smb_cache_destroy()
128 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_destroy()
136 smb_cache_flush(smb_cache_t *chandle) in smb_cache_flush() argument
138 if (smb_cache_wrlock(chandle) == 0) { in smb_cache_flush()
139 smb_cache_destroy_nodes(chandle); in smb_cache_flush()
140 chandle->ch_sequence++; in smb_cache_flush()
141 smb_cache_unlock(chandle); in smb_cache_flush()
151 smb_cache_add(smb_cache_t *chandle, const void *data, int flags) in smb_cache_add() argument
160 if ((rc = smb_cache_wrlock(chandle)) != 0) in smb_cache_add()
164 smb_cache_unlock(chandle); in smb_cache_add()
169 node = avl_find(&chandle->ch_cache, newnode, &where); in smb_cache_add()
172 avl_remove(&chandle->ch_cache, node); in smb_cache_add()
173 if (chandle->ch_free) in smb_cache_add()
174 chandle->ch_free(node->cn_data); in smb_cache_add()
178 smb_cache_unlock(chandle); in smb_cache_add()
183 avl_insert(&chandle->ch_cache, newnode, where); in smb_cache_add()
184 chandle->ch_sequence++; in smb_cache_add()
186 smb_cache_unlock(chandle); in smb_cache_add()
196 smb_cache_remove(smb_cache_t *chandle, const void *data) in smb_cache_remove() argument
203 if (smb_cache_wrlock(chandle) != 0) in smb_cache_remove()
207 node = avl_find(&chandle->ch_cache, &keynode, NULL); in smb_cache_remove()
209 chandle->ch_sequence++; in smb_cache_remove()
210 avl_remove(&chandle->ch_cache, node); in smb_cache_remove()
211 if (chandle->ch_free) in smb_cache_remove()
212 chandle->ch_free(node->cn_data); in smb_cache_remove()
216 smb_cache_unlock(chandle); in smb_cache_remove()
223 smb_cache_iterinit(smb_cache_t *chandle, smb_cache_cursor_t *cursor) in smb_cache_iterinit() argument
225 cursor->cc_sequence = chandle->ch_sequence; in smb_cache_iterinit()
240 smb_cache_iterate(smb_cache_t *chandle, smb_cache_cursor_t *cursor, void *data) in smb_cache_iterate() argument
246 if (smb_cache_rdlock(chandle) != 0) in smb_cache_iterate()
249 if (cursor->cc_sequence != chandle->ch_sequence) { in smb_cache_iterate()
250 smb_cache_unlock(chandle); in smb_cache_iterate()
255 node = avl_first(&chandle->ch_cache); in smb_cache_iterate()
257 node = AVL_NEXT(&chandle->ch_cache, cursor->cc_next); in smb_cache_iterate()
260 chandle->ch_copy(node->cn_data, data, chandle->ch_datasz); in smb_cache_iterate()
263 smb_cache_unlock(chandle); in smb_cache_iterate()
272 smb_cache_num(smb_cache_t *chandle) in smb_cache_num() argument
276 if (smb_cache_rdlock(chandle) == 0) { in smb_cache_num()
277 num = (uint32_t)avl_numnodes(&chandle->ch_cache); in smb_cache_num()
278 smb_cache_unlock(chandle); in smb_cache_num()
305 smb_cache_refreshing(smb_cache_t *chandle) in smb_cache_refreshing() argument
309 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_refreshing()
310 switch (chandle->ch_state) { in smb_cache_refreshing()
312 chandle->ch_state = SMB_CACHE_STATE_REFRESHING; in smb_cache_refreshing()
317 while (chandle->ch_state == SMB_CACHE_STATE_REFRESHING) in smb_cache_refreshing()
318 (void) cond_wait(&chandle->ch_cv, in smb_cache_refreshing()
319 &chandle->ch_mtx); in smb_cache_refreshing()
321 if (chandle->ch_state == SMB_CACHE_STATE_READY) { in smb_cache_refreshing()
322 chandle->ch_state = SMB_CACHE_STATE_REFRESHING; in smb_cache_refreshing()
338 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_refreshing()
352 smb_cache_ready(smb_cache_t *chandle) in smb_cache_ready() argument
354 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_ready()
355 switch (chandle->ch_state) { in smb_cache_ready()
357 chandle->ch_state = SMB_CACHE_STATE_READY; in smb_cache_ready()
358 (void) cond_broadcast(&chandle->ch_cv); in smb_cache_ready()
369 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_ready()
382 smb_cache_lock(smb_cache_t *chandle, int mode) in smb_cache_lock() argument
384 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_lock()
385 switch (chandle->ch_state) { in smb_cache_lock()
388 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_lock()
397 if (!smb_cache_wait(chandle)) { in smb_cache_lock()
398 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_lock()
404 chandle->ch_nops++; in smb_cache_lock()
410 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_lock()
417 (void) rw_rdlock(&chandle->ch_cache_lck); in smb_cache_lock()
419 (void) rw_wrlock(&chandle->ch_cache_lck); in smb_cache_lock()
428 smb_cache_rdlock(smb_cache_t *chandle) in smb_cache_rdlock() argument
430 return (smb_cache_lock(chandle, SMB_CACHE_RDLOCK)); in smb_cache_rdlock()
437 smb_cache_wrlock(smb_cache_t *chandle) in smb_cache_wrlock() argument
439 return (smb_cache_lock(chandle, SMB_CACHE_WRLOCK)); in smb_cache_wrlock()
446 smb_cache_unlock(smb_cache_t *chandle) in smb_cache_unlock() argument
448 (void) mutex_lock(&chandle->ch_mtx); in smb_cache_unlock()
449 assert(chandle->ch_nops > 0); in smb_cache_unlock()
450 chandle->ch_nops--; in smb_cache_unlock()
451 (void) cond_broadcast(&chandle->ch_cv); in smb_cache_unlock()
452 (void) mutex_unlock(&chandle->ch_mtx); in smb_cache_unlock()
454 (void) rw_unlock(&chandle->ch_cache_lck); in smb_cache_unlock()
464 smb_cache_wait(smb_cache_t *chandle) in smb_cache_wait() argument
469 if (chandle->ch_wait == 0) in smb_cache_wait()
472 to.tv_sec = chandle->ch_wait; in smb_cache_wait()
474 while (chandle->ch_state == SMB_CACHE_STATE_REFRESHING) { in smb_cache_wait()
475 err = cond_reltimedwait(&chandle->ch_cv, in smb_cache_wait()
476 &chandle->ch_mtx, &to); in smb_cache_wait()
481 return (chandle->ch_state == SMB_CACHE_STATE_READY); in smb_cache_wait()
488 smb_cache_destroy_nodes(smb_cache_t *chandle) in smb_cache_destroy_nodes() argument
494 cache = &chandle->ch_cache; in smb_cache_destroy_nodes()
496 if (chandle->ch_free) in smb_cache_destroy_nodes()
497 chandle->ch_free(cnode->cn_data); in smb_cache_destroy_nodes()