⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_timers.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
		t_result(result);	} else		require_threads();}#define	T4_SECONDS	2#define	T4_NANOSECONDS	500000000static voidt4_te(isc_task_t *task, isc_event_t *event) {	isc_result_t	isc_result;	isc_time_t	now;	isc_time_t	base;	isc_time_t	ulim;	isc_time_t	llim;	isc_time_t	expires;	isc_interval_t	interval;	++Tx_eventcnt;	t_info("tick %d\n", Tx_eventcnt);	/*	 * Check expired time.	 */	isc_result = isc_time_now(&now);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_time_now failed %s\n",		       isc_result_totext(isc_result));		++Tx_nprobs;	}	if (isc_result == ISC_R_SUCCESS) {		interval.seconds = Tx_seconds;		interval.nanoseconds = Tx_nanoseconds;		isc_result = isc_time_add(&Tx_lasttime, &interval, &base);		if (isc_result != ISC_R_SUCCESS) {			t_info("isc_time_add failed %s\n",			       isc_result_totext(isc_result));			++Tx_nprobs;		}	}	if (isc_result == ISC_R_SUCCESS) {		interval.seconds = Tx_FUDGE_SECONDS;		interval.nanoseconds = Tx_FUDGE_NANOSECONDS;		isc_result = isc_time_add(&base, &interval, &ulim);		if (isc_result != ISC_R_SUCCESS) {			t_info("isc_time_add failed %s\n",			       isc_result_totext(isc_result));			++Tx_nprobs;		}	}	if (isc_result == ISC_R_SUCCESS) {		isc_result = isc_time_subtract(&base, &interval, &llim);		if (isc_result != ISC_R_SUCCESS) {			t_info("isc_time_subtract failed %s\n",			       isc_result_totext(isc_result));			++Tx_nprobs;		}	}	if (isc_result == ISC_R_SUCCESS) {		if (isc_time_compare(&llim, &now) > 0) {			t_info("timer range error: early by "			       "%lu microseconds\n",			       (unsigned long)isc_time_microdiff(&base, &now));			++Tx_nfails;		} else if (isc_time_compare(&ulim, &now) < 0) {			t_info("timer range error: late by "			       "%lu microseconds\n",			       (unsigned long)isc_time_microdiff(&now, &base));			++Tx_nfails;		}		Tx_lasttime = now;	}	if (Tx_eventcnt < 3) {		if (event->ev_type != ISC_TIMEREVENT_TICK) {			t_info("received event type %d, expected type %d\n",			       event->ev_type, ISC_TIMEREVENT_IDLE);			++Tx_nfails;		}		if (Tx_eventcnt == 2) {			isc_interval_set(&interval, T4_SECONDS,					 T4_NANOSECONDS);			isc_result = isc_time_nowplusinterval(&expires,							      &interval);			if (isc_result == ISC_R_SUCCESS) {				isc_interval_set(&interval, 0, 0);				isc_result =					isc_timer_reset(Tx_timer,							isc_timertype_once,							&expires, &interval,							ISC_FALSE);				if (isc_result != ISC_R_SUCCESS) {					t_info("isc_timer_reset failed %s\n",					       isc_result_totext(isc_result));					++Tx_nfails;				}			} else {				t_info("isc_time_nowplusinterval failed %s\n",				       isc_result_totext(isc_result));				++Tx_nprobs;			}		}	} else {		if (event->ev_type != ISC_TIMEREVENT_LIFE) {			t_info("received event type %d, expected type %d\n",			       event->ev_type, ISC_TIMEREVENT_IDLE);			++Tx_nfails;		}		isc_timer_detach(&Tx_timer);		isc_task_shutdown(task);	}	isc_event_free(&event);}static const char *a4 =	"A call to isc_timer_reset() changes the timer's type, expires and "	"interval values to the given values.";static voidt4(void) {	int		result;	isc_time_t	expires;	isc_interval_t	interval;	t_assert("isc_timer_reset", 4, T_REQUIRED, a4);	if (threaded) {		Tx_nfails = 0;		Tx_nprobs = 0;		Tx_nevents = 3;		Tx_seconds = T4_SECONDS;		Tx_nanoseconds = T4_NANOSECONDS;		isc_interval_set(&interval, T4_SECONDS, T4_NANOSECONDS);		isc_time_settoepoch(&expires);		t_timers_x(isc_timertype_ticker, &expires, &interval, t4_te);		result = T_UNRESOLVED;		if ((Tx_nfails == 0) && (Tx_nprobs == 0))			result = T_PASS;		else if (Tx_nfails)			result = T_FAIL;		t_result(result);	} else		require_threads();}#define	T5_NTICKS	4#define	T5_SECONDS	3static	int		T5_startflag;static	int		T5_shutdownflag;static	int		T5_eventcnt;static	isc_mutex_t	T5_mx;static	isc_condition_t	T5_cv;static	int		T5_nfails;static	int		T5_nprobs;static	isc_timer_t	*T5_tickertimer;static	isc_timer_t	*T5_oncetimer;static	isc_task_t	*T5_task1;static	isc_task_t	*T5_task2;/* * T5_task1 blocks on T5_mx while events accumulate * in it's queue, until signaled by T5_task2. */static voidt5_start_event(isc_task_t *task, isc_event_t *event) {	isc_result_t	isc_result;	UNUSED(task);	t_info("t5_start_event\n");	isc_result = isc_mutex_lock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_lock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	while (! T5_startflag) {		(void) isc_condition_wait(&T5_cv, &T5_mx);	}	isc_result = isc_mutex_unlock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_unlock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	isc_event_free(&event);}static voidt5_tick_event(isc_task_t *task, isc_event_t *event) {	isc_result_t	isc_result;	isc_time_t	expires;	isc_interval_t	interval;	task = task;	++T5_eventcnt;	t_info("t5_tick_event %d\n", T5_eventcnt);	/*	 * On the first tick, purge all remaining tick events	 * and then shut down the task.	 */	if (T5_eventcnt == 1) {		isc_time_settoepoch(&expires);		isc_interval_set(&interval, T5_SECONDS, 0);		isc_result = isc_timer_reset(T5_tickertimer,					     isc_timertype_ticker, &expires,					     &interval, ISC_TRUE);		if (isc_result != ISC_R_SUCCESS) {			t_info("isc_timer_reset failed %s\n",			       isc_result_totext(isc_result));			++T5_nfails;		}		isc_task_shutdown(task);	}	isc_event_free(&event);}static voidt5_once_event(isc_task_t *task, isc_event_t *event) {	isc_result_t	isc_result;	t_info("t5_once_event\n");	/*	 * Allow task1 to start processing events.	 */	isc_result = isc_mutex_lock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_lock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	T5_startflag = 1;	isc_result = isc_condition_broadcast(&T5_cv);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_condition_broadcast failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	isc_result = isc_mutex_unlock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_unlock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	isc_event_free(&event);	isc_task_shutdown(task);}static voidt5_shutdown_event(isc_task_t *task, isc_event_t *event) {	isc_result_t	isc_result;	UNUSED(task);	UNUSED(event);	t_info("t5_shutdown_event\n");	/*	 * Signal shutdown processing complete.	 */	isc_result = isc_mutex_lock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_lock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	T5_shutdownflag = 1;	isc_result = isc_condition_signal(&T5_cv);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_condition_signal failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	isc_result = isc_mutex_unlock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_unlock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	isc_event_free(&event);}static intt_timers5(void) {	char		*p;	int		result;	isc_mem_t	*mctx;	isc_taskmgr_t	*tmgr;	unsigned int	workers;	isc_result_t	isc_result;	isc_timermgr_t	*timermgr;	isc_event_t	*event;	isc_time_t	expires;	isc_interval_t	interval;	T5_startflag = 0;	T5_shutdownflag = 0;	T5_eventcnt = 0;	workers = 2;	p = t_getenv("ISC_TASK_WORKERS");	if (p != NULL)		workers = atoi(p);	mctx = NULL;	isc_result = isc_mem_create(0, 0, &mctx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mem_create failed %s\n",		       isc_result_totext(isc_result));		return(T_UNRESOLVED);	}	isc_result = isc_mutex_init(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_init failed %s\n",		       isc_result_totext(isc_result));		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_result = isc_condition_init(&T5_cv);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_condition_init failed %s\n",		       isc_result_totext(isc_result));		DESTROYLOCK(&T5_mx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	tmgr = NULL;	isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_taskmgr_create failed %s\n",		       isc_result_totext(isc_result));		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	timermgr = NULL;	isc_result = isc_timermgr_create(mctx, &timermgr);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_timermgr_create failed %s\n",		       isc_result_totext(isc_result));		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	T5_task1 = NULL;	isc_result = isc_task_create(tmgr, 0, &T5_task1);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_task_create failed %s\n",		       isc_result_totext(isc_result));		isc_timermgr_destroy(&timermgr);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_result = isc_task_onshutdown(T5_task1, t5_shutdown_event, NULL);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_task_onshutdown failed %s\n",		       isc_result_totext(isc_result));		isc_timermgr_destroy(&timermgr);		isc_task_destroy(&T5_task1);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	T5_task2 = NULL;	isc_result = isc_task_create(tmgr, 0, &T5_task2);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_task_create failed %s\n",		       isc_result_totext(isc_result));		isc_timermgr_destroy(&timermgr);		isc_task_destroy(&T5_task1);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_result = isc_mutex_lock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_lock failed %s\n",		       isc_result_totext(isc_result));		isc_timermgr_destroy(&timermgr);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	event = isc_event_allocate(mctx, (void *)1 , (isc_eventtype_t)1,				   t5_start_event, NULL, sizeof(*event));	isc_task_send(T5_task1, &event);	isc_time_settoepoch(&expires);	isc_interval_set(&interval, T5_SECONDS, 0);	T5_tickertimer = NULL;	isc_result = isc_timer_create(timermgr, isc_timertype_ticker,				      &expires, &interval, T5_task1,				      t5_tick_event, NULL, &T5_tickertimer);	if (isc_result != ISC_R_SUCCESS) {		isc_timermgr_destroy(&timermgr);		(void) isc_condition_signal(&T5_cv);		(void) isc_mutex_unlock(&T5_mx);		isc_task_destroy(&T5_task1);		isc_task_destroy(&T5_task2);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	T5_oncetimer = NULL;	isc_interval_set(&interval, (T5_SECONDS * T5_NTICKS) + 2, 0);	isc_result = isc_time_nowplusinterval(&expires, &interval);	if (isc_result != ISC_R_SUCCESS) {		isc_timer_detach(&T5_tickertimer);		isc_timermgr_destroy(&timermgr);		(void)isc_condition_signal(&T5_cv);		(void)isc_mutex_unlock(&T5_mx);		isc_task_destroy(&T5_task1);		isc_task_destroy(&T5_task2);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_interval_set(&interval, 0, 0);	isc_result = isc_timer_create(timermgr, isc_timertype_once,				      &expires, &interval, T5_task2,				      t5_once_event, NULL, &T5_oncetimer);	if (isc_result != ISC_R_SUCCESS) {		isc_timer_detach(&T5_tickertimer);		isc_timermgr_destroy(&timermgr);		(void) isc_condition_signal(&T5_cv);		(void) isc_mutex_unlock(&T5_mx);		isc_task_destroy(&T5_task1);		isc_task_destroy(&T5_task2);		isc_taskmgr_destroy(&tmgr);		DESTROYLOCK(&T5_mx);		isc_condition_destroy(&T5_cv);		isc_mem_destroy(&mctx);		++T5_nprobs;		return(T_UNRESOLVED);	}	/*	 * Wait for shutdown processing to complete.	 */	while (! T5_shutdownflag) {		isc_result = isc_condition_wait(&T5_cv, &T5_mx);		if (isc_result != ISC_R_SUCCESS) {			t_info("isc_condition_waituntil failed %s\n",			       isc_result_totext(isc_result));			++T5_nprobs;		}	}	isc_result = isc_mutex_unlock(&T5_mx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mutex_unlock failed %s\n",		       isc_result_totext(isc_result));		++T5_nprobs;	}	if (T5_eventcnt != 1) {		t_info("processed %d events\n", T5_eventcnt);		++T5_nfails;	}	isc_timer_detach(&T5_tickertimer);	isc_timer_detach(&T5_oncetimer);	isc_timermgr_destroy(&timermgr);	isc_task_destroy(&T5_task1);	isc_task_destroy(&T5_task2);	isc_taskmgr_destroy(&tmgr);	DESTROYLOCK(&T5_mx);	isc_condition_destroy(&T5_cv);	isc_mem_destroy(&mctx);	result = T_UNRESOLVED;	if ((T5_nfails == 0) && (T5_nprobs == 0))		result = T_PASS;	else if (T5_nfails)		result = T_FAIL;	return (result);}static const char *a5 =	"When 'purge' is TRUE, a call to isc_timer_reset() purges any pending "	"events from 'timer' from the task's event queue.";static voidt5(void) {	t_assert("isc_timer_reset", 5, T_REQUIRED, a5);	if (threaded)		t_result(t_timers5());	else		require_threads();}testspec_t	T_testlist[] = {	{	t1,		"timer_create"		},	{	t2,		"timer_create"		},	{	t3,		"timer_create"		},	{	t4,		"timer_reset"		},	{	t5,		"timer_reset"		},	{	NULL,		NULL			}};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -