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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? mbus.c

?? MPEG-4編解碼的實(shí)現(xiàn)(包括MPEG4視音頻編解碼)
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
	mbus_validate(m);

	if (!mbus_waiting_ack(m)) {
		return;
	}

	mbus_msg_validate(curr);

	gettimeofday(&time, NULL);

	/* diff is time in milliseconds that the message has been awaiting an ACK */
	diff = ((time.tv_sec * 1000) + (time.tv_usec / 1000)) - ((curr->send_time.tv_sec * 1000) + (curr->send_time.tv_usec / 1000));
	if (diff > 10000) {
		debug_msg("Reliable mbus message failed!\n");
		if (m->err_handler == NULL) {
			abort();
		}
		m->err_handler(curr->seqnum, MBUS_MESSAGE_LOST);
		/* if we don't delete this failed message, the error handler
                   gets triggered every time we call mbus_retransmit */
		while (m->waiting_ack->num_cmds > 0) {
		    m->waiting_ack->num_cmds--;
		    xfree(m->waiting_ack->cmd_list[m->waiting_ack->num_cmds]);
		    xfree(m->waiting_ack->arg_list[m->waiting_ack->num_cmds]);
		}
		xfree(m->waiting_ack->dest);
		xfree(m->waiting_ack);
		m->waiting_ack = NULL;
		return;
	} 
	/* Note: We only send one retransmission each time, to avoid
	 * overflowing the receiver with a burst of requests...
	 */
	if ((diff > 750) && (curr->retransmit_count == 2)) {
		resend(m, curr);
		return;
	} 
	if ((diff > 500) && (curr->retransmit_count == 1)) {
		resend(m, curr);
		return;
	} 
	if ((diff > 250) && (curr->retransmit_count == 0)) {
		resend(m, curr);
		return;
	}
}

void mbus_heartbeat(struct mbus *m, int interval)
{
	struct timeval	curr_time;
	char	*a = (char *) xmalloc(3);
	sprintf(a, "()");

	mbus_validate(m);

	gettimeofday(&curr_time, NULL);
	if (curr_time.tv_sec - m->last_heartbeat.tv_sec >= interval) {
		mb_header(++m->seqnum, (int) curr_time.tv_sec, 'U', m->addr, "()", -1);
		mb_add_command("mbus.hello", "");
		mb_send(m);

		m->last_heartbeat = curr_time;
		/* Remove dead sources */
		remove_inactiv_other_addr(m, curr_time, interval);
	}
	xfree(a);
}

int mbus_waiting_ack(struct mbus *m)
{
	mbus_validate(m);
	return m->waiting_ack != NULL;
}

int mbus_sent_all(struct mbus *m)
{
	mbus_validate(m);
	return (m->cmd_queue == NULL) && (m->waiting_ack == NULL);
}

struct mbus *mbus_init(void  (*cmd_handler)(char *src, char *cmd, char *arg, void *dat), 
		       void  (*err_handler)(int seqnum, int reason),
		       char  *addr)
{
	struct mbus		*m;
	struct mbus_key	 	 k;
	struct mbus_parser	*mp;
	int		 	 i;
	char            	*net_addr, *tmp;
	uint16_t         	 net_port;
	int              	 net_scope;

	m = (struct mbus *) xmalloc(sizeof(struct mbus));
	if (m == NULL) {
		debug_msg("Unable to allocate memory for mbus\n");
		return NULL;
	}

	m->cfg = mbus_create_config();
	mbus_lock_config_file(m->cfg);
	net_addr = (char *) xmalloc(20);
	mbus_get_net_addr(m->cfg, net_addr, &net_port, &net_scope);
	m->s		  = udp_init(net_addr, net_port, net_port, net_scope);
        if (m->s == NULL) {
                debug_msg("Unable to initialize mbus address\n");
                xfree(m);
                return NULL;
        }
	m->seqnum         = 0;
	m->cmd_handler    = cmd_handler;
	m->err_handler	  = err_handler;
	m->num_other_addr = 0;
	m->max_other_addr = 10;
	m->other_addr     = (char **) xmalloc(sizeof(char *) * 10);
	m->other_hello    = (struct timeval **) xmalloc(sizeof(struct timeval *) * 10);
	for (i = 0; i < 10; i++) {
		m->other_addr[i]  = NULL;
		m->other_hello[i] = NULL;
	}
	m->cmd_queue	  = NULL;
	m->waiting_ack	  = NULL;
	m->magic          = MBUS_MAGIC;
	m->index          = 0;
	m->index_sent     = 0;

	mp = mbus_parse_init(xstrdup(addr));
	if (!mbus_parse_lst(mp, &tmp)) {
		debug_msg("Invalid mbus address\n");
		abort();
	}
	m->addr = xstrdup(tmp);
	mbus_parse_done(mp);
	ASSERT(m->addr != NULL);

	gettimeofday(&(m->last_heartbeat), NULL);

	mbus_get_encrkey(m->cfg, &k);
	m->encrkey    = k.key;
	m->encrkeylen = k.key_len;

	mbus_get_hashkey(m->cfg, &k);
	m->hashkey    = k.key;
	m->hashkeylen = k.key_len;

	mbus_unlock_config_file(m->cfg);

	xfree(net_addr);

	return m;
}

