📄 msg.c
字号:
/* MShowTec - www.mshowtec.com
** msLinux msg.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
**
*/
#define MSLINUX_MSG_C
#include "errno.h"
#include "msg.h"
#include "malloc.h"
struct message mslinux_message_list[MSLINUX_MAX_MSG_NUM];
long msg_get_target_mail_box(int receiver_pid)
{
int i = 0;
struct message *msg_next = 0,*tmp_p = 0;
i = sys_getdstpset(receiver_pid);
if(mslinux_message_list[i].msg_used == 0){
return (long)(&mslinux_message_list[i]);
}
msg_next = &mslinux_message_list[i];
while(msg_next->msg_next){
msg_next = msg_next->msg_next;
}
tmp_p = malloc(sizeof(struct message));
if(tmp_p == 0){
printk("msg_get_target_mail_box error\r\n");
return -ERROR;
}
memset(tmp_p,0,sizeof(struct message));
msg_next->msg_next = tmp_p;
return (long)tmp_p;
return -EMSGFULL;
}
long msg_check_mail_box(int receiver)
{
int i = 0;
struct message *msg_next = 0,*tmp_p = 0;
i = sys_getpset();
if((mslinux_message_list[i].msg_used )&&(mslinux_message_list[i].msg_receiver == receiver)){
return (long)(&mslinux_message_list[i]);
}
msg_next = mslinux_message_list[i].msg_next;
while(msg_next){
if((msg_next->msg_used )&&(msg_next->msg_receiver == receiver)){
return (long)msg_next;
}else{
tmp_p = msg_next->msg_next;
free(msg_next);
msg_next = tmp_p;
}
}
return -EMSGNULL;
}
void mslinux_message_init()
{
memset(mslinux_message_list,0,(sizeof(struct message)*MSLINUX_MAX_MSG_NUM));
}
int message_receive(struct message *p_msg)
{
int ret = 0;
long mailbox_id = -1;
int irq_save = 0;
irq_save = mslinux_save_disable_irq();
while(1){
mailbox_id = msg_check_mail_box(sys_getpid());
if(mailbox_id < 0){
mslinux_restore_irq(irq_save);
sleep_on(&(mslinux_message_list[sys_getpset()].msg_wait));
irq_save = mslinux_save_disable_irq();
}else{
p_msg->msg_sender = ((struct message *)mailbox_id)->msg_sender;
p_msg->msg_receiver = ((struct message *)mailbox_id)->msg_receiver;
p_msg->msg_length = ((struct message *)mailbox_id)->msg_length;
p_msg->msg_pointer = ((struct message *)mailbox_id)->msg_pointer;
p_msg->msg_used = 0;
((struct message *)mailbox_id)->msg_used = 0;
mslinux_message_list[sys_getpset()].msg_next = ((struct message *)mailbox_id)->msg_next;
if((struct message *)mailbox_id != &mslinux_message_list[sys_getpset()])
free((void*)mailbox_id);
goto RET;
}
}
RET:
mslinux_restore_irq(irq_save);
return ret;
}
int message_send(struct message *p_msg)
{
int ret = 0;
long mailbox_id = -1;
int irq_save = 0;
irq_save = mslinux_save_disable_irq();
mailbox_id = msg_get_target_mail_box(p_msg->msg_receiver);
if(mailbox_id < 0){
ret = -EMSGFULL;
goto RET;
}
((struct message *)mailbox_id)->msg_receiver = p_msg->msg_receiver;
((struct message *)mailbox_id)->msg_sender = p_msg->msg_sender;
((struct message *)mailbox_id)->msg_length = p_msg->msg_length;
((struct message *)mailbox_id)->msg_pointer = p_msg->msg_pointer;
((struct message *)mailbox_id)->msg_used = 1;
wake_up(&(mslinux_message_list[sys_getdstpset(p_msg->msg_receiver)].msg_wait));
RET:
mslinux_restore_irq(irq_save);
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -