Lines Matching refs:ch

156 static void _rt_channel_check_wq_wakup_locked(rt_channel_t ch)  in _rt_channel_check_wq_wakup_locked()  argument
158 if (rt_list_isempty(&ch->wait_msg)) in _rt_channel_check_wq_wakup_locked()
163 rt_wqueue_wakeup(&ch->reader_queue, 0); in _rt_channel_check_wq_wakup_locked()
177 rt_channel_t ch = RT_NULL; in rt_raw_channel_open() local
216 ch = (rt_channel_t)object; in rt_raw_channel_open()
217 level = rt_spin_lock_irqsave(&ch->slock); in rt_raw_channel_open()
218 ch->ref++; /* increase the reference count */ in rt_raw_channel_open()
219 rt_spin_unlock_irqrestore(&ch->slock, level); in rt_raw_channel_open()
224 if (!ch && err == RT_EOK) in rt_raw_channel_open()
230 ch = (rt_channel_t)rt_object_allocate(RT_Object_Class_Channel, name); in rt_raw_channel_open()
233 if (ch) in rt_raw_channel_open()
235 rt_channel_object_init(&ch->parent); /* suspended receivers */ in rt_raw_channel_open()
236 rt_spin_lock_init(&ch->slock); in rt_raw_channel_open()
237 rt_list_init(&ch->wait_msg); /* unhandled messages */ in rt_raw_channel_open()
238 rt_list_init(&ch->wait_thread); /* suspended senders */ in rt_raw_channel_open()
239 rt_wqueue_init(&ch->reader_queue); /* reader poll queue */ in rt_raw_channel_open()
240 ch->reply = RT_NULL; in rt_raw_channel_open()
241 ch->stat = RT_IPC_STAT_IDLE; /* no suspended threads */ in rt_raw_channel_open()
242 ch->ref = 1; in rt_raw_channel_open()
248 return ch; in rt_raw_channel_open()
254 rt_err_t rt_raw_channel_close(rt_channel_t ch) in rt_raw_channel_close() argument
261 if (ch != RT_NULL) in rt_raw_channel_close()
274 level = rt_spin_lock_irqsave(&ch->slock); in rt_raw_channel_close()
276 if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel) in rt_raw_channel_close()
280 else if (rt_object_is_systemobject(&ch->parent.parent) != RT_FALSE) in rt_raw_channel_close()
284 else if (ch->ref == 0) in rt_raw_channel_close()
290 ch->ref--; in rt_raw_channel_close()
294 rt_spin_unlock_irqrestore(&ch->slock, level); in rt_raw_channel_close()
298 if (ch->ref == 0) in rt_raw_channel_close()
301 _channel_list_resume_all_locked(&ch->parent.suspend_thread); in rt_raw_channel_close()
302 _channel_list_resume_all_locked(&ch->wait_thread); in rt_raw_channel_close()
305 rt_list_init(&ch->wait_msg); in rt_raw_channel_close()
307 rt_object_delete(&ch->parent.parent); /* release the IPC channel structure */ in rt_raw_channel_close()
319 rt_channel_t ch; in wakeup_sender_wait_recv() local
321 ch = (rt_channel_t)object; in wakeup_sender_wait_recv()
322 if (ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread) in wakeup_sender_wait_recv()
324 ch->stat = RT_IPC_STAT_IDLE; in wakeup_sender_wait_recv()
325 ch->reply = RT_NULL; in wakeup_sender_wait_recv()
332 l = ch->wait_msg.next; in wakeup_sender_wait_recv()
333 while (l != &ch->wait_msg) in wakeup_sender_wait_recv()
351 rt_channel_t ch; in wakeup_sender_wait_reply() local
353 ch = (rt_channel_t)object; in wakeup_sender_wait_reply()
354 RT_ASSERT(ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread); in wakeup_sender_wait_reply()
355 ch->stat = RT_IPC_STAT_IDLE; in wakeup_sender_wait_reply()
356 ch->reply = RT_NULL; in wakeup_sender_wait_reply()
365 rt_channel_t ch; in sender_timeout() local
369 ch = (rt_channel_t)(thread->wakeup_handle.user_data); in sender_timeout()
370 if (ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread) in sender_timeout()
372 ch->stat = RT_IPC_STAT_IDLE; in sender_timeout()
373 ch->reply = RT_NULL; in sender_timeout()
380 l = ch->wait_msg.next; in sender_timeout()
381 while (l != &ch->wait_msg) in sender_timeout()
471 static rt_err_t _do_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, int need_reply, rt_ch…
476 static rt_err_t _send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, int need_reply, rt_chann… in _send_recv_timeout() argument
486 if (ch == RT_NULL) in _send_recv_timeout()
492 if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel) in _send_recv_timeout()
507 rc = _do_send_recv_timeout(ch, data, need_reply, data_ret, time, msg); in _send_recv_timeout()
514 static rt_err_t _do_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, int need_reply, rt_ch… in _do_send_recv_timeout() argument
538 level = rt_spin_lock_irqsave(&ch->slock); in _do_send_recv_timeout()
540 switch (ch->stat) in _do_send_recv_timeout()
546 rc = rt_channel_list_suspend(&ch->wait_thread, thread_send); in _do_send_recv_timeout()
553 rt_thread_wakeup_set(thread_send, wakeup_sender_wait_recv, (void *)ch); in _do_send_recv_timeout()
576 rt_list_insert_before(&ch->wait_msg, &msg->mlist); in _do_send_recv_timeout()
584 RT_ASSERT(ch->parent.suspend_thread.next != &ch->parent.suspend_thread); in _do_send_recv_timeout()
588 rc = rt_channel_list_suspend(&ch->wait_thread, thread_send); in _do_send_recv_timeout()
595 ch->reply = thread_send; /* record the current waiting sender */ in _do_send_recv_timeout()
596 ch->stat = RT_IPC_STAT_ACTIVE; in _do_send_recv_timeout()
597 rt_thread_wakeup_set(thread_send, wakeup_sender_wait_reply, (void *)ch); in _do_send_recv_timeout()
616 ch->stat = RT_IPC_STAT_IDLE; in _do_send_recv_timeout()
623 thread_recv = RT_THREAD_LIST_NODE_ENTRY(ch->parent.suspend_thread.next); in _do_send_recv_timeout()
627 rt_channel_list_resume(&ch->parent.suspend_thread); in _do_send_recv_timeout()
636 if (ch->stat == RT_IPC_STAT_IDLE) in _do_send_recv_timeout()
638 _rt_channel_check_wq_wakup_locked(ch); in _do_send_recv_timeout()
640 rt_spin_unlock_irqrestore(&ch->slock, level); in _do_send_recv_timeout()
668 rt_spin_unlock_irqrestore(&ch->slock, level); in _do_send_recv_timeout()
677 rt_err_t rt_raw_channel_send(rt_channel_t ch, rt_channel_msg_t data) in rt_raw_channel_send() argument
679 return _send_recv_timeout(ch, data, 0, 0, RT_WAITING_FOREVER); in rt_raw_channel_send()
685 rt_err_t rt_raw_channel_send_recv(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t data_ret) in rt_raw_channel_send_recv() argument
687 return _send_recv_timeout(ch, data, 1, data_ret, RT_WAITING_FOREVER); in rt_raw_channel_send_recv()
693 rt_err_t rt_raw_channel_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t … in rt_raw_channel_send_recv_timeout() argument
695 return _send_recv_timeout(ch, data, 1, data_ret, time); in rt_raw_channel_send_recv_timeout()
701 rt_err_t rt_raw_channel_reply(rt_channel_t ch, rt_channel_msg_t data) in rt_raw_channel_reply() argument
708 if (ch == RT_NULL) in rt_raw_channel_reply()
714 level = rt_spin_lock_irqsave(&ch->slock); in rt_raw_channel_reply()
716 if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel) in rt_raw_channel_reply()
720 else if (ch->stat != RT_IPC_STAT_ACTIVE) in rt_raw_channel_reply()
724 else if (ch->reply == RT_NULL) in rt_raw_channel_reply()
740 thread = ch->reply; in rt_raw_channel_reply()
743 ch->stat = RT_IPC_STAT_IDLE; in rt_raw_channel_reply()
744 ch->reply = RT_NULL; in rt_raw_channel_reply()
746 _rt_channel_check_wq_wakup_locked(ch); in rt_raw_channel_reply()
750 rt_spin_unlock_irqrestore(&ch->slock, level); in rt_raw_channel_reply()
760 rt_channel_t ch; in wakeup_receiver() local
764 ch = (rt_channel_t)object; in wakeup_receiver()
766 level = rt_spin_lock_irqsave(&ch->slock); in wakeup_receiver()
767 ch->stat = RT_IPC_STAT_IDLE; in wakeup_receiver()
769 ret = rt_channel_list_resume(&ch->parent.suspend_thread); in wakeup_receiver()
770 _rt_channel_check_wq_wakup_locked(ch); in wakeup_receiver()
771 rt_spin_unlock_irqrestore(&ch->slock, level); in wakeup_receiver()
779 rt_channel_t ch; in receiver_timeout() local
784 ch = (rt_channel_t)(thread->wakeup_handle.user_data); in receiver_timeout()
789 rt_spin_lock(&ch->slock); in receiver_timeout()
790 ch->stat = RT_IPC_STAT_IDLE; in receiver_timeout()
796 _rt_channel_check_wq_wakup_locked(ch); in receiver_timeout()
797 rt_spin_unlock(&ch->slock); in receiver_timeout()
806 static rt_err_t _rt_raw_channel_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_int32_t tim… in _rt_raw_channel_recv_timeout() argument
816 if (ch == RT_NULL) in _rt_raw_channel_recv_timeout()
821 level = rt_spin_lock_irqsave(&ch->slock); in _rt_raw_channel_recv_timeout()
823 if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel) in _rt_raw_channel_recv_timeout()
827 else if (ch->stat != RT_IPC_STAT_IDLE) in _rt_raw_channel_recv_timeout()
833 if (ch->wait_msg.next != &ch->wait_msg) /* there exist unhandled messages */ in _rt_raw_channel_recv_timeout()
835 msg_ret = rt_list_entry(ch->wait_msg.next, struct rt_ipc_msg, mlist); in _rt_raw_channel_recv_timeout()
836 rt_list_remove(ch->wait_msg.next); /* remove the message from the channel */ in _rt_raw_channel_recv_timeout()
841 RT_ASSERT(ch->wait_thread.next != &ch->wait_thread); in _rt_raw_channel_recv_timeout()
842 thread = RT_THREAD_LIST_NODE_ENTRY(ch->wait_thread.next); in _rt_raw_channel_recv_timeout()
843 rt_list_remove(ch->wait_thread.next); in _rt_raw_channel_recv_timeout()
845 ch->reply = thread; /* record the waiting sender */ in _rt_raw_channel_recv_timeout()
846 ch->stat = RT_IPC_STAT_ACTIVE; /* no valid suspened receivers */ in _rt_raw_channel_recv_timeout()
865 rc = rt_channel_list_suspend(&ch->parent.suspend_thread, thread); in _rt_raw_channel_recv_timeout()
868 rt_thread_wakeup_set(thread, wakeup_receiver, (void *)ch); in _rt_raw_channel_recv_timeout()
869 ch->stat = RT_IPC_STAT_WAIT; /* no valid suspended senders */ in _rt_raw_channel_recv_timeout()
885 rt_spin_unlock_irqrestore(&ch->slock, level); in _rt_raw_channel_recv_timeout()
907 level = rt_spin_lock_irqsave(&ch->slock); in _rt_raw_channel_recv_timeout()
912 rt_spin_unlock_irqrestore(&ch->slock, level); in _rt_raw_channel_recv_timeout()
917 rt_err_t rt_raw_channel_recv(rt_channel_t ch, rt_channel_msg_t data) in rt_raw_channel_recv() argument
919 return _rt_raw_channel_recv_timeout(ch, data, RT_WAITING_FOREVER); in rt_raw_channel_recv()
922 rt_err_t rt_raw_channel_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_int32_t time) in rt_raw_channel_recv_timeout() argument
924 return _rt_raw_channel_recv_timeout(ch, data, time); in rt_raw_channel_recv_timeout()
929 rt_err_t rt_raw_channel_peek(rt_channel_t ch, rt_channel_msg_t data) in rt_raw_channel_peek() argument
931 return _rt_raw_channel_recv_timeout(ch, data, 0); in rt_raw_channel_peek()
1012 rt_channel_t ch; in channel_fops_poll() local
1015 ch = (rt_channel_t)file->vnode->data; in channel_fops_poll()
1017 level = rt_spin_lock_irqsave(&ch->slock); in channel_fops_poll()
1018 rt_poll_add(&(ch->reader_queue), req); in channel_fops_poll()
1019 if (ch->stat != RT_IPC_STAT_IDLE) in channel_fops_poll()
1021 rt_spin_unlock_irqrestore(&ch->slock, level); in channel_fops_poll()
1024 if (!rt_list_isempty(&ch->wait_msg)) in channel_fops_poll()
1028 rt_spin_unlock_irqrestore(&ch->slock, level); in channel_fops_poll()
1035 rt_channel_t ch; in channel_fops_close() local
1039 ch = (rt_channel_t)file->vnode->data; in channel_fops_close()
1041 level = rt_spin_lock_irqsave(&ch->slock); in channel_fops_close()
1045 ch->ref--; in channel_fops_close()
1046 if (ch->ref == 0) in channel_fops_close()
1049 _channel_list_resume_all_locked(&ch->parent.suspend_thread); in channel_fops_close()
1050 _channel_list_resume_all_locked(&ch->wait_thread); in channel_fops_close()
1053 rt_list_init(&ch->wait_msg); in channel_fops_close()
1055 rt_spin_unlock_irqrestore(&ch->slock, level); in channel_fops_close()
1057 rt_object_delete(&ch->parent.parent); /* release the IPC channel structure */ in channel_fops_close()
1061 rt_spin_unlock_irqrestore(&ch->slock, level); in channel_fops_close()
1066 rt_spin_unlock_irqrestore(&ch->slock, level); in channel_fops_close()
1081 rt_channel_t ch = RT_NULL; in lwp_channel_open() local
1099 ch = rt_raw_channel_open(name, flags); in lwp_channel_open()
1100 if (ch) in lwp_channel_open()
1107 d->vnode->data = (void *)ch; in lwp_channel_open()
1127 rt_channel_t ch; in fd_2_channel() local
1129 ch = (rt_channel_t)d->vnode->data; in fd_2_channel()
1130 if (ch) in fd_2_channel()
1132 return ch; in fd_2_channel()
1140 rt_channel_t ch; in lwp_channel_close() local
1156 ch = fd_2_channel(fdt_type, fd); in lwp_channel_close()
1157 if (!ch) in lwp_channel_close()
1165 return rt_raw_channel_close(ch); in lwp_channel_close()
1173 rt_channel_t ch; in lwp_channel_send() local
1175 ch = fd_2_channel(fdt_type, fd); in lwp_channel_send()
1176 if (ch) in lwp_channel_send()
1178 return rt_raw_channel_send(ch, data); in lwp_channel_send()
1185 rt_channel_t ch; in lwp_channel_send_recv_timeout() local
1187 ch = fd_2_channel(fdt_type, fd); in lwp_channel_send_recv_timeout()
1188 if (ch) in lwp_channel_send_recv_timeout()
1190 return rt_raw_channel_send_recv_timeout(ch, data, data_ret, time); in lwp_channel_send_recv_timeout()
1197 rt_channel_t ch; in lwp_channel_reply() local
1199 ch = fd_2_channel(fdt_type, fd); in lwp_channel_reply()
1200 if (ch) in lwp_channel_reply()
1202 return rt_raw_channel_reply(ch, data); in lwp_channel_reply()
1209 rt_channel_t ch; in lwp_channel_recv_timeout() local
1211 ch = fd_2_channel(fdt_type, fd); in lwp_channel_recv_timeout()
1212 if (ch) in lwp_channel_recv_timeout()
1214 return rt_raw_channel_recv_timeout(ch, data, time); in lwp_channel_recv_timeout()