/*获取一个邮箱物理通道buff*/ MAILBOX_EXTERN long mailbox_request_buff(unsigned long mailcode, struct mb_buff** mb_buf) { struct mb *mailbox = MAILBOX_NULL; unsigned long ret_val = MAILBOX_OK; struct mb_buff ** mbuf = (struct mb_buff **)mb_buf; mailbox = mailbox_get_mb(); *mbuf = MAILBOX_NULL; if (MAILBOX_NULL == mailbox){ return mailbox_logerro_p1(MAILBOX_ERR_GUT_INPUT_PARAMETER, mailcode); } /*检查是否为发送通道*/ if (mailbox->local_id != mailbox_get_src_id(mailcode)){ return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_SRC_CPU, mailcode); } /*获得此邮件邮箱通道的操作句柄: open mail*/ ret_val = mailbox_request_channel(mailbox, mbuf, mailcode); if (MAILBOX_OK == ret_val){ (*mbuf)->mb = mailbox; ret_val = mailbox_init_usr_queue(*mbuf); if (MAILBOX_OK == ret_val) { return MAILBOX_OK; } else { mailbox_release_channel(mailbox, *mbuf); *mbuf = MAILBOX_NULL; return ret_val; } } else { return ret_val; } }
/*封信,准备发送*/ MAILBOX_EXTERN int mailbox_sealup_buff(struct mb_buff * mb_buf , unsigned int usr_size) { struct mb_mail mail = {0}; struct mb_queue *m_queue = MAILBOX_NULL; unsigned int time_stamp; unsigned long mail_addr; m_queue = &mb_buf->mail_queue; /*判断是否超过单次发送最大大小*/ if (usr_size > (mb_buf->config->single_max - sizeof(struct mb_mail) )){ return (int) mailbox_logerro_p2(MAILBOX_ERR_GUT_WRITE_EXCEED_MAX_SIZE, usr_size ,mb_buf->mailcode); } else { } time_stamp = (unsigned int)mailbox_get_timestamp(); /*填充消息头*/ mail.ulPartition = MAILBOX_MSGHEAD_NUMBER; mail.ulWriteSlice = time_stamp; mail.ulReadSlice = 0; mail.ulPriority = 0;/*此属性和OM核对已废弃,不使用*/ mail.ulSeqNum = mb_buf->seq_num; mail.ulMsgLength = usr_size ; mail.ulMailCode = mb_buf->mailcode; if (MAILBOX_SEQNUM_START == mb_buf->seq_num) { (void)mailbox_logerro_p1(MAILBOX_INFO_SEND_FIRST_MAIL, mb_buf->mailcode); } mb_buf->seq_num++; /*向邮箱队列中写入邮件头,并更新队列状态记录临时结构体*/ mail_addr = m_queue->front; (void)mailbox_queue_write(m_queue, (char*)(&mail), sizeof(struct mb_mail)); /*更新邮箱环形缓存信息*/ m_queue->front = mailbox_align_size(mb_buf->usr_queue.front, MAILBOX_ALIGN); (void)mailbox_flush_buff(mb_buf); /*把邮箱通道操作符的信息写回邮箱头。*/ #ifdef MAILBOX_OPEN_MNTN mailbox_record_send(&(mb_buf->mntn), mb_buf->mailcode, time_stamp, mail_addr); #endif /*准备下一封邮件写入*/ return mailbox_init_usr_queue(mb_buf); }