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

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

?? sos_module_fetcher.c

?? 嵌入式操作系統(tǒng)內(nèi)核
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* -*- Mode: C; tab-width:4 -*- *//* ex: set ts=4 shiftwidth=4 softtabstop=4 cindent: */#include <hardware.h>#include <codemem.h>#include <sos_module_fetcher.h>#include <sos_timer.h>#include <message.h>#include <sos_info.h>#include <malloc.h>#include <random.h>#include <led_dbg.h>#ifdef SOS_HAS_EXFLASH#include <exflash.h>#endif#ifdef SOS_SIM#include <sim_interface.h>#endif#include <led_dbg.h>#ifndef SOS_DEBUG_FETCHER#undef DEBUG#define DEBUG(...)#endif/** * @brief A reliable transport service for modules * * The protocol will fetch data from one hop communication (i.e. no routing) * base on given module version, ID, and size of module. * When the protocol fetch is complete, it will inform the requester * * We do not queue any request at this moment.  The reason is that * the probability of getting more than one request is rather low. * This means that the components that use fetcher will have to handle the * failure */static sos_module_t fetcher_module;static inline void handle_overheard_fragment(Message *msg);static int8_t handle_request(Message *msg);static int8_t handle_data(Message *msg);static void free_send_state_map(void);static int8_t fetcher_handler(void *state, Message *msg);static inline void handle_request_timeout(void);static inline void send_fragment(void);static inline void restart_request_timer(void);static void check_map_and_post(void);static void start_new_fetch(void);static void send_fetcher_done(void);static bool check_map(fetcher_bitmap_t *m);#ifndef SOS_DEBUG_FETCHER#define print_bitmap(m)#elsestatic void print_bitmap(fetcher_bitmap_t *m);#endifstatic const mod_header_t mod_header SOS_MODULE_HEADER ={  .mod_id = KER_FETCHER_PID,  .state_size = 0,  .num_timers = 1,  .num_sub_func = 0,  .num_prov_func = 0,  .module_handler = fetcher_handler,};//! the status of sending fragmentenum {    FETCHER_SENDING_FRAGMENT_INTERVAL  = 512L,};typedef struct {    uint16_t dest;    fetcher_fragment_t *fragr;  //!< the code fragment that will be stored    fetcher_fragment_t *frag;  //!< the code fragment that will be sent    fetcher_bitmap_t   *map;    sos_timer_t        timer;	uint8_t            num_funcs;} fetcher_sending_state_t;/** * @brief state for sending fragments * The reason we merge sending and receiving is because * we can send the fragment we have just received. */static fetcher_sending_state_t send_state;/** * @brief state for fetching fragments */static fetcher_state_t *fst = NULL;/** * @brief variable used for resending MSG_FETCHER_DONE * We use FETCHER_REQUEST_TID as retry timer */static bool no_mem_retry = false;int8_t fetcher_request(sos_pid_t req_id, sos_cam_t key, uint16_t size, uint16_t src){    uint8_t bitmap_size;   //! size of the bitmap in bytes    uint16_t num_fragments;    uint8_t i;    fetcher_state_t *f;	fetcher_cam_t *cam;		cam = (fetcher_cam_t *) ker_cam_lookup(key);	if( cam == NULL ) return -EINVAL;    //if(fst != NULL) return -EBUSY;    DEBUG_PID(KER_FETCHER_PID, "fetcher_request, req_id = %d, size = %d, src = %d\n", req_id, size, src);    num_fragments = ((size + (FETCHER_FRAGMENT_SIZE - 1))/ FETCHER_FRAGMENT_SIZE);    bitmap_size = (uint8_t)((num_fragments + 7)/ 8);    //DEBUG("size = %d\n", sizeof(fetcher_state_t) + bitmap_size);    f = ker_malloc(sizeof(fetcher_state_t) + bitmap_size, KER_FETCHER_PID);    if(f == NULL) {        return -ENOMEM;    }    //DEBUG("num_fragments = %d, bitmap_zie = %d\n", num_fragments, bitmap_size);    f->requester       = req_id;    f->map.key         = key;    f->map.bitmap_size = bitmap_size;    f->src_addr        = src;	f->num_funcs       = 0;    f->next            = NULL;	f->cm              = cam->cm;    for(i = 0; i < bitmap_size; i++) {        f->map.bitmap[i] = 0xff;    }    if((num_fragments) % 8) {        f->map.bitmap[bitmap_size - 1] =            (1 << (num_fragments % 8)) - 1;    }    print_bitmap(&f->map);    //! backoff first!!!    f->retx = 0;    if(fst != NULL) {        fetcher_state_t *tmp = fst;		cam->status = FETCHING_QUEUED;        while(tmp->next != NULL) { tmp = tmp->next; }        tmp->next = f;        return SOS_OK;    }	cam->status = FETCHING_STARTED;    fst = f;    //! setup timer    ker_timer_start(KER_FETCHER_PID,            FETCHER_REQUEST_TID,            FETCHER_REQUEST_BACKOFF_SLOT * ((ker_rand() % FETCHER_REQUEST_MAX_SLOT) + 1));    //DEBUG("request ret = %d\n", ret);    return SOS_OK;}int8_t fetcher_cancel(sos_pid_t req_id, sos_cam_t key){    fetcher_state_t *tmp;    fetcher_state_t *prev;    if( fst == NULL ) return -EINVAL;    if( fst->map.key == key ) {	        tmp = fst;        start_new_fetch();        ker_free( tmp );		/*		 * Cancel sender as well		 */		if( (send_state.map != NULL) && (send_state.map->key == key)) {			free_send_state_map();		}        return SOS_OK;    }    prev = fst;    tmp = fst->next;    while(tmp != NULL) {        if( tmp->map.key == key ) {	            prev->next = tmp->next;            ker_free( tmp );            return SOS_OK;	        }        prev = tmp;        tmp = tmp->next;    }    return -EINVAL;}void fetcher_restart(fetcher_state_t *s, uint16_t src){	fetcher_cam_t *cam;	cam = ker_cam_lookup( s->map.key );    s->src_addr = src;    s->retx = 0;	s->next = NULL;    if(fst != NULL) {        fetcher_state_t *tmp = fst;		cam->status = FETCHING_QUEUED;        while(tmp->next != NULL) { tmp = tmp->next; }        tmp->next = s;        return;    }    fst = s;	cam->status = FETCHING_STARTED;    ker_timer_start(KER_FETCHER_PID,            FETCHER_REQUEST_TID,            FETCHER_REQUEST_BACKOFF_SLOT * ((ker_rand() % FETCHER_REQUEST_MAX_SLOT) + 1));}void fetcher_commit(fetcher_state_t *s, bool commit){	fetcher_cam_t *cam;	cam = (fetcher_cam_t *) ker_cam_lookup(s->map.key);	if( cam == NULL ) return;	if( commit == true ) {		ker_codemem_flush( cam->cm, KER_FETCHER_PID );	} else {		ker_codemem_free( cam->cm );	}}static void free_send_state_map(){	ker_free(send_state.map);	send_state.map = NULL;	ker_timer_stop(KER_FETCHER_PID, FETCHER_TRANSMIT_TID);}static int8_t fetcher_handler(void *state, Message *msg){    switch (msg->type) {        case MSG_FETCHER_FRAGMENT:        {			fetcher_fragment_t *f;			f = (fetcher_fragment_t*)msg->data;			f->key = entohs( f->key );			f->frag_id = entohs(f->frag_id);			DEBUG_PID(KER_FETCHER_PID,"MSG_FETCHER_FRAGMENT:\n");			handle_overheard_fragment(msg);			if(fst == NULL) {				DEBUG_PID(KER_FETCHER_PID, "NO Request!!!\n");				return SOS_OK;  //!< no request			}			//DEBUG_PID(KER_FETCHER_PID,"calling restart_request_timer()\n");			restart_request_timer();			fst->retx = 0;			//DEBUG_PID(KER_FETCHER_PID,"calling handle_data()\n");			return handle_data(msg);		}		case MSG_FETCHER_REQUEST:		{			fetcher_bitmap_t *bmap =				(fetcher_bitmap_t *) msg->data;			bmap->key = entohs( bmap->key );			//! received request from neighbors			DEBUG("handling request to %d from %d\n", msg->daddr, msg->saddr);			if(msg->daddr == ker_id()) {				return handle_request(msg);			}			if(fst == NULL) return SOS_OK;  //!< no request			restart_request_timer();			fst->retx = 0;			return SOS_OK;		}		case MSG_TIMER_TIMEOUT:		{			MsgParam *params = (MsgParam*)(msg->data);			if(params->byte == FETCHER_REQUEST_TID) {				//DEBUG("request timeout\n");				if( no_mem_retry ) {					send_fetcher_done();					return SOS_OK;				}				handle_request_timeout();			} else if(params->byte == FETCHER_TRANSMIT_TID) {				//DEBUG("send fragment timeout\n");				send_fragment();			}			return SOS_OK;		}#ifdef SOS_HAS_EXFLASH		case MSG_EXFLASH_WRITEDONE:		{			ker_free(send_state.fragr);			send_state.fragr = NULL;			check_map_and_post();			return SOS_OK;		}		case MSG_EXFLASH_READDONE:		{			post_auto(KER_FETCHER_PID,					KER_FETCHER_PID,					MSG_FETCHER_FRAGMENT,					sizeof(fetcher_fragment_t),					send_state.frag,					SOS_MSG_RELEASE,					send_state.dest);			send_state.frag = NULL;			return SOS_OK;		}#endif		case MSG_INIT:		{			send_state.map = NULL;			send_state.frag = NULL;			send_state.fragr = NULL;			ker_msg_change_rules(KER_FETCHER_PID, SOS_MSG_RULES_PROMISCUOUS);			ker_permanent_timer_init(&(send_state.timer), KER_FETCHER_PID, FETCHER_TRANSMIT_TID, TIMER_REPEAT);			ker_timer_init(KER_FETCHER_PID, FETCHER_REQUEST_TID, TIMER_ONE_SHOT);			return SOS_OK;		}	}	return -EINVAL;}static inline void restart_request_timer(){	ker_timer_restart(KER_FETCHER_PID,			FETCHER_REQUEST_TID,			FETCHER_REQUEST_WATCHDOG + (FETCHER_REQUEST_BACKOFF_SLOT * ((ker_rand() % FETCHER_REQUEST_MAX_SLOT) + 1)));}static inline void handle_request_timeout(){	if(fst == NULL) {		return;	}	//sos_assert(fst != NULL);	//DEBUG("handle request timeout, retx = %d\n", fst->retx);	fst->retx++;	if(fst->retx <= FETCHER_REQUEST_MAX_RETX) {		fetcher_bitmap_t *m;		uint8_t size = sizeof(fetcher_bitmap_t) + fst->map.bitmap_size;		DEBUG_PID(KER_FETCHER_PID,"send request to %d\n", fst->src_addr);		print_bitmap(&fst->map);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成年人网站91| 午夜电影网亚洲视频| 国产成人精品影视| 欧美精品一区二区三区蜜臀| 九九视频精品免费| 久久精品亚洲精品国产欧美kt∨| 激情六月婷婷久久| 亚洲国产精品99久久久久久久久| 99久久伊人网影院| 亚洲影院免费观看| 欧美一级爆毛片| 国产999精品久久久久久绿帽| 亚洲欧洲一区二区在线播放| 欧美日韩一区二区三区在线看| 日韩福利电影在线| 国产欧美va欧美不卡在线| 日本大香伊一区二区三区| 丝袜美腿成人在线| 久久精品欧美一区二区三区不卡 | 久久不见久久见免费视频7| 久久奇米777| 99精品视频在线观看免费| 视频一区欧美精品| 欧美极品xxx| 欧美日韩色综合| 国产**成人网毛片九色| 亚洲午夜精品久久久久久久久| 精品免费99久久| 99精品桃花视频在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲欧洲性图库| 欧美电视剧在线观看完整版| 99精品久久免费看蜜臀剧情介绍| 日韩中文字幕不卡| 亚洲人成影院在线观看| 日韩欧美一级精品久久| 91色视频在线| 国产美女精品一区二区三区| 亚洲成av人在线观看| 国产精品久久三| 日韩欧美黄色影院| 欧美日韩亚洲不卡| 成人黄色小视频在线观看| 免费在线观看视频一区| 亚洲欧美日韩精品久久久久| 久久久综合视频| 日韩一区二区免费在线观看| 色天天综合久久久久综合片| 国产不卡在线视频| 久久97超碰色| 人人狠狠综合久久亚洲| 亚洲一区欧美一区| 亚洲欧洲www| 日本一区二区免费在线 | 国产一区二区三区四区五区美女| 亚洲午夜久久久久久久久电影网| 国产精品免费av| 日韩一区二区视频| 欧美裸体bbwbbwbbw| 色偷偷久久一区二区三区| 国产不卡视频在线播放| 国产精品一二三四| 国产一区二区影院| 国产一区二区成人久久免费影院| 日韩av电影天堂| 亚洲线精品一区二区三区八戒| 亚洲手机成人高清视频| 中文字幕一区二区三区在线播放| 久久久欧美精品sm网站| 精品久久国产97色综合| 精品国产一区二区三区av性色| 欧美日韩国产一级片| 欧美日韩你懂的| 欧美嫩在线观看| 91精品国产欧美一区二区成人| 欧美高清www午色夜在线视频| 欧美三级在线看| 欧美肥妇free| 精品国产乱码久久久久久夜甘婷婷 | 日韩一区在线看| 国产精品不卡一区| ㊣最新国产の精品bt伙计久久| 国产精品国产自产拍高清av| 国产精品久久久一本精品| 中文字幕一区二区三中文字幕| 日韩美女精品在线| 一区二区日韩av| 日韩经典一区二区| 久久精品国产第一区二区三区| 极品少妇一区二区| 国产成人精品免费一区二区| 成人激情动漫在线观看| 一本一道久久a久久精品| 欧洲一区二区三区免费视频| 欧美日韩国产一级| 日韩精品一区二区三区四区 | 亚洲欧美另类图片小说| 亚洲国产精品一区二区www| 日韩成人一区二区三区在线观看| 久热成人在线视频| 高潮精品一区videoshd| 91啪亚洲精品| 69堂国产成人免费视频| 久久免费电影网| 亚洲欧美日本在线| 日韩二区三区在线观看| 国产精品1区2区| 在线观看日产精品| 日韩欧美一区二区久久婷婷| 国产精品无遮挡| 亚洲第一电影网| 国产成人激情av| 欧美综合一区二区| 精品国产乱码久久久久久浪潮| 中文字幕中文乱码欧美一区二区 | 国内精品视频一区二区三区八戒| 成人一区二区三区| 欧美日韩国产免费| 国产精品三级视频| 日本视频在线一区| 99精品久久久久久| 精品欧美一区二区久久| 亚洲美女偷拍久久| 国产一区二区福利| 欧美剧在线免费观看网站| 亚洲国产高清在线观看视频| 日本中文一区二区三区| aa级大片欧美| 欧美精品一区二区三区四区 | 国产精品久久久久久久久免费樱桃| 亚洲一区在线免费观看| 成人精品视频一区| 日韩女同互慰一区二区| 一区二区三区蜜桃网| 国产精品1区2区3区在线观看| 制服丝袜日韩国产| 亚洲人成亚洲人成在线观看图片| 久久99精品久久久| 欧美日韩精品是欧美日韩精品| 国产精品久久久久三级| 国模娜娜一区二区三区| 欧美人xxxx| 亚洲一区在线观看免费观看电影高清| 国产精品一区二区免费不卡 | 成人免费视频在线观看| 国产一区二区影院| 欧美第一区第二区| 午夜a成v人精品| 欧美性感一区二区三区| 亚洲欧洲国产日本综合| 成人av影视在线观看| 久久精品视频网| 激情久久久久久久久久久久久久久久| 欧美性受极品xxxx喷水| 亚洲激情图片qvod| 91视频一区二区| 综合在线观看色| gogogo免费视频观看亚洲一| 国产日韩一级二级三级| 精品一区二区三区久久久| 欧美一区二区三区性视频| 天天综合网天天综合色| 69堂精品视频| 九九在线精品视频| 久久综合九色欧美综合狠狠| 久草在线在线精品观看| 久久综合色婷婷| 国产精品亚洲成人| 中文字幕av免费专区久久| 国产成人高清在线| 中文字幕中文字幕中文字幕亚洲无线 | 久久久精品一品道一区| 国产在线不卡视频| 国产亚洲精品中文字幕| 国产成人一级电影| 中文字幕一区二区三中文字幕| 99久久精品99国产精品| 亚洲精品国产精品乱码不99| 在线观看欧美日本| 午夜一区二区三区在线观看| 欧美日韩一区二区三区视频| 偷拍与自拍一区| 欧美成人精品福利| 福利电影一区二区三区| 专区另类欧美日韩| 欧美午夜影院一区| 老司机精品视频一区二区三区| 久久欧美中文字幕| 99国产精品久久久久久久久久久| 亚洲另类春色国产| 制服丝袜激情欧洲亚洲| 国产伦精品一区二区三区视频青涩| 久久网站热最新地址| www.66久久| 婷婷久久综合九色国产成人| 精品国产欧美一区二区| 成人激情小说乱人伦| 午夜成人免费视频| 国产欧美中文在线| 欧美高清激情brazzers|