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

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

?? timer.c

?? 最新的仙鏡傳說服務器C語言源碼
?? C
字號:
// $Id: timer.c,v 1.8 2003/07/09 03:56:29 lemit Exp $
// original : core.c 2003/02/26 18:03:12 Rev 1.7

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>

#include "timer.h"

#ifdef MEMWATCH
#include "memwatch.h"
#endif

static struct TimerData* timer_data;
static int timer_data_max,timer_data_num;
static int* free_timer_list;
static int free_timer_list_max, free_timer_list_pos;

static int timer_heap_max;
static int* timer_heap = NULL;

// for debug
struct timer_func_list {
	int (*func)(int,unsigned int,int,int);
	struct timer_func_list* next;
	char name[4];
};
static struct timer_func_list* tfl_root;

//
int add_timer_func_list(int (*func)(int,unsigned int,int,int),char* name)
{
	struct timer_func_list* tfl;

	tfl = calloc(sizeof(*tfl) + strlen(name), 1);
	if (tfl == NULL) {
		printf("out of memory : add_timer_func_list\n");
		return 1;
	}
	tfl->next = tfl_root;
	tfl->func = func;
	strcpy(tfl->name,name);
	tfl_root = tfl;

	return 0;
}

char* search_timer_func_list(int (*func)(int,unsigned int,int,int))
{
	struct timer_func_list* tfl;
	for(tfl = tfl_root;tfl;tfl = tfl->next) {
		if (func == tfl->func)
			return tfl->name;
	}
	return "???";
}

/*----------------------------
 * 	Get tick time
 *----------------------------*/
static unsigned int gettick_cache;
static int gettick_count;
unsigned int gettick_nocache(void)
{
	struct timeval tval;
	gettimeofday(&tval,NULL);
	gettick_count = 256;
	return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec/1000;
}

unsigned int gettick(void)
{
	gettick_count--;
	if (gettick_count<0)
		return gettick_nocache();
	return gettick_cache;
}

/*====================================== 
 * 	CORE : Timer Heap
 *--------------------------------------
 */
static void push_timer_heap(int index)
{
	int i, h;

	if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max) {
		int first = timer_heap == NULL;

		timer_heap_max += 256;
		timer_heap = realloc(timer_heap, sizeof(int) * timer_heap_max);
		if (timer_heap == NULL) {
			printf("out of memory : push_timer_heap\n");
			exit(1);
		}
		memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
		if (first)
			timer_heap[0] = 0;
	}

	timer_heap[0]++;

	for (h = timer_heap[0]-1, i = (h - 1) / 2;
		 h > 0 && DIFF_TICK(timer_data[index].tick,
			timer_data[timer_heap[i + 1]].tick) < 0;
		 i = (h - 1) / 2) {
		timer_heap[h + 1] = timer_heap[i + 1];
		h = i;
	}
	timer_heap[h + 1] = index;
}

static inline int top_timer_heap()
{
	if (timer_heap == NULL || timer_heap[0] <= 0)
		return -1;

	return timer_heap[1];
}

static inline int pop_timer_heap()
{
	int i,h,k;
	int ret,last;

	if (timer_heap == NULL || timer_heap[0] <= 0)
		return -1;
	ret = timer_heap[1];
	last = timer_heap[timer_heap[0]];
	timer_heap[0]--;

	for(h = 0,k = 2;k<timer_heap[0];k = k * 2 + 2) {
		if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick , timer_data[timer_heap[k]].tick)>0)
			k--;
		timer_heap[h + 1] = timer_heap[k + 1], h = k;
	}
	if (k == timer_heap[0])
		timer_heap[h + 1] = timer_heap[k], h = k-1;

	for(i = (h-1)/2;
		h>0 && DIFF_TICK(timer_data[timer_heap[i + 1]].tick , timer_data[last].tick)>0;
		i = (h-1)/2) {
		timer_heap[h + 1] = timer_heap[i + 1],h = i;
	}
	timer_heap[h + 1] = last;

	return ret;
}