void mbus_cmd_handler(struct mbus *m, void  (*cmd_handler)(char *src, char *cmd, char *arg, void *dat))
{
	mbus_validate(m);
	m->cmd_handler = cmd_handler;
}

static void mbus_flush_msgs(struct mbus_msg **queue)
{
        struct mbus_msg *curr, *next;
        int i;
	
        curr = *queue;
        while(curr) {
                next = curr->next;
                xfree(curr->dest);
                for(i = 0; i < curr->num_cmds; i++) {
                        xfree(curr->cmd_list[i]);
                        xfree(curr->arg_list[i]);
                }
		xfree(curr);
                curr = next;
        }
	*queue = NULL;
}

void mbus_exit(struct mbus *m) 
{
        int i;

        ASSERT(m != NULL);
	mbus_validate(m);

	mbus_qmsg(m, "()", "mbus.bye", "", FALSE);
	mbus_send(m);

	/* FIXME: It should be a fatal error to call mbus_exit() if some messages are still outstanding. */
	/*        We will need an mbus_flush() call first though, to ensure nothing is waiting.          */
        mbus_flush_msgs(&m->cmd_queue);
        mbus_flush_msgs(&m->waiting_ack);

        if (m->encrkey != NULL) {
                xfree(m->encrkey);
        }
        if (m->hashkey != NULL) {
        	xfree(m->hashkey);
	}

        udp_exit(m->s);

	/* Clean up other_* */
	for (i=m->num_other_addr-1; i>=0; i--){
	    remove_other_addr(m, m->other_addr[i]);
	}

        xfree(m->addr);
	xfree(m->other_addr);
	xfree(m->other_hello);
	xfree(m->cfg);
        xfree(m);
}

void mbus_send(struct mbus *m)
{
	/* Send one, or more, messages previosly queued with mbus_qmsg(). */
	/* Messages for the same destination are batched together. Stops  */
	/* when a reliable message is sent, until the ACK is received.    */
	struct mbus_msg	*curr = m->cmd_queue;
	int		 i;

	mbus_validate(m);
	if (m->waiting_ack != NULL) {
		return;
	}

	while (curr != NULL) {
		mbus_msg_validate(curr);
		/* It's okay for us to send messages which haven't been marked as complete - */
		/* that just means we're sending something which has the potential to have   */
		/* more data piggybacked. However, if it's not complete it MUST be the last  */
		/* in the list, or something has been reordered - which is bad.              */
		if (!curr->complete) {
			ASSERT(curr->next == NULL);
		}

		if (curr->reliable) {
		        if (!mbus_addr_valid(m, curr->dest)) {
			    debug_msg("Trying to send reliably to an unknown address...\n");
			    if (m->err_handler == NULL) {
				abort();
			    }
			    m->err_handler(curr->seqnum, MBUS_DESTINATION_UNKNOWN);
			}
		        if (!mbus_addr_unique(m, curr->dest)) {
			    debug_msg("Trying to send reliably but address is not unique...\n");
			    if (m->err_handler == NULL) {
				abort();
			    }
			    m->err_handler(curr->seqnum, MBUS_DESTINATION_NOT_UNIQUE);
			}
		}
		/* Create the message... */
		mb_header(curr->seqnum, curr->comp_time.tv_sec, (char)(curr->reliable?'R':'U'), m->addr, curr->dest, -1);
		for (i = 0; i < curr->num_cmds; i++) {
			ASSERT(m->index_sent == (curr->idx_list[i] - 1));
			m->index_sent = curr->idx_list[i];
			mb_add_command(curr->cmd_list[i], curr->arg_list[i]);
		}
		mb_send(m);
		
		m->cmd_queue = curr->next;
		if (curr->reliable) {
			/* Reliable message, wait for the ack... */
			gettimeofday(&(curr->send_time), NULL);
			m->waiting_ack = curr;
			curr->next = NULL;
			return;
		} else {
			while (curr->num_cmds > 0) {
				curr->num_cmds--;
				xfree(curr->cmd_list[curr->num_cmds]); curr->cmd_list[curr->num_cmds] = NULL;
				xfree(curr->arg_list[curr->num_cmds]); curr->arg_list[curr->num_cmds] = NULL;
			}
			xfree(curr->dest);
			xfree(curr);
		}
		curr = m->cmd_queue;
	}
}

