亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? message_queue.c

?? 嵌入式操作系統內核
?? C
字號:
/* -*- Mode: C; tab-width:4 -*- *//* ex: set ts=4 shiftwidth=4 softtabstop=4 cindent: *//* * Copyright (c) 2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above *    copyright notice, this list of conditions and the following *    disclaimer in the documentation and/or other materials provided *    with the distribution. * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgement: *       This product includes software developed by Networked & *       Embedded Systems Lab at UCLA * 4. Neither the name of the University nor that of the Laboratory *    may be used to endorse or promote products derived from this *    software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: message_queue.c,v 1.12 2006/12/26 07:38:03 simonhan Exp $ *//** * @brief     SOS message queue implementation * @author    Simon Han (simonhan@cs.ucla.edu) */#include <message_queue.h>#include <message.h>#include <malloc.h>#include <hardware_types.h>#include <monitor.h>#include <string.h>#include <sos_sched.h>// Comment out the lines below to enable debug messages from this component#undef DEBUG#define DEBUG(...)#define MSG_QUEUE_NUM_ITEMS  4    // NOTE: #define MSG_POOL_EMPTY      0x0F  // bit vector that specifies the pool to be                                   // empty.  This value corresponds to                                   // MSG_QUEUE_NUM_ITEMS.  For 8,                                   // the value is 0xFF.  For 7, it will be 0x7F//----------------------------------------------------------------------------//  Typedefs//----------------------------------------------------------------------------typedef struct msg_pool_item {	struct msg_pool_item *next;	Message pool[MSG_QUEUE_NUM_ITEMS];	uint8_t alloc;   //!< allocation vector} msg_pool_item;//----------------------------------------------------------------------------//  Global data declarations//----------------------------------------------------------------------------static msg_pool_item msg_pool;//----------------------------------------------------------------------------//  Funcation declarations//----------------------------------------------------------------------------int8_t msg_queue_init(){	msg_pool.next = NULL;		msg_pool.alloc = 0;    return 0;}/** * @brief initialize the message queue */void mq_init(mq_t *q){  q->msg_cnt = 0;  q->hm_cnt = 0;  q->sm_cnt = 0;  q->lm_cnt = 0;  q->hq_head = NULL;  q->hq_tail = NULL;  q->sq_head = NULL;  q->sq_tail = NULL;  q->lq_head = NULL;  q->lq_tail = NULL;}/** * @brief enqueue message to message queue * We enqueue the message based on the flag in the message */void mq_enqueue(mq_t *q, Message *m){  HAS_CRITICAL_SECTION;  ENTER_CRITICAL_SECTION();    m->next = NULL;    if(flag_high_priority(m->flag)){	  //! high priority message	  if(q->hq_head == NULL) {		  //! empty head		  q->hq_head = m;			  q->hq_tail = m;	  } else {		  //! insert to tail		  q->hq_tail->next = m;		  q->hq_tail = m;	  }	  q->hm_cnt++;  } else if(flag_system(m->flag)){	  //! system msgs	  if(q->sq_head == NULL) {		  //! empty head		  q->sq_head = m;			  q->sq_tail = m;	  } else {		  //! insert to tail		  q->sq_tail->next = m;		  q->sq_tail = m;	  }	  q->sm_cnt++;  } else {	  //! low priority message	  if(q->lq_head == NULL) {		  //! empty head		  q->lq_head = m;			  q->lq_tail = m;	  } else {		  //! insert to tail		  q->lq_tail->next = m;		  q->lq_tail = m;	  }	  q->lm_cnt++;  }  q->msg_cnt++;  LEAVE_CRITICAL_SECTION();}/** * @brief dequeue message * @return pointer to message, or NULL for empty queue * First we check high priority queue. * if it is empty, we check for low priority queue */Message *mq_dequeue(mq_t *q){	HAS_CRITICAL_SECTION;	Message *tmp = NULL;	ENTER_CRITICAL_SECTION();	if ((tmp = q->hq_head) != NULL) { 	//! high priority message		q->hq_head = tmp->next;		q->hm_cnt--;	//! system msgs	} else if ((tmp = q->sq_head) != NULL) {		q->sq_head = tmp->next;		q->sm_cnt--;	} else if ((tmp = q->lq_head) != NULL) { 	//! low priority message		q->lq_head = tmp->next;		q->lm_cnt--;	} else {		LEAVE_CRITICAL_SECTION();		return NULL;	}	q->msg_cnt--;	LEAVE_CRITICAL_SECTION();	return tmp;}static Message *mq_real_get(Message **head, Message **tail, Message *m){  Message *prev;  Message *curr;  prev = *head;  curr = *head;  while(curr != NULL) {	if(m->did == curr->did &&	   m->sid == curr->sid &&	   m->daddr == curr->daddr &&	   m->saddr == curr->saddr &&	   m->type == curr->type  &&	   m->len == curr->len ) {	  uint8_t i = 0;	  Message *ret = curr;	  bool msg_matched = true;	  for(i = 0; i < m->len; i++) {		if(m->data[i] != curr->data[i]) {		  msg_matched = false;		  break;		}		  }	  if(msg_matched == true) {		if(ret == (*head)) {		  *head = curr->next;		  if( (*head) == NULL ) {			*tail = NULL;		  } 		} else if(ret == (*tail)) {		  prev->next = NULL;		  *tail = prev;		} else {		  prev->next = curr->next;		}		return ret;	  }	}	prev = curr;	curr = curr->next;  }  return NULL;}/** * @brief get message that matches the header in the queue * * NOTE it matches only daddr, saddr, did, sid, type * NOTE it only gets the first that matches the description */Message *mq_get(mq_t *q, Message *m){  HAS_CRITICAL_SECTION;  Message *ret;  if(q->msg_cnt == 0) return NULL;  ENTER_CRITICAL_SECTION();	  //! first search high priority queue  ret = mq_real_get(&(q->hq_head), &(q->hq_tail), m);  if(ret) {	q->msg_cnt--;	LEAVE_CRITICAL_SECTION();	return ret;  }  //! search low priority queue  ret = mq_real_get(&(q->lq_head), &(q->lq_tail), m);  if(ret) {	q->msg_cnt--;  }  LEAVE_CRITICAL_SECTION();  return ret;}/** * @brief create message * @return pointer to message, or NULL for fail * get new message header from message repositary * msg->data is pointing to payload */Message *msg_create(){	HAS_CRITICAL_SECTION;	msg_pool_item *prev = NULL;	msg_pool_item *itr;	Message *tmp = NULL;	//	// Get from msg_pool	//	ENTER_CRITICAL_SECTION();	itr = &msg_pool;		while( itr != NULL ) {		if( itr->alloc != MSG_POOL_EMPTY) {			break;		}		prev = itr;		itr = itr->next;	}	if( itr == NULL ) {		DEBUG("MQ: itr == NULL, allocate new\n");		prev->next = ker_malloc(sizeof(msg_pool_item), MSG_QUEUE_PID);		if( prev->next == NULL ) {			LEAVE_CRITICAL_SECTION();			return NULL;		}		itr = prev->next;		itr->next = NULL;		itr->alloc = 0x01;		tmp = &(itr->pool[0]);	} else {		//		// Find empty block		//		uint8_t i = 0;		uint8_t mask = 0x01;		for( i = 0; i < MSG_QUEUE_NUM_ITEMS; i++, mask<<=1 ) {			if( (itr->alloc & mask) == 0 ) {				DEBUG("MQ: allocate %x of item %d\n", (unsigned int)itr, i);				itr->alloc |= mask;				tmp = &(itr->pool[i]);				break;			}		}	}	LEAVE_CRITICAL_SECTION();  //tmp = (Message*)ker_malloc(sizeof(Message), MSG_QUEUE_PID);  //if(tmp != NULL) {	tmp->data = tmp->payload;	tmp->flag = 0;  //}  return tmp;}#ifdef FAULT_TOLERANT_SOS// Move a given message from the kernel to the module domainMessage *msg_move_to_module_domain(Message *msg_ker_domain){  Message *msg_mod_domain;  if  (mem_check_module_domain((uint8_t*)msg_ker_domain) == false){	DEBUG("Message header in kernel domain ... moving to module domain\n");	// Allocate space for the new message header	msg_mod_domain = (Message*)module_domain_alloc(sizeof(Message), MSG_QUEUE_PID);	if (NULL == msg_mod_domain){	  DEBUG("Out of memory in module domain ... failed to move message\n");	  return NULL;	}	// Copy the message header over	memcpy(msg_mod_domain, msg_ker_domain, sizeof(Message));	// Check if the original message was a short message	// Fix the data pointer, free the old message and return new message	if (msg_ker_domain->data == msg_ker_domain->payload){	  DEBUG("Internal payload ... message moved\n");	  msg_mod_domain->data = msg_mod_domain->payload;	  DEBUG("Freeing the header located in kernel domain\n");	  ker_free(msg_ker_domain);	  return msg_mod_domain;	}  }  else {	DEBUG("Message header in module domain\n");	if (msg_ker_domain->data == msg_ker_domain->payload){	  DEBUG("Internal payload ... message moved\n");	  return msg_ker_domain;	}	msg_mod_domain = msg_ker_domain;  }  // Check if the data lies in the module domain  // Copy message payload over to the module domain if it is in the kernel domain  if (mem_check_module_domain(msg_ker_domain->data) == false){	DEBUG("Message payload in kernel domain ... moving to module domain\n");	if (msg_ker_domain->len > 0){	  uint8_t* newdata = (uint8_t*)ker_malloc(msg_ker_domain->len, msg_ker_domain->did);	  if (NULL == newdata){		DEBUG("Out of memory in module domain ...failed to move message\n");		if (msg_mod_domain != msg_ker_domain){		  DEBUG("Free the header that was moved into the module domain\n");		  ker_free(msg_mod_domain);		  return NULL;		}	  }	  memcpy(newdata, msg_ker_domain->data, msg_ker_domain->len);	  if (flag_msg_release(msg_ker_domain->flag)){		DEBUG("Free the message payload located in kernel domain\n");		ker_free(msg_ker_domain->data);	  }	  msg_mod_domain->data = newdata;	  msg_mod_domain->flag |= SOS_MSG_RELEASE;	}	else{	  msg_mod_domain->data = NULL;	  ker_free(msg_ker_domain->data); // Just to be sure. This should be NULL anyway	}  }  if (msg_mod_domain != msg_ker_domain){	DEBUG("Free the header located in kernel domain\n");	ker_free(msg_ker_domain);  }  return msg_mod_domain;}#endif //FAULT_TOLERANT_SOS/** * @brief dispose message * return message header back to message repostitary */void msg_dispose(Message *m){	HAS_CRITICAL_SECTION;	msg_pool_item *prev = NULL;	msg_pool_item *itr;	if(flag_msg_release(m->flag)) { 		ker_free(m->data); 	}	ENTER_CRITICAL_SECTION();	itr = &msg_pool;	while( itr != NULL ) {		if( m >= itr->pool && m < (itr->pool + MSG_QUEUE_NUM_ITEMS) ) {			uint8_t mask = 1 << (m - itr->pool);			itr->alloc &= ~mask;				DEBUG("MQ: free %x of item %d\n", (unsigned int)itr, m - itr->pool);			if( (itr->alloc == 0) && (itr != (&msg_pool))) {				DEBUG("MQ: free one pool\n");				prev->next = itr->next;				ker_free(itr);			}			LEAVE_CRITICAL_SECTION();			return;		}		prev = itr;		itr = itr->next;	}	if( itr == NULL ) {		// 		// Cannot find the item in the pool, call ker_free().  		// this should never happen.		ker_free(m);	}	LEAVE_CRITICAL_SECTION();}/** * @brief handle the process of creating senddone message * @param msg_sent  the Message just sent or delivered * @param succ      is the delivery successful? * @param msg_owner the owner of the message  * NOTE the implementation will need to improve */void msg_send_senddone(Message *msg_sent, bool succ, sos_pid_t msg_owner){  uint8_t flag;    if(flag_msg_reliable(msg_sent->flag) == 0) {	msg_dispose(msg_sent);	return;  }    /*   * Release the memory    */  if(flag_msg_release(msg_sent->flag)){	ker_free(msg_sent->data);	msg_sent->flag &= ~(SOS_MSG_RELEASE);	msg_sent->data = NULL;  }  if(succ == false) {	flag = SOS_MSG_SEND_FAIL;   } else {	flag = 0;  }  if(post_long(msg_sent->sid, msg_owner, MSG_PKT_SENDDONE, 			   sizeof(Message), msg_sent, flag) < 0) {	msg_dispose(msg_sent);  } }/*  void mq_print(mq_t *q)  {  Message *itr;  DEBUG("Message Queue\n");  for(itr = q->hq_head; itr != NULL; itr = itr->next)  {  msg_header_out("MQ H", itr);  }	  for(itr = q->lq_head; itr != NULL; itr = itr->next)  {  msg_header_out("MQ L", itr);  }	  }*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产伦精品一区二区三区视频青涩| 国产毛片精品国产一区二区三区| 日韩视频免费直播| 懂色av中文字幕一区二区三区| 亚洲大片免费看| 国产精品三级久久久久三级| 91精品国产色综合久久不卡电影 | 日韩免费视频一区| 一本久道久久综合中文字幕| 韩国女主播一区| 日日夜夜精品免费视频| 亚洲欧美综合在线精品| 久久蜜桃香蕉精品一区二区三区| 精品1区2区3区| 色系网站成人免费| 不卡视频一二三四| 国产精品白丝av| 久久99精品久久久久久动态图| 一区二区三区小说| 18涩涩午夜精品.www| 久久久亚洲综合| 91精品国产欧美一区二区18 | 欧美日韩综合不卡| 一本色道a无线码一区v| 成人精品小蝌蚪| 国产乱人伦偷精品视频免下载| 青青草国产精品97视觉盛宴| 婷婷综合五月天| 香蕉成人伊视频在线观看| 亚洲精品日韩一| 一区二区高清免费观看影视大全| 最新不卡av在线| 亚洲人成网站在线| 国产精品网友自拍| 国产喂奶挤奶一区二区三区| 精品处破学生在线二十三| 日韩免费在线观看| 精品国产露脸精彩对白| 精品国产免费一区二区三区四区| 4438x成人网最大色成网站| 欧美剧情片在线观看| 欧美日韩精品是欧美日韩精品| 色婷婷综合视频在线观看| 91麻豆精品视频| 色网站国产精品| 欧美亚洲一区二区三区四区| 欧美色视频一区| 91精品啪在线观看国产60岁| 欧美一级生活片| 日韩欧美亚洲国产精品字幕久久久| 欧美一级片在线| 欧美变态tickling挠脚心| 日韩欧美成人激情| 久久久国际精品| 国产精品久久久久久久久晋中| 国产精品午夜免费| 亚洲另类春色国产| 午夜精品在线视频一区| 日本免费新一区视频| 国产一区二区三区黄视频| 国产传媒一区在线| 91在线云播放| 欧美日韩国产免费| 欧美精品一区二区三区蜜臀| 国产日韩欧美不卡| 亚洲男人的天堂在线观看| 亚洲国产wwwccc36天堂| 日韩av一区二区在线影视| 国产精品一区在线| 一本久久精品一区二区| 欧美一级xxx| 国产人成一区二区三区影院| 亚洲欧美一区二区三区孕妇| 丝袜国产日韩另类美女| 国产一区二区调教| 在线观看国产精品网站| 日韩午夜精品视频| 国产精品美女久久久久av爽李琼| 一区二区三区在线播| 另类小说色综合网站| 北条麻妃国产九九精品视频| 欧美日韩久久一区| 国产精品网友自拍| 高清beeg欧美| 欧美日韩在线免费视频| 精品成人私密视频| 亚洲在线成人精品| 国内精品免费**视频| 91视频在线看| 26uuu亚洲| 一区二区三区视频在线看| 韩国av一区二区三区| 欧美在线免费观看亚洲| 国产人成亚洲第一网站在线播放| 亚洲成人av电影| 成人高清在线视频| 日韩精品一区二区三区在线观看 | 欧美在线视频不卡| 国产女人水真多18毛片18精品视频| 亚洲影院在线观看| 国产91精品精华液一区二区三区| 欧美精品久久99| 亚洲精品第1页| 国产激情91久久精品导航| 欧美精品三级日韩久久| 综合色天天鬼久久鬼色| 国产风韵犹存在线视精品| 在线成人av影院| 亚洲精品国产第一综合99久久| 国产在线精品国自产拍免费| 欧美精品亚洲二区| 亚洲天堂av一区| 国产大片一区二区| 精品免费一区二区三区| 亚洲电影一区二区| 色综合久久久久久久| 国产精品少妇自拍| 国产一区二区三区四| 日韩精品一区国产麻豆| 日本人妖一区二区| 欧美老肥妇做.爰bbww视频| 亚洲一区二区综合| 91伊人久久大香线蕉| 国产欧美视频一区二区| 精品系列免费在线观看| 欧美一区二区视频网站| 性感美女久久精品| 欧美日韩视频专区在线播放| 亚洲五月六月丁香激情| 欧美在线一区二区| 亚洲自拍都市欧美小说| 欧美图区在线视频| 亚洲伊人伊色伊影伊综合网| 一本大道综合伊人精品热热| 亚洲色图另类专区| 91蜜桃在线免费视频| 亚洲婷婷在线视频| 在线免费亚洲电影| 亚洲成在人线在线播放| 欧美色欧美亚洲另类二区| 亚洲午夜电影网| 欧美精选在线播放| 免费在线观看一区二区三区| 欧美精品高清视频| 日本中文字幕不卡| 欧美成人在线直播| 寂寞少妇一区二区三区| 亚洲精品一区二区精华| 国产酒店精品激情| 国产精品乱码妇女bbbb| 99久久精品免费精品国产| 一区二区三区在线影院| 欧美图区在线视频| 老司机免费视频一区二区三区| 日韩一区二区三区免费看| 狠狠狠色丁香婷婷综合激情 | 亚洲18女电影在线观看| 欧美日韩激情一区| 久久99久久精品| 国产欧美日韩麻豆91| av成人免费在线观看| 亚洲精品中文字幕乱码三区| 欧美性生活大片视频| 欧美a级一区二区| 国产丝袜美腿一区二区三区| 99国产精品久久久| 午夜久久久久久电影| 精品国产乱码91久久久久久网站| 成人app软件下载大全免费| 亚洲精品国产a| 日韩视频免费观看高清完整版 | 亚洲午夜精品17c| 日韩欧美中文字幕一区| 成a人片亚洲日本久久| 亚洲国产精品嫩草影院| 精品免费日韩av| 91美女片黄在线观看| 麻豆91精品视频| 亚洲欧洲精品天堂一级| 欧美一区午夜视频在线观看| 国产一区欧美二区| 亚洲国产成人精品视频| 久久综合狠狠综合久久综合88 | 国产精品网站在线播放| 欧美乱妇23p| www.亚洲免费av| 日本中文字幕一区二区有限公司| 国产精品污网站| 欧美一级二级三级乱码| 色综合天天综合网国产成人综合天 | 成人黄页在线观看| 青草av.久久免费一区| 1000精品久久久久久久久| 欧美日本一道本在线视频| 成人激情图片网| 久久丁香综合五月国产三级网站| 一区二区三区在线观看视频| 国产欧美日韩在线观看| 欧美一区二区三区在线看| 在线亚洲一区二区|