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

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

?? sched.c

?? U-boot源碼 ARM7啟動代碼
?? C
字號:
/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#include <exports.h>/* * Author: Arun Dharankar <ADharankar@ATTBI.Com> * * A very simple thread/schedular model: *   - only one master thread, and no parent child relation maintained *   - parent thread cannot be stopped or deleted *   - no permissions or credentials *   - no elaborate safety checks *   - cooperative multi threading *   - Simple round-robin scheduleing with no priorities *   - no metering/statistics collection * * Basic idea of implementing this is to allow more than one tests to * execute "simultaneously". * * This may be modified such thread_yield may be called in syscalls, and * timer interrupts. */#define MAX_THREADS 8#define CTX_SIZE 512#define STK_SIZE 8*1024#define STATE_EMPTY 0#define STATE_RUNNABLE 1#define STATE_STOPPED 2#define STATE_TERMINATED 2#define MASTER_THREAD 0#define RC_FAILURE	(-1)#define	RC_SUCCESS	(0)typedef	vu_char *jmp_ctx;unsigned long setctxsp (vu_char *sp);int ppc_setjmp(jmp_ctx env);void ppc_longjmp(jmp_ctx env, int val);#define setjmp	ppc_setjmp#define longjmp	ppc_longjmpstruct lthread {	int state;	int retval;	char stack[STK_SIZE];	uchar context[CTX_SIZE];	int (*func) (void *);	void *arg;};static volatile struct lthread lthreads[MAX_THREADS];static volatile int current_tid = MASTER_THREAD;static uchar dbg = 0;#define PDEBUG(fmt, args...)	 {					\	if(dbg != 0) {							\		printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);\		printf(fmt, ##args);				\		printf("\n");					\	}								\}static int testthread (void *);static void sched_init (void);static int thread_create (int (*func) (void *), void *arg);static int thread_start (int id);static void thread_yield (void);static int thread_delete (int id);static int thread_join (int *ret);#if 0							/* not used yet */static int thread_stop (int id);#endif							/* not used yet *//* An example of schedular test */#define NUMTHREADS 7int sched (int ac, char *av[]){	int i, j;	int tid[NUMTHREADS];	int names[NUMTHREADS];	app_startup(av);	sched_init ();	for (i = 0; i < NUMTHREADS; i++) {		names[i] = i;		j = thread_create (testthread, (void *) &names[i]);		if (j == RC_FAILURE)			printf ("schedtest: Failed to create thread %d\n", i);		if (j > 0) {			printf ("schedtest: Created thread with id %d, name %d\n",						j, i);			tid[i] = j;		}	}	printf ("schedtest: Threads created\n");	printf ("sched_test: function=0x%08x\n", (unsigned)testthread);	for (i = 0; i < NUMTHREADS; i++) {		printf ("schedtest: Setting thread %d runnable\n", tid[i]);		thread_start (tid[i]);		thread_yield ();	}	printf ("schedtest: Started %d threads\n", NUMTHREADS);	while (1) {		printf ("schedtest: Waiting for threads to complete\n");		if (tstc () && getc () == 0x3) {			printf ("schedtest: Aborting threads...\n");			for (i = 0; i < NUMTHREADS; i++) {				printf ("schedtest: Deleting thread %d\n", tid[i]);				thread_delete (tid[i]);			}			return RC_SUCCESS;		}		j = -1;		i = thread_join (&j);		if (i == RC_FAILURE) {			printf ("schedtest: No threads pending, "						"exiting schedular test\n");			return RC_SUCCESS;		}		printf ("schedtest: thread is %d returned %d\n", i, j);		thread_yield ();	}	return RC_SUCCESS;}static int testthread (void *name){	int i;	printf ("testthread: Begin executing thread, myname %d, &i=0x%08x\n",		*(int *) name, (unsigned)&i);	printf ("Thread %02d, i=%d\n", *(int *) name, i);	for (i = 0; i < 0xffff * (*(int *) name + 1); i++) {		if (tstc () && getc () == 0x3) {			printf ("testthread: myname %d terminating.\n",						*(int *) name);			return *(int *) name + 1;		}		if (i % 100 == 0)			thread_yield ();	}	printf ("testthread: returning %d, i=0x%x\n",				*(int *) name + 1, i);	return *(int *) name + 1;}static void sched_init (void){	int i;	for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++)		lthreads[i].state = STATE_EMPTY;	current_tid = MASTER_THREAD;	lthreads[current_tid].state = STATE_RUNNABLE;	PDEBUG ("sched_init: master context = 0x%08x",		(unsigned)lthreads[current_tid].context);	return;}static void thread_yield (void){	static int i;	PDEBUG ("thread_yield: current tid=%d", current_tid);#define SWITCH(new) 							\	if(lthreads[new].state == STATE_RUNNABLE) {			\		PDEBUG("thread_yield: %d match, ctx=0x%08x",		\			new,						\			(unsigned)lthreads[current_tid].context);	\		if(setjmp(lthreads[current_tid].context) == 0) {	\			current_tid = new;				\			PDEBUG("thread_yield: tid %d returns 0",	\				new); 					\			longjmp(lthreads[new].context, 1);		\		} else {						\			PDEBUG("thread_yield: tid %d returns 1",	\				new); 					\			return;						\		}							\	}	for (i = current_tid + 1; i < MAX_THREADS; i++) {		SWITCH (i);	}	if (current_tid != 0) {		for (i = 0; i <= current_tid; i++) {			SWITCH (i);		}	}	PDEBUG ("thread_yield: returning from thread_yield");	return;}static int thread_create (int (*func) (void *), void *arg){	int i;	for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {		if (lthreads[i].state == STATE_EMPTY) {			lthreads[i].state = STATE_STOPPED;			lthreads[i].func = func;			lthreads[i].arg = arg;			PDEBUG ("thread_create: returns new tid %d", i);			return i;		}	}	PDEBUG ("thread_create: returns failure");	return RC_FAILURE;}static int thread_delete (int id){	if (id <= MASTER_THREAD || id > MAX_THREADS)		return RC_FAILURE;	if (current_tid == id)		return RC_FAILURE;	lthreads[id].state = STATE_EMPTY;	return RC_SUCCESS;}static void thread_launcher (void){	PDEBUG ("thread_launcher: invoking func=0x%08x",		   (unsigned)lthreads[current_tid].func);	lthreads[current_tid].retval =			lthreads[current_tid].func (lthreads[current_tid].arg);	PDEBUG ("thread_launcher: tid %d terminated", current_tid);	lthreads[current_tid].state = STATE_TERMINATED;	thread_yield ();	printf ("thread_launcher: should NEVER get here!\n");	return;}static int thread_start (int id){	PDEBUG ("thread_start: id=%d", id);	if (id <= MASTER_THREAD || id > MAX_THREADS) {		return RC_FAILURE;	}	if (lthreads[id].state != STATE_STOPPED)		return RC_FAILURE;	if (setjmp (lthreads[current_tid].context) == 0) {		lthreads[id].state = STATE_RUNNABLE;		current_tid = id;		PDEBUG ("thread_start: to be stack=0%08x",			(unsigned)lthreads[id].stack);		setctxsp ((vu_char *)&lthreads[id].stack[STK_SIZE]);		thread_launcher ();	}	PDEBUG ("thread_start: Thread id=%d started, parent returns", id);	return RC_SUCCESS;}#if 0	/* not used so far */static int thread_stop (int id){	if (id <= MASTER_THREAD || id >= MAX_THREADS)		return RC_FAILURE;	if (current_tid == id)		return RC_FAILURE;	lthreads[id].state = STATE_STOPPED;	return RC_SUCCESS;}#endif	/* not used so far */static int thread_join (int *ret){	int i, j = 0;	PDEBUG ("thread_join: *ret = %d", *ret);	if (!(*ret == -1 || *ret > MASTER_THREAD || *ret < MAX_THREADS)) {		PDEBUG ("thread_join: invalid tid %d", *ret);		return RC_FAILURE;	}	if (*ret == -1) {		PDEBUG ("Checking for tid = -1");		while (1) {			/* PDEBUG("thread_join: start while-loopn"); */			j = 0;			for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {				if (lthreads[i].state == STATE_TERMINATED) {					*ret = lthreads[i].retval;					lthreads[i].state = STATE_EMPTY;					/* PDEBUG("thread_join: returning retval %d of tid %d",					   ret, i); */					return RC_SUCCESS;				}				if (lthreads[i].state != STATE_EMPTY) {					PDEBUG ("thread_join: %d used slots tid %d state=%d",						   j, i, lthreads[i].state);					j++;				}			}			if (j == 0) {				PDEBUG ("thread_join: all slots empty!");				return RC_FAILURE;			}			/*  PDEBUG("thread_join: yielding"); */			thread_yield ();			/*  PDEBUG("thread_join: back from yield"); */		}	}	if (lthreads[*ret].state == STATE_TERMINATED) {		i = *ret;		*ret = lthreads[*ret].retval;		lthreads[*ret].state = STATE_EMPTY;		PDEBUG ("thread_join: returing %d for tid %d", *ret, i);		return RC_SUCCESS;	}	PDEBUG ("thread_join: thread %d is not terminated!", *ret);	return RC_FAILURE;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本午夜精品一区二区三区电影| 欧美自拍偷拍午夜视频| 99re66热这里只有精品3直播 | 亚洲午夜日本在线观看| 另类小说图片综合网| 91视频xxxx| 日本一区二区免费在线观看视频| 亚洲一区二区在线视频| 粉嫩久久99精品久久久久久夜| 欧美久久一区二区| 中文字幕中文字幕在线一区| 麻豆精品新av中文字幕| 色哟哟国产精品免费观看| 精品国产乱码久久久久久影片| 亚洲一二三四在线观看| 成人激情综合网站| 久久伊人中文字幕| 日韩av成人高清| 欧美丝袜丝交足nylons图片| 国产欧美日韩视频在线观看| 精品一区二区三区视频| 欧美日韩午夜精品| 一区二区三区欧美亚洲| 成人高清av在线| 国产日韩影视精品| 国产成人一级电影| 久久蜜桃av一区二区天堂| 日韩av一区二区三区| 欧美美女黄视频| 亚洲一卡二卡三卡四卡无卡久久 | 久久亚洲一区二区三区四区| 男人的天堂亚洲一区| 欧美挠脚心视频网站| 一区二区三区.www| 91精品办公室少妇高潮对白| 亚洲色图.com| 色综合久久九月婷婷色综合| 亚洲欧美一区二区三区极速播放| 成人黄色网址在线观看| 欧美国产日产图区| 成人精品免费看| 中文字幕亚洲在| 91一区在线观看| 一区二区三区在线视频观看58 | 亚洲最大成人综合| 色噜噜狠狠色综合中国| 一级精品视频在线观看宜春院| 色综合天天综合在线视频| 亚洲女子a中天字幕| 在线精品视频免费播放| 亚洲一区二区三区小说| 欧美一区二区三区电影| 美女免费视频一区| 久久久久久夜精品精品免费| 国产aⅴ精品一区二区三区色成熟| 欧美激情一区二区三区四区| 97se亚洲国产综合自在线| 有坂深雪av一区二区精品| 欧美日韩另类一区| 激情欧美一区二区三区在线观看| 欧美国产日本视频| 欧美午夜精品久久久| 七七婷婷婷婷精品国产| 欧美激情综合五月色丁香小说| 91影院在线免费观看| 日韩黄色免费网站| 中文字幕av免费专区久久| 在线中文字幕不卡| 久久成人免费日本黄色| 国产精品久久久久永久免费观看| 欧美视频一区二区在线观看| 久久av资源网| 亚洲六月丁香色婷婷综合久久| 日韩一区二区免费高清| 成人天堂资源www在线| 午夜视黄欧洲亚洲| 国产人久久人人人人爽| 欧美日免费三级在线| 国产专区综合网| 一区二区三区不卡视频 | 自拍偷拍国产精品| 日韩亚洲电影在线| 色一情一乱一乱一91av| 黑人巨大精品欧美一区| 亚洲一区二区三区不卡国产欧美| 久久精品亚洲精品国产欧美kt∨ | 亚洲一区视频在线观看视频| 精品裸体舞一区二区三区| 色婷婷精品大视频在线蜜桃视频| 精一区二区三区| 亚洲在线观看免费| 国产精品国产成人国产三级| 亚洲大片免费看| 久久精品亚洲乱码伦伦中文 | 欧美电影精品一区二区| 在线观看亚洲一区| 99热这里都是精品| 国产精品资源网| 蜜臀久久99精品久久久久久9 | 日本不卡1234视频| 亚洲一卡二卡三卡四卡五卡| 国产精品护士白丝一区av| 久久久久99精品国产片| 欧美电视剧在线看免费| 欧美日韩另类一区| 欧洲中文字幕精品| 日本韩国欧美一区二区三区| 国产91色综合久久免费分享| 国产一区二区三区日韩| 久久国产精品99久久久久久老狼| 午夜天堂影视香蕉久久| 亚洲国产精品欧美一二99| 玉米视频成人免费看| 亚洲激情综合网| 亚洲情趣在线观看| 亚洲精品综合在线| 亚洲精选一二三| 亚洲综合自拍偷拍| 亚洲成在人线在线播放| 午夜在线成人av| 日本少妇一区二区| 久久国产人妖系列| 精品一区二区三区久久| 国产在线精品国自产拍免费| 狠狠色丁香婷婷综合| 国产成人av影院| 99免费精品视频| 色婷婷综合激情| 欧洲精品在线观看| 欧美日韩国产影片| 欧美一二三区在线观看| 久久久久久久综合日本| 欧美国产视频在线| 亚洲美女在线国产| 丝袜亚洲另类丝袜在线| 九色综合国产一区二区三区| 国产成人在线网站| 91色porny蝌蚪| 欧美精品久久天天躁| 日韩一级视频免费观看在线| 精品国产髙清在线看国产毛片| 久久久亚洲欧洲日产国码αv| 国产精品久久久久四虎| 亚洲制服丝袜av| 久久99精品国产麻豆不卡| 丰满亚洲少妇av| 色综合久久久久久久久久久| 欧美一区二区三区免费| 国产视频一区在线观看| 亚洲综合色在线| 久久精品免费观看| 成人av资源网站| 69堂成人精品免费视频| 国产亚洲综合色| 亚洲mv大片欧洲mv大片精品| 678五月天丁香亚洲综合网| 精品国产3级a| 亚洲无人区一区| 国产中文一区二区三区| 在线亚洲一区二区| 精品国偷自产国产一区| 亚洲激情网站免费观看| 青青草精品视频| 91猫先生在线| 久久久亚洲精品石原莉奈| 亚洲国产婷婷综合在线精品| 国产精品12区| 欧美一区二区免费观在线| 国产精品视频九色porn| 天堂蜜桃一区二区三区| 成人av在线网| 欧美白人最猛性xxxxx69交| 一区二区三区中文在线| 成人永久aaa| 欧美不卡一区二区| 午夜精品一区在线观看| 91丨porny丨在线| 国产女同互慰高潮91漫画| 日本午夜精品一区二区三区电影 | 亚洲国产成人私人影院tom| 午夜久久久久久久久久一区二区| 成人精品免费网站| 欧美精品一区二区三区视频 | 91精品蜜臀在线一区尤物| 亚洲欧洲综合另类| 成人黄页在线观看| 欧美国产日韩一二三区| 精品一区二区综合| 日韩亚洲国产中文字幕欧美| 亚洲二区在线观看| 欧美亚洲日本一区| 亚洲免费资源在线播放| 99久久精品国产导航| 欧美—级在线免费片| 国产激情一区二区三区桃花岛亚洲| 日韩一区二区免费在线电影| 日韩精品电影一区亚洲| 欧美日韩国产美| 亚洲成a人片在线观看中文| 91污在线观看|