#include "stdafx.h" #include "CDI.h" #include "LocalConfig.h" #include "PacketAnalizer.h" #include "UnloadModules.h" UnloadModules g_Unloader; UnloadModules::UnloadModules() { m_prootClient = NULL; } UnloadModules::~UnloadModules() { if (m_prootClient) { delete m_prootClient; m_prootClient = NULL; } } bool UnloadModules::Exec() { HANDLE hand = m_prootClient->GetNotifyHandle(); HANDLE vec[2] = { m_ExitFlag, hand }; DWORD wait = WaitForMultipleObjects(2, vec, FALSE, INFINITE); //printf("Thread:%d,hit DrvTree Entry.code:%d\n", GetCurrentThreadId(), wait); if (wait == WAIT_TIMEOUT) { //timeout } else if (wait == WAIT_OBJECT_0) { return false; } else if (wait == WAIT_OBJECT_0 + 1) { //got notify ResDataObject packet; try { //printf("Thread:%d,DrvTree Thread Loop\n", GetCurrentThreadId()); if (m_prootClient->IsClosed() == false) { PACKET_CMD cmd; do { cmd = m_prootClient->ReadCmd(packet); if (cmd == PACKET_CMD_UPDATE) { string key = PacketAnalizer::GetPacketKey(&packet); if (key == "ExitFlag") { if (m_prootClient->GetExitFlag()) { m_prootClient->Close(); //do the Exit Job GetCommandDispathIF()->UnLoadAll(); return false; } } //ignore others } else { //ignore others //printf("Thread:%d,DrvTree Thread Ignore\n", GetCurrentThreadId(), cmd); } } while (cmd != PACKET_CMD_NONE); } else { //try once if (m_prootClient->Open((const char*)getRootpath(), ALL_ACCESS) == false) { printf("Thread:%d,Open Failed\n", GetCurrentThreadId()); return false; } } } catch (...) { printf("Thread:%d,Exeption in DrvTree Thread\n", GetCurrentThreadId()); } } return true; } bool UnloadModules::OnStartThread() { if (m_prootClient == NULL) { m_prootClient = new BusUnitClient(); if (m_prootClient->Open((const char*)getRootpath(), ALL_ACCESS) >= RET_SUCCEED) { return true; } } return false; }