在OSE运行的APP进程均有一个PCB结构体,结构体中包含了指向该进程signal list的指针,是一个链表,实际上是指向链表的头指针与尾指针,头指针结构中包含指向下一个signal的next指针。其他进程向该进程发送的消息,将用此链表维护。
PCB:
/* Signal buffers head of list.*/
struct sigbuf *sigbuf_head;
/* Signal buffers tail of list.*/
struct sigbuf *sigbuf_tail;
sigbuf_head:
/* Next signal in the list.*/
struct sigbuf *next;
进程一旦启动,就进入while循环(Loop forever),msg_receive会调用OSE的receive系统函数接收消息。如果循环又从头开始执行,这时会通过msg_receive进入系统调用receive函数,receive函数执行有两种情况:
1,如果此时该进程的signal list不空,函数将取出链表头指针指向的signal,然后再调整下signal list,将链表的头指针指向signal list的下一个signal,最后返回取出的signal。
2,如果发现该进程的signal list是空的,函数将在判断signal list为空的分支代码处puts this process to sleep via system call "odo_wait". 在该进程sleep过程中,如果有A进程向该进程发送消息,OSE的send系统函数将会把消息挂到当前进程的signal list中,并且如果A进程优先级低于当前进程,会触发OSE从A进程切换到当前进程执行(OSE进程抢占式调度方式),然后当前进程继续从上次sleep代码处指向,在receive函数中对signal list遍历的for循环的下一次执行中,将会得到A进程所发的signal,并返回。
while(true)
{
msg = msg_receive(WAIT_INFINITE);
handler(msg);
release(msg);
}