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

📄 primary_thread.c

📁 toppers操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			{                    //これまで瓢かしていたタスクの充哈みマスクレベルを锣闰				if(isTaskThreadRunning(runtsk))					vget_ims(&runtsk->tskctxb.InterruptLevel);                ResumeThread(CurrentRunningThreadHandle);   //充哈みスレッド弹瓢			}            else {                    // タスクへと提る                task_dispatcher(reqflg);                reqflg = 0;            }			break;		}		/*		 *≈瓷妄スレッドの涪嘎でもって簇眶を悸乖してください∽メッセ〖ジ		 *  lParam : パラメ〖タを呈羌する菇陇挛へのポインタ		 *    パラメ〖タ菇陇挛柒条		 *      func  : 悸乖したい簇眶		 *      param : パラメ〖タとして畔す部でもアリ("void *")な猛		 *		 * 庙) タスクでウィンドウとかを侯ると、タスク撬逮でウィンドウが久えてしまうよ		 */	case HALMSG_EXECUTEPROCEDURE:		{			void ** work = (void **)lParam;			((void (*)(void *))(*work))(*(work+1));			break;		}		/*		 *≈呵稿の呵稿にこの借妄を瓢かしてください(onExitハンドラ)∽メッセ〖ジ		 * lParam : 簇眶悸乖メッセ〖ジといっしょ ( func,paramへのポインタ )		 */	case HALMSG_ADDDESTRUCTIONPROCEDURE:		{			struct tagDestructionProcedureQueue * scope;			void ** work = (void **)lParam;			scope = DestructionProcedureQueue;			if((DestructionProcedureQueue = GlobalAlloc(GMEM_FIXED, sizeof(struct tagDestructionProcedureQueue))) != NULL)			{				DestructionProcedureQueue->DestructionProcedure = *(work);				DestructionProcedureQueue->Parameter = *(work+1);				DestructionProcedureQueue->Next = scope;			}else				FatalAssertion(TRUE, "GlobalAlloc could not acquire a memory block at " __FILE__);			break;		}		/*		 *≈プログラムを贿めてください∽メッセ〖ジ		 */	case HALMSG_QUITREQUEST:		{			struct tagDestructionProcedureQueue * destqueue;			void * destarea;			dis_int(0);		// 充哈み减烧もこのスレッドがやるので、侍に敦贿しなくても络炬勺//			WorkerThreadHandle = CreateThread(NULL, 0, ForceShutdownHandler, 0, NULL, NULL);			hw_timer_terminate();			if(CurrentRunningThreadHandle != NULL)				wait_for_thread_suspension_completion(CurrentRunningThreadHandle);			destqueue = DestructionProcedureQueue;			while(destqueue != NULL)			{				(*destqueue->DestructionProcedure)(destqueue->Parameter);				destarea = destqueue;				destqueue = destqueue->Next;				GlobalFree((HGLOBAL)destarea);			}			DestroyWindow(PrimaryDialogHandle);			break;		}	default:		return FALSE;	}	return TRUE;}/* * カ〖ネルシミュレ〖タの面乘となるスレッドのメッセ〖ジハンドラ */LRESULT CALLBACK PrimaryDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam){	switch(Msg)	{		/* タスクトレイアイコンで宝クリック */	case HALMSG_MESSAGE+1:		if(lParam == WM_RBUTTONUP)			kernel_exit();		break;		/* カ〖ネルメッセ〖ジ */	case HALMSG_MESSAGE:		return HALMessageHandler(wParam,lParam);		/* デバッグ脱ダイアログ惧のアイテムのメッセ〖ジ */	case WM_COMMAND:		return PrimaryDialogCommandHandler(wParam,lParam);			/* ダイアログ栏喇(メッセ〖ジハンドリング脱) */	case WM_INITDIALOG:		{			DWORD ThreadID;			NOTIFYICONDATA nid;			PrimaryDialogHandle = hDlg;	//办箕弄				/* タスクトレイにアイコンを判峡 */			nid.cbSize = sizeof(NOTIFYICONDATA);			nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;			nid.uID = ID_NOTIFYICON;			lstrcpy(nid.szTip,"TOPPERS/JSP");			nid.hWnd = hDlg;			nid.uCallbackMessage = HALMSG_MESSAGE+1;			nid.hIcon = LoadIcon(ProcessInstance,MAKEINTRESOURCE(IDI_ERTLICON));			Shell_NotifyIcon(NIM_ADD,&nid);				/* カ〖ネルを侍スレッドで弹瓢する */			PrimaryThreadHandle = (HANDLE)hDlg;			CurrentRunningThreadHandle = CreateThread(NULL,0,KernelStarter,NULL,CREATE_SUSPENDED,&ThreadID);            ResumeThread(CurrentRunningThreadHandle);			FatalAssertion(CurrentRunningThreadHandle != NULL, "CreateThread at " __FILE__);			break;		}		/* ダイアログを誓じようとしています */	case WM_CLOSE:			HALQuitRequest();			break;		/* ダイアログが撬逮されました */	case WM_DESTROY:		{				/* タスクトレイ幌琐 */			NOTIFYICONDATA nid;			nid.cbSize = sizeof(NOTIFYICONDATA);			nid.uFlags = 0;			nid.hWnd = hDlg;			nid.uID = ID_NOTIFYICON;			Shell_NotifyIcon(NIM_DELETE,&nid);			PrimaryThreadHandle = NULL;			PostQuitMessage(0);			break;		}		/* タイマ借妄 */	case WM_TIMER:			/* 惧疤16ビットが链婶1 -> カ〖ネルのタイマ */		if((wParam & 0xffff0000) == 0xffff0000)		{				/* 布疤16ビットは充哈み戎规 */			return HALMessageHandler(HALMSG_INTERRUPT,(wParam & 0x0000ffff));		}	default:		return FALSE;	}	return TRUE;}    /* マルチプロセッサでも奥年するよう、わざと帽办のプロセッサのみで借妄させるようにする */void setAffinityMask(void){    DWORD process;    DWORD system;    DWORD newaffinitymask;    if(GetProcessAffinityMask(GetCurrentProcess(), &process, &system) != 0) {        newaffinitymask = 1;        while((process & newaffinitymask) == 0)            newaffinitymask <<= 1;        SetProcessAffinityMask(GetCurrentProcess(), newaffinitymask);    }    kprintf(("setAffinityMask : 0x%08x\n", newaffinitymask));}static void initialize(HANDLE hInstance){	ProcessInstance            = hInstance;	DestructionProcedureQueue  = NULL;	PrimaryThreadHandle        = NULL;	CurrentRunningThreadHandle = NULL;#ifdef KERNEL_DEBUG_MODE    AllocConsole();#endif        /* プロセッサを充り烧ける */    setAffinityMask();}static void finalRelease(void){	int i;    kprintf(("finalRelease()\n"));	/* 撬逮されてないタスクの稿幌琐 */	for(i=0;i<_kernel_tmax_tskid;i++)	{		if(_kernel_tcb_table[i].tskctxb.ThreadHandle != NULL)		{			if(TerminateThread(_kernel_tcb_table[i].tskctxb.ThreadHandle,0) != 0)    			CloseHandle(_kernel_tcb_table[i].tskctxb.ThreadHandle);			_kernel_tcb_table[i].tskctxb.ThreadHandle = NULL;		}	}    /* COM奶慨をしているスレッドを动扩匿贿 */	if(WorkerThreadHandle  != NULL)	{		TerminateThread(WorkerThreadHandle ,0);		CloseHandle(WorkerThreadHandle);        WorkerThreadHandle = NULL;	}#ifdef KERNEL_DEBUG_MODE    MessageBox(NULL, "The kernel will be shut down.", "TOPPERS/JSP", MB_OK);    FreeConsole();#endif}/* * メイン簇眶 */int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShow){	MSG msg;	HANDLE hDlg;    TlsAlloc();    initialize(hInstance);	TlsSetValue(TLS_LOGMASK, 0);    hDlg = CreateDialog(hInstance,"PrimaryDialog",NULL,PrimaryDialogProc);	if(hDlg != NULL)	{				ShowWindow(PrimaryDialogHandle,SW_HIDE);		OnDebug(ShowWindow(PrimaryDialogHandle,SW_SHOW));		while(GetMessage(&msg,NULL,0,0) != 0)		{			if(msg.message == WM_QUIT)				msg.message = 0;			TranslateMessage(&msg);			DispatchMessage(&msg);		}	}	else		FatalAssertion(hDlg != NULL, "CreateDialog at " __FILE__ "("  ")");    finalRelease();    ExitProcess(msg.wParam);	return msg.wParam;}

⌨️ 快捷键说明

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