⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msg.c

📁 ADS环境下的类似linux内核的操作系统
💻 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 + -