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

📄 com_support.cpp

📁 JAPAN RTOS TOPPERS/JSP kernel 1.4 PreRelease simulation environment JSP kernel Windows simulation
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		::CoInitialize(NULL);

			// 僨僶僀僗儅僱乕僕儍偲愙懕
		manager = 0;
		if(FAILED(::CoCreateInstance(CLSID_Kernel, NULL, CLSCTX_ALL, IID_IKernel, (void **)&manager)))
			goto _WorkerThreadProc_Cleanup;

		cp = 0;
		sink = new IKernelEvents;		
		if(!Advise(manager, IID_IKernelEvents, sink, &cookie,&cp))
		{
			delete sink;
			goto _WorkerThreadProc_Cleanup;
		}

			/* 儊僀儞儖乕僠儞 */
		manager->IsValid(&Success);
		if(Success != 0)
		{
            MSG msg;
			DWORD work;
            bool  loop_flag = true;
			
			do {
                    /*
                     * 奜晹偐傜COM傪偨偨偔偲儊僢僙乕僕偲偟偰旘傫偱偔傞偨傔丄WaitForSingleObject偱僙儅僼僅傪懸偮偲奜晹偐傜偺梫媮傪幚峴偱偒側偔側傞丅
                     * 偦偺偨傔丄MsgWaitFor...傪梡偄丄儊僢僙乕僕偑旘傫偱偒偨応崌偼偙傟偵懳張偱偒傞傛偆偵偡傞丅
                     */

					//梫媮懸偪
                work = ::MsgWaitForMultipleObjects(1, &request_semaphore, FALSE, INFINITE, QS_ALLPOSTMESSAGE);

                switch(work) {

                    //張棟梫媮偺幚峴
                case WAIT_OBJECT_0:
                        loop_flag = PerformRequest(manager);
                        break;

                    //奜晹偐傜偺梫媮 (妱崬傒側偳)
                case WAIT_OBJECT_0 + 1:
                        GetMessage(&msg, 0, 0, 0);
                        DispatchMessage(&msg);
                        break;
                
                default:
                    loop_flag = false;
                }

			} while(loop_flag);
		}

			/*
			 * Finalize
			 */

		if(cp != 0)
		{
			cp->Unadvise(cookie);
			cp->Release();
			cp = 0;
			sink = 0;
		}

	_WorkerThreadProc_Cleanup:

        if(manager != 0)
			manager->Release();

		CloseHandle(worker_thread_handle);
		worker_thread_handle = INVALID_HANDLE_VALUE;
        manager = 0l;
		::CoUninitialize();

		/* 僉儏乕傪嬻偵偡傞 (懸偪夝彍) */

		Request * request;
		while((request = Request::GetRequest()) != 0)
			request->Finalize(false);

		return 0;
	}
}

//==============================================================================

/****************************************************
 *                                                  *
 * TOPPERS/JSP - Windows僔儈儏儗乕僔儑儞娐嫬        *
 *   COM傪梡偄偨僨僶僀僗僄儈儏儗乕僔儑儞婡擻        *
 *                                                  *
 ****************************************************/

#ifdef DEVICE_ENABLE

extern "C"
int _cdecl DeviceRead(unsigned long address, unsigned long size, void * storage)
{
	if(!IsValid() || storage == NULL)
		return -1;

	return DeviceRequest::Create(Request::DeviceRead, true, size, storage, address)->invoke();
}

extern "C"
int _cdecl DeviceWrite(unsigned long address, unsigned long size, void * storage)
{
	if(!IsValid() || storage == NULL)
		return -1;

	return DeviceRequest::Create(Request::DeviceWrite, true, size, storage, address)->invoke();
}

#endif


/****************************************************
 *                                                  *
 * TOPPERS/JSP - Windows僔儈儏儗乕僔儑儞娐嫬        *
 *   COM傪梡偄偨僇乕僱儖儘僌庢摼婡擻                *
 *                                                  *
 ****************************************************/

#ifdef EVENTLOG_ENABLE

	/* 懡廳儘僌弌椡杊巭梡僙儅僼僅 :  1傪懌偟偨寢壥偑1偱偁偭偨偲偒偩偗丄儘僌傪弌椡偱偒傞 */
