Lines Matching +full:lock +full:- +full:status

2  * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
16 * - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
67 p_disp - Pointer to Dispatcher object
80 cl_spinlock_acquire(&p_disp->lock); in __cl_disp_worker()
83 while (cl_qlist_count(&p_disp->msg_fifo)) { in __cl_disp_worker()
86 (cl_disp_msg_t *) cl_qlist_remove_head(&p_disp->msg_fifo); in __cl_disp_worker()
89 p_disp->last_msg_queue_time_us = in __cl_disp_worker()
90 cl_get_time_stamp() - p_msg->in_time; in __cl_disp_worker()
95 * and cause the lock to be reaquired. in __cl_disp_worker()
97 cl_spinlock_release(&p_disp->lock); in __cl_disp_worker()
98 p_msg->p_dest_reg->pfn_rcv_callback((void *)p_msg->p_dest_reg-> in __cl_disp_worker()
100 (void *)p_msg->p_data); in __cl_disp_worker()
102 cl_atomic_dec(&p_msg->p_dest_reg->ref_cnt); in __cl_disp_worker()
105 if (p_msg->pfn_xmt_callback) { in __cl_disp_worker()
106 p_msg->pfn_xmt_callback((void *)p_msg->context, in __cl_disp_worker()
107 (void *)p_msg->p_data); in __cl_disp_worker()
108 cl_atomic_dec(&p_msg->p_src_reg->ref_cnt); in __cl_disp_worker()
111 /* Grab the lock for the next iteration through the list. */ in __cl_disp_worker()
112 cl_spinlock_acquire(&p_disp->lock); in __cl_disp_worker()
115 cl_qpool_put(&p_disp->msg_pool, (cl_pool_item_t *) p_msg); in __cl_disp_worker()
118 cl_spinlock_release(&p_disp->lock); in __cl_disp_worker()
125 cl_qlist_init(&p_disp->reg_list); in cl_disp_construct()
126 cl_ptr_vector_construct(&p_disp->reg_vec); in cl_disp_construct()
127 cl_qlist_init(&p_disp->msg_fifo); in cl_disp_construct()
128 cl_spinlock_construct(&p_disp->lock); in cl_disp_construct()
129 cl_qpool_construct(&p_disp->msg_pool); in cl_disp_construct()
137 cl_thread_pool_destroy(&p_disp->worker_threads); in cl_disp_shutdown()
143 while (!cl_is_qlist_empty(&p_disp->reg_list)) in cl_disp_shutdown()
144 free(cl_qlist_remove_head(&p_disp->reg_list)); in cl_disp_shutdown()
151 cl_spinlock_destroy(&p_disp->lock); in cl_disp_destroy()
153 cl_qpool_destroy(&p_disp->msg_pool); in cl_disp_destroy()
155 cl_ptr_vector_destroy(&p_disp->reg_vec); in cl_disp_destroy()
162 cl_status_t status; in cl_disp_init() local
168 status = cl_spinlock_init(&p_disp->lock); in cl_disp_init()
169 if (status != CL_SUCCESS) { in cl_disp_init()
171 return (status); in cl_disp_init()
175 status = cl_qpool_init(&p_disp->msg_pool, CL_DISP_INITIAL_MSG_COUNT, in cl_disp_init()
178 if (status != CL_SUCCESS) { in cl_disp_init()
180 return (status); in cl_disp_init()
183 status = cl_ptr_vector_init(&p_disp->reg_vec, CL_DISP_INITIAL_REG_COUNT, in cl_disp_init()
185 if (status != CL_SUCCESS) { in cl_disp_init()
187 return (status); in cl_disp_init()
190 status = cl_thread_pool_init(&p_disp->worker_threads, thread_count, in cl_disp_init()
192 if (status != CL_SUCCESS) in cl_disp_init()
195 return (status); in cl_disp_init()
205 cl_status_t status; in cl_disp_register() local
210 cl_spinlock_acquire(&p_disp->lock); in cl_disp_register()
212 (msg_id < cl_ptr_vector_get_size(&p_disp->reg_vec)) && in cl_disp_register()
213 (cl_ptr_vector_get(&p_disp->reg_vec, msg_id))) { in cl_disp_register()
214 cl_spinlock_release(&p_disp->lock); in cl_disp_register()
221 cl_spinlock_release(&p_disp->lock); in cl_disp_register()
227 p_reg->p_disp = p_disp; in cl_disp_register()
228 p_reg->ref_cnt = 0; in cl_disp_register()
229 p_reg->pfn_rcv_callback = pfn_callback; in cl_disp_register()
230 p_reg->context = context; in cl_disp_register()
231 p_reg->msg_id = msg_id; in cl_disp_register()
234 cl_qlist_insert_tail(&p_disp->reg_list, (cl_list_item_t *) p_reg); in cl_disp_register()
239 status = cl_ptr_vector_set(&p_disp->reg_vec, msg_id, p_reg); in cl_disp_register()
240 if (status != CL_SUCCESS) { in cl_disp_register()
242 cl_spinlock_release(&p_disp->lock); in cl_disp_register()
247 cl_spinlock_release(&p_disp->lock); in cl_disp_register()
261 p_disp = p_reg->p_disp; in cl_disp_unregister()
264 cl_spinlock_acquire(&p_disp->lock); in cl_disp_unregister()
269 if (p_reg->msg_id != CL_DISP_MSGID_NONE) { in cl_disp_unregister()
270 CL_ASSERT(p_reg->msg_id < in cl_disp_unregister()
271 cl_ptr_vector_get_size(&p_disp->reg_vec)); in cl_disp_unregister()
272 cl_ptr_vector_set(&p_disp->reg_vec, p_reg->msg_id, NULL); in cl_disp_unregister()
274 cl_spinlock_release(&p_disp->lock); in cl_disp_unregister()
276 while (p_reg->ref_cnt > 0) in cl_disp_unregister()
279 cl_spinlock_acquire(&p_disp->lock); in cl_disp_unregister()
281 cl_qlist_remove_item(&p_disp->reg_list, (cl_list_item_t *) p_reg); in cl_disp_unregister()
285 cl_spinlock_release(&p_disp->lock); in cl_disp_unregister()
299 p_disp = handle->p_disp; in cl_disp_post()
303 cl_spinlock_acquire(&p_disp->lock); in cl_disp_post()
305 if (cl_ptr_vector_get_size(&p_disp->reg_vec) <= msg_id) { in cl_disp_post()
306 cl_spinlock_release(&p_disp->lock); in cl_disp_post()
310 p_dest_reg = cl_ptr_vector_get(&p_disp->reg_vec, msg_id); in cl_disp_post()
312 cl_spinlock_release(&p_disp->lock); in cl_disp_post()
317 p_msg = (cl_disp_msg_t *) cl_qpool_get(&p_disp->msg_pool); in cl_disp_post()
319 cl_spinlock_release(&p_disp->lock); in cl_disp_post()
324 p_msg->p_src_reg = p_src_reg; in cl_disp_post()
325 p_msg->p_dest_reg = p_dest_reg; in cl_disp_post()
326 p_msg->p_data = p_data; in cl_disp_post()
327 p_msg->pfn_xmt_callback = pfn_callback; in cl_disp_post()
328 p_msg->context = context; in cl_disp_post()
329 p_msg->in_time = cl_get_time_stamp(); in cl_disp_post()
336 cl_atomic_inc(&p_src_reg->ref_cnt); in cl_disp_post()
339 cl_atomic_inc(&p_dest_reg->ref_cnt); in cl_disp_post()
342 cl_qlist_insert_tail(&p_disp->msg_fifo, (cl_list_item_t *) p_msg); in cl_disp_post()
343 cl_spinlock_release(&p_disp->lock); in cl_disp_post()
346 cl_thread_pool_signal(&p_disp->worker_threads); in cl_disp_post()
354 cl_dispatcher_t *p_disp = ((cl_disp_reg_info_t *) handle)->p_disp; in cl_disp_get_queue_status()
356 cl_spinlock_acquire(&p_disp->lock); in cl_disp_get_queue_status()
360 p_disp->last_msg_queue_time_us / 1000; in cl_disp_get_queue_status()
363 *p_num_queued_msgs = cl_qlist_count(&p_disp->msg_fifo); in cl_disp_get_queue_status()
365 cl_spinlock_release(&p_disp->lock); in cl_disp_get_queue_status()