int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data)
{
	struct TimerData* td;
	int i;

	if (free_timer_list_pos) {
		do {
			i = free_timer_list[--free_timer_list_pos];
		} while(i >= timer_data_num && free_timer_list_pos > 0);
	} else
		i = timer_data_num;
	if (i >= timer_data_num)
		for (i = timer_data_num;i<timer_data_max && timer_data[i].type; i++);
	if (i >= timer_data_num && i >= timer_data_max) {
		int j;
		if (timer_data_max == 0) {
			timer_data_max = 256;
			timer_data = calloc(sizeof(struct TimerData) * timer_data_max, 1);
			if (timer_data == NULL) {
				printf("out of memory : add_timer timer_data\n");
				exit(1);
			}
			//timer_data[0] = NULL;
		} else {
			timer_data_max += 256;
			timer_data = realloc(timer_data,sizeof(struct TimerData) * timer_data_max);
			if (timer_data == NULL) {
				printf("out of memory : add_timer timer_data\n");
				exit(1);
			}
			memset(timer_data + (timer_data_max - 256), 0,
				sizeof(struct TimerData) * 256);
		}
		for(j = timer_data_max-256;j<timer_data_max; j++)
			timer_data[j].type = 0;
	}
	td = &timer_data[i];
	td->tick = tick;
	td->func = func;
	td->id = id;
	td->data = data;
	td->type = TIMER_ONCE_AUTODEL;
	td->interval = 1000;
	push_timer_heap(i);
	if (i >= timer_data_num)
		timer_data_num = i + 1;
	return i;
}

int add_timer_interval(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data,int interval)
{
	int tid;
	tid = add_timer(tick,func,id,data);
	timer_data[tid].type = TIMER_INTERVAL;
	timer_data[tid].interval = interval;
	return tid;
}

int delete_timer(int id,int (*func)(int,unsigned int,int,int))
{
	if (id <= 0 || id >= timer_data_num) {
		printf("delete_timer error : no such timer %d\n", id);
		return -1;
	}
	if (timer_data[id].func != func) {
		printf("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n",
			 (int)timer_data[id].func,
				search_timer_func_list(timer_data[id].func),
			 (int)func,
				search_timer_func_list(func));
		return -2;
	}
	// 偦偺偆偪徚偊傞偵傑偐偣傞
	timer_data[id].func = NULL;
	timer_data[id].type = TIMER_ONCE_AUTODEL;
	timer_data[id].tick -= 60 * 60 * 1000;
	return 0;
}

int addtick_timer(int tid,unsigned int tick)
{
	return timer_data[tid].tick += tick;
}
struct TimerData* get_timer(int tid)
{
	return &timer_data[tid];
}