static LONG event_write_semaphore = 0;

void event_write(unsigned int logtype, unsigned int valid, UINT bufsz, ... )
{
	EventRequest * event_request;
	DBIFLOG * log;
	va_list   vl;

	if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0)
	{
			// 儕僋僄僗僩椞堟妋曐
		event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + bufsz);
		log     = reinterpret_cast<DBIFLOG *>(event_request->getptr());

			// 僿僢僟惗惉
		log->header.logtype = logtype;
		log->header.logtim  = _kernel_systim_offset + _kernel_current_time;
		log->header.valid   = valid;
		log->header.bufsz   = bufsz;

			// 杮懱偺奿擺
		va_start(vl, bufsz);
		for(unsigned int i=0;i<bufsz/sizeof(int);i++)
			*((int *)&log->body + i) = va_arg(vl, int);

			// 梫媮偺憲晅 (Non-blocking)
		event_request->invoke();
	}
}

extern "C"
void event_write_svc_enter(int fncd, unsigned int params, ... )
{
	EventRequest * event_request;
	DBIFLOG *      log;
	va_list        vl;
	unsigned int   i;

	if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0)
	{
			//椞堟妋曐 : 妋曐偡傞僒僀僘偼僷儔儊乕僞憤悢傛傝堦屄暘懡偄 (屇傃弌偟尦傾僪儗僗傪奿擺)
		event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_SVC) + params * sizeof(VP_INT));	
		log     = reinterpret_cast<DBIFLOG *>(event_request->getptr());

			//僷働僢僩惗惉
		log->header.logtype = LOG_TYPE_SVC;
		log->header.logtim  = _kernel_systim_offset + _kernel_current_time;
		log->header.valid   = 0x7fffffff >> (29 - params);
		log->header.bufsz   = (params+3) * sizeof(int);

		va_start(vl, params);

		log->body.svc.fncno  = fncd;
		log->body.svc.prmcnt = params;

			/* 堦夞儖乕僾偑懡偄偺偼嵟屻偵屇弌尦傾僪儗僗傪愊傫偱偄傞偨傔 */
		for(i=0;i<params+1;i++)
			log->body.svc.prmary[i] = va_arg(vl, VP_INT);

		event_request->invoke();
	}
}

extern "C"
void event_write_svc_leave(int fncd, unsigned int ercd, unsigned int retaddr)
{
	EventRequest * event_request;
	DBIFLOG * log;

	if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0)
	{
			//椞堟妋曐 : 妋曐偡傞僒僀僘偼僷儔儊乕僞憤悢(曉媝抣偺傒側偺偱侾偮)傛傝堦屄暘懡偄 (屇傃弌偟尦傾僪儗僗傪奿擺)
		event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_SVC) + sizeof(VP_INT));
		log     = reinterpret_cast<DBIFLOG *>(event_request->getptr());

			//僿僢僟晹惗惉
		log->header.logtype = LOG_TYPE_SVC|LOG_LEAVE;
		log->header.logtim  = _kernel_systim_offset + _kernel_current_time;
		log->header.valid   = 0x7;
		log->header.bufsz   = 4 * sizeof(int);

			//儃僨傿晹惗惉
		log->body.svc.fncno     = fncd;
		log->body.svc.prmcnt    = 1;
		log->body.svc.prmary[0] = (VP_INT)ercd;
		log->body.svc.prmary[1] = (VP_INT)retaddr;

		event_request->invoke();
	}
}

extern "C" void decode_taskstatus(void * tcb, int * tskid, unsigned int * tskstat, unsigned int * objtype, int * objid);

extern "C" 
void event_write_tskstat(void * tcb)
{
	EventRequest * event_request;
	DBIFLOG * log;

	if(IsValid())	//偙傟偼僇乕僱儖憖嶌側偺偱TLS_LOGMASK傪尒偰偼偄偗側偄
	{
			//椞堟妋曐
		event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_TSKSTAT));
		log     = reinterpret_cast<DBIFLOG *>(event_request->getptr());

		log->header.logtype = LOG_TYPE_TSKSTAT;
		log->header.logtim  = _kernel_systim_offset + _kernel_current_time;
		log->header.valid   = 0xf;
		log->header.bufsz   = 4 * sizeof(int);

		decode_taskstatus(tcb, &log->body.tskstat.tskid, &log->body.tskstat.tskstat, &log->body.tskstat.tskwait, &log->body.tskstat.wobjid);

		event_request->invoke();
	}
}