void mbus_qmsg(struct mbus *m, const char *dest, const char *cmnd, const char *args, int reliable)
{
	/* Queue up a message for sending. The message is not */
	/* actually sent until mbus_send() is called.         */
	struct mbus_msg	*curr = m->cmd_queue;
	struct mbus_msg	*prev = NULL;
	int		 alen = strlen(cmnd) + strlen(args) + 4;
	int		 i;

	mbus_validate(m);
	while (curr != NULL) {
		mbus_msg_validate(curr);
		if (!curr->complete) {
			/* This message is still open for new commands. It MUST be the last in the */
			/* cmd_queue, else commands will be reordered.                             */
			ASSERT(curr->next == NULL);
			if (mbus_addr_identical(curr->dest, dest) &&
		            (curr->num_cmds < MBUS_MAX_QLEN) && ((curr->message_size + alen) < (MBUS_BUF_SIZE - 500))) {
				curr->num_cmds++;
				curr->reliable |= reliable;
				curr->cmd_list[curr->num_cmds-1] = xstrdup(cmnd);
				curr->arg_list[curr->num_cmds-1] = xstrdup(args);
				curr->idx_list[curr->num_cmds-1] = ++(m->index);
				curr->message_size += alen;
				mbus_msg_validate(curr);
				return;
			} else {
				curr->complete = TRUE;
			}
		}
		prev = curr;
		curr = curr->next;
	}
	/* If we get here, we've not found an open message in the cmd_queue.  We */
	/* have to create a new message, and add it to the end of the cmd_queue. */
	curr = (struct mbus_msg *) xmalloc(sizeof(struct mbus_msg));
	curr->magic            = MBUS_MSG_MAGIC;
	curr->next             = NULL;
	curr->dest             = xstrdup(dest);
	curr->retransmit_count = 0;
	curr->message_size     = alen + 60 + strlen(dest) + strlen(m->addr);
	curr->seqnum           = ++m->seqnum;
	curr->reliable         = reliable;
	curr->complete         = FALSE;
	curr->num_cmds         = 1;
	curr->cmd_list[0]      = xstrdup(cmnd);
	curr->arg_list[0]      = xstrdup(args);
	curr->idx_list[curr->num_cmds-1] = ++(m->index);
	for (i = 1; i < MBUS_MAX_QLEN; i++) {
		curr->cmd_list[i] = NULL;
		curr->arg_list[i] = NULL;
	}
	if (prev == NULL) {
		m->cmd_queue = curr;
	} else {
		prev->next = curr;
	}
	gettimeofday(&(curr->send_time), NULL);
	gettimeofday(&(curr->comp_time), NULL);
	mbus_msg_validate(curr);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉成人伊视频在线观看| 韩国中文字幕2020精品| 久久久久久久久久美女| 欧美怡红院视频| 丁香六月综合激情| 久久国产精品一区二区| 性久久久久久久久久久久| 日韩美女啊v在线免费观看| 久久久久久久久免费| 日韩一级视频免费观看在线| 色综合久久中文字幕综合网| 成人在线视频首页| 国内成人免费视频| 日韩精品免费视频人成| 亚洲综合男人的天堂| 中文字幕综合网| 亚洲国产成人在线| 国产亚洲精品bt天堂精选| 日韩视频免费直播| 91精品欧美福利在线观看| 欧美视频在线不卡| 欧洲一区在线电影| 色哦色哦哦色天天综合| 91丨porny丨中文| 波多野结衣精品在线| 福利一区在线观看| 国产黄色成人av| 国产成人精品一区二区三区四区 | 日韩欧美一级精品久久| 在线精品视频免费观看| 91在线一区二区| av午夜精品一区二区三区| 成人午夜短视频| 成人一区在线观看| 成人性生交大片免费看中文| 国产高清成人在线| 成人蜜臀av电影| av在线一区二区三区| 北条麻妃一区二区三区| 成人成人成人在线视频| 97se亚洲国产综合自在线| av中文一区二区三区| 色激情天天射综合网| 欧洲一区二区三区在线| 欧美高清性hdvideosex| 欧美军同video69gay| 91精品欧美久久久久久动漫| 日韩女优视频免费观看| 2022国产精品视频| 国产精品欧美极品| 亚洲另类春色国产| 日韩高清在线不卡| 蜜桃视频在线观看一区| 国产一区不卡视频| 91在线视频在线| 欧美日韩情趣电影| 欧美xxxxx牲另类人与| 久久九九久精品国产免费直播| 国产欧美日韩三级| 一区二区三区欧美视频| 日韩中文字幕不卡| 国产成人精品免费网站| 色综合 综合色| 欧美一级理论性理论a| 久久亚洲一区二区三区明星换脸 | 香蕉加勒比综合久久| 激情亚洲综合在线| 99精品国产91久久久久久| 欧美美女喷水视频| 久久精品免视看| 亚洲美女精品一区| 麻豆国产精品官网| 91在线视频免费91| 欧美一级片免费看| ●精品国产综合乱码久久久久| 亚洲国产精品久久一线不卡| 久久成人麻豆午夜电影| av男人天堂一区| 欧美一区二区播放| 自拍偷在线精品自拍偷无码专区| 日韩黄色一级片| 成人性视频免费网站| 欧美一区二区三区啪啪| 国产精品视频你懂的| 日韩av成人高清| 91色婷婷久久久久合中文| 日韩午夜在线播放| 亚洲日本免费电影| 国产黄色91视频| 91精品国产高清一区二区三区蜜臀 | 国产一区二区三区精品欧美日韩一区二区三区 | 日韩av电影天堂| 97久久精品人人做人人爽50路| 日韩亚洲电影在线| 一区二区三区在线播放| 国产麻豆精品在线| 日韩一区二区三区四区五区六区| 最新不卡av在线| 国产一区二三区好的| 欧美日韩国产综合一区二区 | 26uuu国产日韩综合| 一区二区理论电影在线观看| 国产福利一区二区三区在线视频| 欧美巨大另类极品videosbest | 亚洲免费观看高清| 国产69精品久久久久777| 91精品免费在线| 亚洲影院在线观看| eeuss鲁片一区二区三区| 亚洲精品一区二区三区四区高清| 亚洲成人免费看| 色网综合在线观看| 国产精品国产三级国产aⅴ中文 | 久久婷婷国产综合国色天香| 日韩不卡一区二区三区| 欧美无砖专区一中文字| 亚洲图片欧美激情| www.在线成人| 国产日韩一级二级三级| 久久99精品国产.久久久久久 | 中文字幕一区二区三区在线观看| 国产伦精品一区二区三区在线观看 | 一区二区三区免费在线观看| 成人av在线资源网| 亚洲国产成人一区二区三区| 国产在线播放一区二区三区| 欧美成人激情免费网| 久久国产精品无码网站| 久久综合五月天婷婷伊人| 久久精品99久久久| 久久先锋影音av| 国产美女精品人人做人人爽| 久久久久一区二区三区四区| 国产精品69久久久久水密桃| 久久婷婷国产综合国色天香| 国产一区二区三区久久悠悠色av| 久久精品亚洲麻豆av一区二区| 国产精品中文字幕日韩精品| 国产欧美一区在线| av亚洲精华国产精华| 亚洲视频精选在线| 欧美日韩亚洲高清一区二区| 日本不卡在线视频| 精品久久人人做人人爰| 国产精品综合网| 亚洲欧美中日韩| 欧美视频一区二区三区四区| 日本不卡免费在线视频| 精品999久久久| 成人性色生活片免费看爆迷你毛片| 国产精品灌醉下药二区| 在线一区二区视频| 男人操女人的视频在线观看欧美| 精品国产一区久久| 福利电影一区二区| 亚洲欧美另类久久久精品2019 | 国产丝袜美腿一区二区三区| 成人福利视频网站| 一区二区三区中文免费| 51久久夜色精品国产麻豆| 国产制服丝袜一区| 亚洲欧美综合网| 91麻豆精品久久久久蜜臀| 国内外成人在线| 亚洲人成人一区二区在线观看| 欧美日本在线看| 国产福利91精品| 亚洲最大色网站| 久久久久久久av麻豆果冻| 色婷婷综合中文久久一本| 麻豆成人久久精品二区三区红| 国产精品剧情在线亚洲| 欧美福利视频导航| 成人黄色777网| 免费人成网站在线观看欧美高清| 国产片一区二区三区| 欧美亚男人的天堂| 国产精品一线二线三线| 亚洲va国产天堂va久久en| 中文字幕日韩一区二区| 视频一区在线播放| 色综合久久中文字幕综合网| 强制捆绑调教一区二区| 中文字幕一区二区三区精华液 | 不卡视频在线观看| 午夜精品久久久久久久99水蜜桃 | 亚洲一区av在线| 久久九九国产精品| 欧美日韩精品是欧美日韩精品| 国产ts人妖一区二区| 首页国产欧美久久| 日韩一区日韩二区| 久久久久综合网| 欧美一卡2卡三卡4卡5免费| 91尤物视频在线观看| 国产一区二区调教| 肉丝袜脚交视频一区二区| 日韩理论片在线| 欧美激情资源网| 精品国精品自拍自在线|