int do_timer(unsigned int tick)
{
	int i,nextmin = 1000;

#if 0
	static int disp_tick = 0;
	if (DIFF_TICK(disp_tick,tick)<-5000 || DIFF_TICK(disp_tick,tick)>5000) {
		printf("timer %d(%d + %d)\n",timer_data_num,timer_heap[0],free_timer_list_pos);
		disp_tick = tick;
	}
#endif

	while((i = top_timer_heap()) >= 0) {
		if (DIFF_TICK(timer_data[i].tick , tick)>0) {
			nextmin = DIFF_TICK(timer_data[i].tick , tick);
			break;
		}
		pop_timer_heap();
		timer_data[i].type |= TIMER_REMOVE_HEAP;
		if (timer_data[i].func) {
			if (DIFF_TICK(timer_data[i].tick , tick) < -1000) {
				// 1昩埲忋偺戝暆側抶墑偑敪惗偟偰偄傞偺偱丄
				// timer張棟僞僀儈儞僌傪尰嵼抣偲偡傞帠偱
				// 屇傃弌偟帪僞僀儈儞僌(堷悢偺tick)憡懳偱張棟偟偰傞
				// timer娭悢偺師夞張棟僞僀儈儞僌傪抶傜偣傞
				timer_data[i].func(i,tick,timer_data[i].id,timer_data[i].data);
			} else {
				timer_data[i].func(i,timer_data[i].tick,timer_data[i].id,timer_data[i].data);
			}
		}
		if (timer_data[i].type&TIMER_REMOVE_HEAP) {
			switch(timer_data[i].type & ~TIMER_REMOVE_HEAP) {
			case TIMER_ONCE_AUTODEL:
				timer_data[i].type = 0;
				if (free_timer_list_pos >= free_timer_list_max) {
					free_timer_list_max += 256;
					free_timer_list = realloc(free_timer_list,
						free_timer_list_max * sizeof(free_timer_list[0]));
					if (free_timer_list == NULL) {
						printf("out of memory : do_timer\n");
						exit(1);
					}
					memset(free_timer_list + (free_timer_list_max - 256), 0,
						256 * sizeof(free_timer_list[0]));
				}
				free_timer_list[free_timer_list_pos++] = i;
				break;
			case TIMER_INTERVAL:
				if (DIFF_TICK(timer_data[i].tick , tick) < -1000) {
					timer_data[i].tick = tick + timer_data[i].interval;
				} else {
					timer_data[i].tick += timer_data[i].interval;
				}
				timer_data[i].type &= ~TIMER_REMOVE_HEAP;
				push_timer_heap(i);
				break;
			}
		}
	}

	if (nextmin<10)
		nextmin = 10;
	return nextmin;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久夜| 久久久久国产精品厨房| 日韩欧美一级片| 国产精品久久网站| 蜜臀av一级做a爰片久久| 99久久99久久久精品齐齐| 日韩欧美中文一区| 亚洲网友自拍偷拍| 色综合久久久久久久久| 国产亚洲午夜高清国产拍精品 | 麻豆91在线观看| 在线免费观看日本欧美| 国产色产综合色产在线视频| 蜜桃视频第一区免费观看| 欧美亚洲精品一区| 亚洲欧美另类久久久精品2019| 久久狠狠亚洲综合| 欧美一区二区私人影院日本| 一区二区日韩av| a4yy欧美一区二区三区| 国产精品人成在线观看免费| 国产乱码精品一区二区三区忘忧草| 91精品国产综合久久婷婷香蕉| 亚洲综合在线五月| 色婷婷av一区二区三区软件| 中文字幕一区二区在线观看 | 欧美韩日一区二区三区| 精品一区二区三区香蕉蜜桃 | 欧美军同video69gay| 一区二区成人在线| 在线一区二区观看| 亚洲激情在线播放| 91精彩视频在线观看| 亚洲免费色视频| 91成人国产精品| 一个色妞综合视频在线观看| 色94色欧美sute亚洲线路二 | 中文字幕中文字幕在线一区 | 亚洲欧美日韩国产手机在线| 91在线视频播放地址| 亚洲久草在线视频| 精品视频色一区| 日韩av中文字幕一区二区三区| 制服丝袜中文字幕亚洲| 看电视剧不卡顿的网站| 欧美成人乱码一区二区三区| 国产精品一区二区在线看| 欧美激情一区二区在线| eeuss影院一区二区三区| 亚洲美女在线一区| 欧美日韩国产在线播放网站| 久久精品国产一区二区| 久久久亚洲高清| 99re视频这里只有精品| 亚洲国产一区二区视频| 日韩精品一区二区三区四区| 成人在线视频一区| 亚洲国产综合色| 精品国产91乱码一区二区三区 | 欧美日韩精品欧美日韩精品| 老汉av免费一区二区三区| 亚洲国产精品av| 欧美日韩国产一二三| 国产乱码字幕精品高清av| 亚洲综合一二区| 精品日韩欧美一区二区| 色婷婷av一区二区三区之一色屋| 日本亚洲最大的色成网站www| 久久久久国产成人精品亚洲午夜| 色哟哟国产精品| 国产永久精品大片wwwapp| 亚洲精品国产第一综合99久久| 88在线观看91蜜桃国自产| 成人综合婷婷国产精品久久蜜臀| 亚洲成人黄色影院| 中文在线一区二区| 欧美成人伊人久久综合网| a亚洲天堂av| 黄页网站大全一区二区| 尤物视频一区二区| 久久嫩草精品久久久精品一| 欧美日本韩国一区| 99久久99精品久久久久久| 国精品**一区二区三区在线蜜桃| 亚洲激情在线激情| 国产精品黄色在线观看| 精品人伦一区二区色婷婷| 欧美日韩国产在线观看| 色综合久久天天综合网| 国产精品456露脸| 蜜桃精品视频在线观看| 午夜av区久久| 亚洲国产色一区| 亚洲色图视频免费播放| 欧美国产一区二区在线观看| 欧美刺激午夜性久久久久久久| 欧美在线观看视频一区二区三区| 成人综合在线视频| 国产一区二区美女| 久久99久久99小草精品免视看| 亚洲一区二区三区在线播放| 中文字幕中文字幕在线一区| 久久女同精品一区二区| 精品久久一区二区| 日韩欧美中文字幕精品| 日韩视频123| 欧美一区二区精美| 56国语精品自产拍在线观看| 欧美自拍偷拍一区| 在线观看不卡视频| 91福利资源站| 欧美日韩在线播| 欧美日韩一本到| 欧美三级三级三级| 欧美日韩国产一区| 欧美一区二区三区啪啪| 日韩一级二级三级| 久久综合九色综合97_久久久 | 欧美在线视频日韩| 在线观看日韩精品| 欧美性猛交xxxx黑人交| 欧美视频精品在线| 91精品国产一区二区| 日韩欧美久久一区| 欧美精品一区二区三区久久久| 久久亚洲一区二区三区四区| 久久久99精品免费观看不卡| 国产精品视频在线看| 亚洲男人电影天堂| 丝瓜av网站精品一区二区| 麻豆国产欧美一区二区三区| 国产美女精品在线| 91小视频在线免费看| 色天使色偷偷av一区二区| 欧美日韩国产高清一区二区三区 | 成人午夜精品在线| 91网站最新网址| 欧美日本一道本| 欧美不卡在线视频| 亚洲视频一二区| 午夜精品国产更新| 国产在线一区二区综合免费视频| 成人网在线免费视频| 91国产精品成人| 久久女同互慰一区二区三区| 亚洲精品亚洲人成人网| 免费在线观看一区| 99久久精品国产毛片| 欧美精选午夜久久久乱码6080| 久久久久国产一区二区三区四区| 亚洲精品欧美激情| 蜜臀av一级做a爰片久久| a级精品国产片在线观看| 欧美老女人在线| 国产精品三级av| 久久99国产精品尤物| 91丨porny丨中文| 欧美电影免费观看完整版| 中文字幕日韩精品一区| 蜜臀av性久久久久av蜜臀妖精| 99久久久精品免费观看国产蜜| 日韩视频免费观看高清完整版在线观看| 中文字幕制服丝袜成人av| 蜜臀av性久久久久蜜臀aⅴ| 91视频观看免费| 久久午夜电影网| 五月天亚洲婷婷| 一本色道**综合亚洲精品蜜桃冫| 日韩色在线观看| 午夜欧美在线一二页| 99久久精品国产导航| 久久久久88色偷偷免费| 麻豆极品一区二区三区| 欧美人动与zoxxxx乱| 中文字幕中文乱码欧美一区二区| 国模冰冰炮一区二区| 日韩一区二区三区电影在线观看| 亚洲精品一二三| 99精品国产热久久91蜜凸| 久久精品人人做人人综合| 天堂一区二区在线| 欧美怡红院视频| 亚洲欧美综合网| 成人黄色一级视频| 欧美激情综合五月色丁香小说| 激情综合色播五月| 欧美一级理论片| 日韩成人dvd| 欧美一卡二卡在线观看| 婷婷综合另类小说色区| 欧美日韩的一区二区| 亚洲一区在线电影| 色婷婷精品大在线视频| 樱桃国产成人精品视频| 99久久精品国产毛片| 国产精品国产馆在线真实露脸 | 国产成人欧美日韩在线电影| 欧美不卡视频一区| 国产乱人伦偷精品视频不卡| 国产视频亚洲色图|