[Opalvoip-svn] SF.net SVN: opalvoip:[34134] ptlib/trunk
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2015-10-03 16:37:27
|
Revision: 34134 http://sourceforge.net/p/opalvoip/code/34134 Author: rjongbloed Date: 2015-10-03 16:37:25 +0000 (Sat, 03 Oct 2015) Log Message: ----------- Merged revision(s) 34107-34133 from ptlib/branches/v2_16: r34132 Small bullet proofing of impossible use case on destruction of PConstString --------------------- r34131 Added natvis file to VS project for easier access. --------------------- r34130 Removed unnecessary virtual functions on internal class. --------------------- r34124 Added HKEY_LOCAL_MACH64 prefix to PConfig so can get at 64 bit "real" HKEY_LOCAL_MACHINE registry from 32 bit application. --------------------- Revision Links: -------------- http://sourceforge.net/p/opalvoip/code/34132 http://sourceforge.net/p/opalvoip/code/34131 http://sourceforge.net/p/opalvoip/code/34130 http://sourceforge.net/p/opalvoip/code/34124 Modified Paths: -------------- ptlib/trunk/include/ptlib/pstring.h ptlib/trunk/src/ptlib/common/contain.cxx ptlib/trunk/src/ptlib/common/osutils.cxx ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj.filters ptlib/trunk/src/ptlib/msos/svcproc.cxx ptlib/trunk/src/ptlib/msos/win32.cxx ptlib/trunk/src/ptlib/msos/wincfg.cxx ptlib/trunk/src/ptlib/unix/tlib.cxx ptlib/trunk/src/ptlib/unix/tlibthrd.cxx Property Changed: ---------------- ptlib/trunk/ Index: ptlib/trunk =================================================================== --- ptlib/trunk 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk 2015-10-03 16:37:25 UTC (rev 34134) Property changes on: ptlib/trunk ___________________________________________________________________ Modified: svn:mergeinfo ## -6,7 +6,7 ## /ptlib/branches/v2_10:25177-29189,32921,32947 /ptlib/branches/v2_12:28485-31603 /ptlib/branches/v2_14:31501-33720 -/ptlib/branches/v2_16:34085-34106 +/ptlib/branches/v2_16:34085-34133 /ptlib/branches/v2_2:20746,20791,20827,22014,22942 /ptlib/branches/v2_4:21086,21094,21147,21160,21185,21281,21296,21305,21322,21337,21363,21467,21471-21472,21506,21508,21623,21695,21744,21746,21763,22241,22958,23045-23046,23061,23066,23712 /ptlib/branches/v2_6:22195,22243,22295,22304,22311,22317,22320,22356,22458,22509,22587,22601-22602,22611,22629,22633,22673,22681,22729,22731-22732,22736,22742,22848,22960,22992,23161,23163,23167,23169,23177,23239,23291,23298,23336,23429,23595,23823,23827,23873,24816 \ No newline at end of property Modified: ptlib/trunk/include/ptlib/pstring.h =================================================================== --- ptlib/trunk/include/ptlib/pstring.h 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/include/ptlib/pstring.h 2015-10-03 16:37:25 UTC (rev 34134) @@ -2129,7 +2129,7 @@ virtual PBoolean SetSize(PINDEX s) { return s <= this->m_length+1; } virtual void AssignContents(const PContainer &) { PAssertAlways(PInvalidParameter); } - virtual void DestroyReference() { } + virtual void DestroyReference() { reference = NULL; } private: void operator=(const PConstantString &) { } Modified: ptlib/trunk/src/ptlib/common/contain.cxx =================================================================== --- ptlib/trunk/src/ptlib/common/contain.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/common/contain.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -141,6 +141,7 @@ void PContainer::DestroyReference() { delete reference; + reference = NULL; } Modified: ptlib/trunk/src/ptlib/common/osutils.cxx =================================================================== --- ptlib/trunk/src/ptlib/common/osutils.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/common/osutils.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -2194,6 +2194,34 @@ } +void PProcess::HouseKeeping() +{ + PSimpleTimer cleanAutoDeleteThreads; + static PTimeInterval const CleanAutoDeleteThreadsTime(0, 10); + + while (m_keepingHouse) { +#if P_TIMERS + PTimeInterval delay = m_timerList->Process(); + if (delay > CleanAutoDeleteThreadsTime) + delay = CleanAutoDeleteThreadsTime; + + m_signalHouseKeeper.Wait(delay); +#else + m_signalHouseKeeper.Wait(10000); +#endif + + if (cleanAutoDeleteThreads.HasExpired()) { + InternalCleanAutoDeleteThreads(); + cleanAutoDeleteThreads = CleanAutoDeleteThreadsTime; + } + +#ifndef _WIN32 + PXCheckSignals(); +#endif + } +} + + void PProcess::PreShutdown() { PTRACE(4, "PTLib\tStarting process destruction."); Modified: ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj =================================================================== --- ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj 2015-10-03 16:37:25 UTC (rev 34134) @@ -1096,6 +1096,7 @@ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Android'">$(ProjectDir)..\..\..\configure.ac;%(AdditionalInputs)</AdditionalInputs> </CustomBuild> <None Include="..\..\..\include\ptlib\contain.inl" /> + <None Include="..\..\..\include\ptlib\msos\ptlib.natvis" /> <None Include="..\..\..\include\ptlib\osutil.inl" /> <None Include="..\..\..\include\ptlib\msos\ptlib\ptlib.inl" /> <None Include="..\..\..\configure.ac" /> Modified: ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj.filters =================================================================== --- ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj.filters 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/msos/Console_2013.vcxproj.filters 2015-10-03 16:37:25 UTC (rev 34134) @@ -981,6 +981,7 @@ <None Include="..\..\..\include\ptlib\unix\ptlib\ptlib.inl"> <Filter>Header Files\Android</Filter> </None> + <None Include="..\..\..\include\ptlib\msos\ptlib.natvis" /> </ItemGroup> <ItemGroup> <Filter Include="Header Files"> Modified: ptlib/trunk/src/ptlib/msos/svcproc.cxx =================================================================== --- ptlib/trunk/src/ptlib/msos/svcproc.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/msos/svcproc.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -1158,15 +1158,15 @@ NT_ServiceManager() { schSCManager = schService = NULL; error = 0; } ~NT_ServiceManager(); - virtual bool Create(PServiceProcess * svc); - virtual bool Remove(PServiceProcess * svc); - virtual bool Start(PServiceProcess * svc); - virtual bool Stop(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_STOP); } - virtual bool Pause(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_PAUSE); } - virtual bool Resume(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_CONTINUE); } - virtual bool SetConfig(PServiceProcess * svc, SC_ACTION_TYPE action); - virtual bool IsInstalled(PServiceProcess * svc); - virtual bool IsRunning(PServiceProcess * svc); + bool Create(PServiceProcess * svc); + bool Remove(PServiceProcess * svc); + bool Start(PServiceProcess * svc); + bool Stop(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_STOP); } + bool Pause(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_PAUSE); } + bool Resume(PServiceProcess * svc) { return Control(svc, SERVICE_CONTROL_CONTINUE); } + bool SetConfig(PServiceProcess * svc, SC_ACTION_TYPE action); + bool IsInstalled(PServiceProcess * svc); + bool IsRunning(PServiceProcess * svc); DWORD GetError() const { return error; } Modified: ptlib/trunk/src/ptlib/msos/win32.cxx =================================================================== --- ptlib/trunk/src/ptlib/msos/win32.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/msos/win32.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -1194,75 +1194,6 @@ /////////////////////////////////////////////////////////////////////////////// -// PProcess::TimerThread - -void PProcess::HouseKeeping() -{ - while (m_keepingHouse) { - - // collect a list of thread handles to check, and clean up - // handles for threads that disappeared without telling us - m_threadMutex.Wait(); - HANDLE handles[MAXIMUM_WAIT_OBJECTS]; - DWORD numHandles = 1; - handles[0] = m_signalHouseKeeper.GetHandle(); - for (ThreadList::iterator thread = m_autoDeleteThreads.begin(); thread != m_autoDeleteThreads.end(); ++thread) { - if (thread->IsTerminated()) - continue; - - handles[numHandles] = thread->GetHandle(); - - // make sure we don't put invalid handles into the list -#ifndef _WIN32_WCE - DWORD dwFlags; - if (GetHandleInformation(handles[numHandles], &dwFlags) == 0) { - PTRACE(2, "PTLib\tRefused to put invalid handle into wait list"); - } - else -#endif - // don't put the handle for the current process in the list - if (handles[numHandles] != GetHandle()) { - numHandles++; - if (numHandles >= MAXIMUM_WAIT_OBJECTS) - break; - } - } - m_threadMutex.Signal(); - - PTimeInterval nextTimer = m_timerList->Process(); - DWORD delay; - if (nextTimer == PMaxTimeInterval) - delay = INFINITE; - else if (nextTimer > 1000) - delay = 1000; - else - delay = nextTimer.GetInterval(); - - DWORD result; - int retries = 100; - - while ((result = WaitForMultipleObjects(numHandles, handles, false, delay)) == WAIT_FAILED) { - - // if we get an invalid handle error, than assume this is because a thread ended between - // creating the handle list and testing it. So, cleanup the list before calling - // WaitForMultipleObjects again - if (::GetLastError() == ERROR_INVALID_HANDLE) - break; - - // sometimes WaitForMultipleObjects fails. No idea why, so allow some retries - else { - retries--; - if (retries <= 0) - break; - } - } - - InternalCleanAutoDeleteThreads(); - } -} - - -/////////////////////////////////////////////////////////////////////////////// // PProcess PProcess::~PProcess() Modified: ptlib/trunk/src/ptlib/msos/wincfg.cxx =================================================================== --- ptlib/trunk/src/ptlib/msos/wincfg.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/msos/wincfg.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -40,9 +40,10 @@ #define new PNEW -const char LocalMachineStr[] = "HKEY_LOCAL_MACHINE\\"; -const char CurrentUserStr[] = "HKEY_CURRENT_USER\\"; -const char ClassesRootStr[] = "HKEY_CLASSES_ROOT\\"; +static PConstString const LocalMachineStr("HKEY_LOCAL_MACHINE\\"); +static PConstString const LocalMach64Str ("HKEY_LOCAL_MACH64\\"); +static PConstString const CurrentUserStr ("HKEY_CURRENT_USER\\"); +static PConstString const ClassesRootStr ("HKEY_CLASSES_ROOT\\"); /////////////////////////////////////////////////////////////////////////////// // Configuration files @@ -207,16 +208,21 @@ PVarString subkey; HKEY basekey; - if (subkeyname.Find(LocalMachineStr) == 0) { - subkey = subkeyname.Mid(19); + if (subkeyname.NumCompare(LocalMachineStr) == PObject::EqualTo) { + subkey = subkeyname.Mid(LocalMachineStr.GetLength()); basekey = HKEY_LOCAL_MACHINE; } - else if (subkeyname.Find(CurrentUserStr) == 0) { - subkey = subkeyname.Mid(18); + else if (subkeyname.NumCompare(LocalMach64Str) == PObject::EqualTo) { + subkey = subkeyname.Mid(LocalMach64Str.GetLength()); + basekey = HKEY_LOCAL_MACHINE; + access |= KEY_WOW64_64KEY; + } + else if (subkeyname.NumCompare(CurrentUserStr) == PObject::EqualTo) { + subkey = subkeyname.Mid(CurrentUserStr.GetLength()); basekey = HKEY_CURRENT_USER; } - else if (subkeyname.Find(ClassesRootStr) == 0) { - subkey = subkeyname.Mid(18); + else if (subkeyname.NumCompare(ClassesRootStr) == PObject::EqualTo) { + subkey = subkeyname.Mid(ClassesRootStr.GetLength()); basekey = HKEY_CLASSES_ROOT; } else { @@ -352,7 +358,8 @@ PVarString varValueName = valueName; DWORD type, size, num; - if (RegQueryValueEx(key, varValueName, NULL, &type, NULL, &size) != ERROR_SUCCESS) + DWORD error = RegQueryValueEx(key, varValueName, NULL, &type, NULL, &size); + if (error != ERROR_SUCCESS) return false; if (type == REG_DWORD) { @@ -450,10 +457,17 @@ #if P_CONFIG_FILE -static PBoolean IsRegistryPath(const PString & path) +static PBoolean IsRegistryPath(PString & path) { - return (path.Find(LocalMachineStr) == 0 && path != LocalMachineStr) || - (path.Find(CurrentUserStr) == 0 && path != CurrentUserStr); + if (path.NumCompare(LocalMachineStr) != PObject::EqualTo && + path.NumCompare(LocalMach64Str ) != PObject::EqualTo && + path.NumCompare(CurrentUserStr ) != PObject::EqualTo) + return false; + + if (path[path.GetLength() - 1] != '\\') + path += '\\'; + + return true; } @@ -494,9 +508,8 @@ switch (src) { case System : - if (IsRegistryPath(appname)) - location = appname; - else { + location = appname; + if (!IsRegistryPath(location)) { TCHAR dir[_MAX_PATH]; GetWindowsDirectory(dir, sizeof(dir)); Construct(PDirectory(PString(dir))+"WIN.INI"); Modified: ptlib/trunk/src/ptlib/unix/tlib.cxx =================================================================== --- ptlib/trunk/src/ptlib/unix/tlib.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/unix/tlib.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -975,11 +975,6 @@ #warning No thread support, practically nothing will work! -void PProcess::HouseKeeping() -{ -} - - void PProcess::Construct() { CommonConstruct(); Modified: ptlib/trunk/src/ptlib/unix/tlibthrd.cxx =================================================================== --- ptlib/trunk/src/ptlib/unix/tlibthrd.cxx 2015-10-03 16:32:42 UTC (rev 34133) +++ ptlib/trunk/src/ptlib/unix/tlibthrd.cxx 2015-10-03 16:37:25 UTC (rev 34134) @@ -161,26 +161,6 @@ #define new PNEW -void PProcess::HouseKeeping() -{ - while (m_keepingHouse) { -#if P_TIMERS - PTimeInterval delay = m_timerList->Process(); - if (delay > 10000) - delay = 10000; - - m_signalHouseKeeper.Wait(delay); -#else - m_signalHouseKeeper.Wait(10000); -#endif - - InternalCleanAutoDeleteThreads(); - - PXCheckSignals(); - } -} - - void PProcess::Construct() { CommonConstruct(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |