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

📄 com_support.cpp

📁 toppers操作系统源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			::CopyMemory(reinterpret_cast<char *>(storage) + offset, data, sz);		}			//瘦积挝拌に滦する粕哈み		inline bool get(void * data, unsigned int sz, unsigned int offset = 0)		{			if(size < sz + offset)				return false;			::CopyMemory(data, reinterpret_cast<char *>(storage) + offset, sz);		}			//瘦积挝拌の扦罢の疤弥に滦するポインタ艰评			//		offset : 黎片からのバイトオフセット		void * getptr(unsigned int offset = 0)		{			if(offset > size || storage == NULL)				return NULL;			return reinterpret_cast<void *>(reinterpret_cast<char *>(storage) + offset);		}			/*			 *   Requestオブジェクトファクトリ			 *     Q: どうしてファクトリが涩妥なのか?			 *     A: メモリ澄瘦よりも黎にCPUをロックする涩妥があるため (拒嘿は惧淡CPUロックする妄统を徊救)			 */					static Request * Create(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0)		{			Request * request;			BOOL      lock;			enter_system_critical_section(&lock);			request = new Request(_type, _block, _size, _storage, _address);			leave_system_critiacl_section(&lock);					return request;		}		static Request * GetRequest(void)		{			Request * result;			::EnterCriticalSection(&cs);			result = top;			if(top != NULL)			{				top = top->next;				if(top == NULL)					tail = NULL;			}			::LeaveCriticalSection(&cs);			::InterlockedDecrement(&RequestCount);			return result;		}		void Finalize(bool succeeded)		{			if(this != 0) {				if(isBlockingRequest())					signal(succeeded ? getSize() : -1);				else				{					BOOL lock;					enter_system_critical_section(&lock);					delete this;					leave_system_critiacl_section(&lock);				}			}		}        virtual void signal(int _result = 0)		{			result = _result;			if(signalobject != NULL)				::PostThreadMessage((DWORD)signalobject, WM_QUIT, 0, 0);		}							/*			 *   糠しい妥滇の券乖			 *     (この簇眶を蝗うスレッド : 瓷妄スレッド, 充哈みスレッド, タスクスレッド)			 */		virtual int invoke(void)		{			int  _result;			BOOL lock;			MSG  msg;			_result = 0;			if(!IsValid())				return -1;			enter_system_critical_section(&lock);			connect();				//妥滇の悸乖略ち			if(blocking)			{				signalobject = (HANDLE)::GetCurrentThreadId();					//糠しい妥滇をだしたことを奶梦				::ReleaseSemaphore(request_semaphore,1,NULL);				leave_system_critiacl_section(&lock);					//WM_QUITメッセ〖ジを蝗って票袋を艰る				while(::GetMessage(&msg, 0, 0, 0) != 0)					::DispatchMessage(&msg);					//このオブジェクトを撬逮するのでバックアップを艰る				_result = result;					//キュ〖からはずす借妄は侯度スレッドがやる					//delete requestは、ノンブロッキングなら侯度スレッド勒扦、ブロッキングならここでやる                enter_system_critical_section(&lock);				delete this;                leave_system_critiacl_section(&lock);			}else			{					//糠しい妥滇をだしたことを奶梦				::ReleaseSemaphore(request_semaphore,1,NULL);				leave_system_critiacl_section(&lock);			}			return _result;		}	};	class EventDumpRequest : public Request	{	protected:		static HANDLE FileHandle;		EventDumpRequest(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0) : Request(_type, _block, _size, _storage, _address) 		{}	public:		static void initialize(void)		{			SYSTEMTIME systim;			DWORD      written;			char       buffer[1024];			char *     top;			char *     work;			::GetLocalTime(&systim);			::wsprintf(buffer, "kernel-log-%04d%02d%02d-%02d%02d%02d.log", systim.wYear, systim.wMonth, systim.wDay, systim.wHour, systim.wMinute, systim.wSecond);			FileHandle = ::CreateFile(buffer, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);            kprintf(("EventDumpRequest : initialize (filename = '%s')\n", buffer));			T_RGLOG_HEADER log;						log.logtype = LOG_TIMESTAMP;			log.logtim  = 0;			log.bufsz   = sizeof(SYSTEMTIME);			log.valid   = 1;			::WriteFile(FileHandle, &log, sizeof(log), &written, NULL);			::WriteFile(FileHandle, &systim, sizeof(SYSTEMTIME), &written, NULL);				/* モジュ〖ル叹を艰り叫す */			::lstrcpyn(buffer, ::GetCommandLine(), 1023);			top = buffer;			buffer[1023] = '\x0';	//サ〖チ脱戎始			if(*top == '"')			{				++ top;				for(work = top; *work != '\x0' && *work != '"'; ++work);			}			else				for(work = top; *work != '\x0' && *work != ' '; ++work);			*work = '\x0';	//タ〖ミネ〖ト借妄			log.logtype = LOG_MODULENAME;			log.logtim  = 0;			log.bufsz   = work - top + 1;	//タ〖ミネ〖タの尸			log.valid   = 1;			::WriteFile(FileHandle, &log, sizeof(log), &written, NULL);			::WriteFile(FileHandle, top, log.bufsz, &written, NULL);		}		static void finalize(void)		{            kprintf(("EventDumpRequest : finalize()\n"));			if(FileHandle != INVALID_HANDLE_VALUE)      //CreateFile returns INVALID_HANDLE_VALUE if it failed				::CloseHandle(FileHandle);		}		static EventDumpRequest * Create(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0)		{			EventDumpRequest * request;			BOOL      lock;			enter_system_critical_section(&lock);			request = new EventDumpRequest(_type, _block, _size, _storage, _address);			leave_system_critiacl_section(&lock);					return request;		}		virtual int invoke(void)		{			DWORD written;			BOOL  lock;			enter_system_critical_section(&lock);			if(FileHandle != INVALID_HANDLE_VALUE)      //CreateFile return INVALID_HANDLE_VALUE, not NULL, if it failed its operatation.				::WriteFile(FileHandle, storage, size, &written, NULL);			delete this;			leave_system_critiacl_section(&lock);			return 0;		}	};    class ExclusiveDeviceRequest : public Request    {    protected:        static HANDLE blocker;    public:        static void initialize(void) throw()        {            kprintf(("ExclusiveDeviceRequest::initialize()\n"));            if(blocker == NULL) {                blocker = ::CreateEvent(NULL, FALSE, FALSE, NULL);            }        }        static void finalize(void) throw()        {            kprintf(("ExclusiveDeviceRequest::finalize()\n"));            if(blocker != NULL) {                ::CloseHandle(blocker);            }        }        virtual void signal(int _result = 0)        {            result = _result;            ::SetEvent(blocker);        }        virtual int invoke(void)        {            int  _result = 0;            BOOL lock;            BOOL cpustate;                //充り哈みを敦贿する            if((cpustate = CPUStatus) == 0)                dis_int(0);            enter_system_critical_section(&lock);                //妥滇をキュ〖の黎片につなぐ            ::EnterCriticalSection(&cs);            next = top;            top = this;            if(tail == NULL)                tail = this;            ::LeaveCriticalSection(&cs);            ::InterlockedIncrement(&RequestCount);            ::ReleaseSemaphore(request_semaphore, 1, NULL);            leave_system_critiacl_section(&lock);            if(blocking) {                ::WaitForSingleObject(blocker, INFINITE);                _result = result;                enter_system_critical_section(&lock);                delete this;                leave_system_critiacl_section(&lock);            }            if(cpustate == 0)                ena_int(0);            return _result;        }    };//	typedef class EventDumpRequest EventRequest;	typedef class Request EventRequest;		//イベントログ叫蜗妥滇で蝗脱されるリクエスト//	typedef class Request DeviceRequest;	//デバイス奶慨妥滇で蝗脱されるリクエスト	typedef class ExclusiveDeviceRequest DeviceRequest;	//デバイス奶慨妥滇で蝗脱されるリクエスト	//==============================================================================	LONG				Request::RequestCount = -1;	//キュ〖につながっているリクエストの眶	Request *			Request::top  = NULL;		//リクエストキュ〖の黎片 (もっとも概いリクエスト)	Request *			Request::tail = NULL;		//リクエストキュ〖の琐萨 (もっとも糠しいリクエスト)	CRITICAL_SECTION	Request::cs;				//怯戮キュ〖拎侯脱错副挝拌オブジェクト	HANDLE              EventDumpRequest::FileHandle    = INVALID_HANDLE_VALUE;     //CreateFile uses INVALID_HANDLE_VALUE for identifying an invalid instance     HANDLE              ExclusiveDeviceRequest::blocker = NULL;	//==============================================================================		/*		 *   侯度スレッドが蝗脱する侯度簇眶の年盗		 */		//コネクションポイントへの儡鲁	bool Advise(IUnknown * container, REFIID iid, IUnknown * sink, DWORD * cookie, IConnectionPoint ** p_cp = NULL)	{		IConnectionPointContainer * cp_container;		IConnectionPoint * cp;        if(container == 0 || sink == 0 || cookie == 0)            return false;		if(p_cp == 0)			p_cp = &cp;			//IUnknownインタフェ〖スからIConnectionPointContainerへキャスト		container->QueryInterface(IID_IConnectionPointContainer, (void **)&cp_container);		if(cp_container == 0)			return false;			//ConnectionPointContainerから妥滇に圭うConnectionPointを玫す		cp_container->FindConnectionPoint(iid, p_cp);		cp_container->Release();		if(*p_cp == 0)			return false;			//コネクションポイント儡鲁		if(FAILED((*p_cp)->Advise(sink, cookie)))			return false;		if(p_cp == &cp)			cp->Release();		return true;	}	//==============================================================================	    /*     *  PerformRequest : 妥滇の悸乖     *     手笛猛 : イベント借妄を费鲁する(true) or 侯度スレッドを匿贿させる(false)     */    bool PerformRequest(IKernel * manager)    {        Request * request;        bool succeeded;			//キュ〖からリクエストを却き艰る		request = Request::GetRequest();		FatalAssertion(request != NULL,"");			//姜位妥滇		if(request->getType() == Request::QuitThread)		{			if(!request->isBlockingRequest())			{				BOOL lock;				enter_system_critical_section(&lock);				delete request;				leave_system_critiacl_section(&lock);			}            return false;		}			//妥滇髓の借妄		switch(request->getType())		{		case Request::Confirmation:			succeeded = true;			break;		case Request::DeviceRead:			succeeded = SUCCEEDED(manager->Read(request->getAddress(), request->getSize(), reinterpret_cast<char *>(request->getStorage())));			break;		case Request::DeviceWrite:			succeeded = SUCCEEDED(manager->Write(request->getAddress(), request->getSize(), reinterpret_cast<char *>(request->getStorage())));			break;		case Request::EventLog:			succeeded = SUCCEEDED(manager->OnLogEvent(request->getSize(), reinterpret_cast<unsigned char *>(request->getStorage())));				//シャットダウン面ならログを链婶はき姜るまで略ってもらう			ShutdownPostponementRequest = TRUE;			break;		default:

⌨️ 快捷键说明

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