#endif


static BOOL CALLBACK NotifyDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
{
	switch(Msg)
	{
	case WM_INITDIALOG:
		{
			LONG  count;
			HWND  hCtrl;
			
			hCtrl = ::GetDlgItem(hDlg, IDC_PROGRESS1);
			count = Request::getRequestCount();

			::SetWindowLong(hDlg, GWL_USERDATA, count);
			::SendMessage(hCtrl, PBM_SETRANGE32, 0, count);
			::SendMessage(hCtrl, PBM_SETPOS, count - Request::getRequestCount(), 0);

			::SetTimer(hDlg, 100, 200, NULL);
			break;
		}

	case WM_TIMER:
		if(wParam == 100)
		{
			LONG  count;
			HWND  hCtrl;

			hCtrl = ::GetDlgItem(hDlg, IDC_PROGRESS1);
			count = ::GetWindowLong(hDlg, GWL_USERDATA);

			::SendMessage(hCtrl, PBM_SETPOS, count - Request::getRequestCount(), 0);

			if(Request::getRequestCount() <= 0)
				::PostQuitMessage(0);
		}
		break;
	case WM_CLOSE:
		break;

	default:
		return FALSE;
	}
	return TRUE;
}

extern "C"
void _cdecl InitializeComSupportModule(void)
{
	Request::initialize();
	DeviceRequest::initialize();
	EventRequest::initialize();


	request_semaphore = ::CreateSemaphore(NULL, 0, 65536, NULL);
	FatalAssertion(request_semaphore != INVALID_HANDLE_VALUE, "Object Creation Error : request_semaphore");

	worker_thread_handle = ::CreateThread(NULL, 0, WorkerThreadProcess, NULL, NULL, NULL);
	FatalAssertion(worker_thread_handle != INVALID_HANDLE_VALUE, "Object Creation Error : worker_thread");

	Request * request = Request::Create(Request::Confirmation, true);
	request->invoke();
}

extern "C"
void _cdecl FinalizeComSupportModule(void)
{
	if(IsValid())
	{
		HWND  hDlgitem;
		HWND  NotifyDialog;
		MSG   msg;

			//儘僌偑棴傑傝偡偓傞偲儘僌揻偒偵帪娫偑偐偐傝丄僾儘僌儔儉偑朶憱偟偨傛偆偵尒偊傞偺偱
			//乽儘僌傪揻偄偰傞偐傜懸偰乿偲寈崘傪弌偡丅
		NotifyDialog = ::CreateDialog(ProcessInstance, MAKEINTRESOURCE(QUITNOTICEDIALOG), NULL, NotifyDialogProc);
		hDlgitem     = ::GetDlgItem(NotifyDialog, IDC_NOTIFYMSG);
		::SetWindowText(hDlgitem, "崱 堦惗寽柦僇乕僱儖偺僀儀儞僩儘僌傪弌偟偰偄傞偺偱丄廔傞傑偱彮偟懸偭偰偔偩偝偄");
		::ShowWindow(NotifyDialog, SW_NORMAL);

		Request * request = Request::Create(Request::QuitThread, false);
		request->invoke();

			//廔椆僟僀傾儘僌梡偺儊僢僙乕僕億儞僾

        while(GetMessage(&msg, NULL, 0, 0) != 0) {
        	TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

			//偪傖傫偲僗儗僢僪偑廔椆偡傞傑偱懸婡
		::WaitForSingleObject(worker_thread_handle, INFINITE);
		::CloseHandle(request_semaphore);
        request_semaphore = INVALID_HANDLE_VALUE;

		EventRequest::finalize();
		DeviceRequest::finalize();
		Request::finalize();

		::DestroyWindow(NotifyDialog);
	}
}


#else	// __COM_NOT_REQUIRED__

extern "C"
void _cdecl InitializeComSupportModule(void)
{}

extern "C"
void _cdecl FinalizeComSupportModule(void)
{}

#endif // __COM_NOT_REQUIRED__

⌨️ 快捷键说明

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