diff --git a/Foundation/src/FileChannel.cpp b/Foundation/src/FileChannel.cpp index a1f568531..d8daa1135 100644 --- a/Foundation/src/FileChannel.cpp +++ b/Foundation/src/FileChannel.cpp @@ -350,9 +350,9 @@ void FileChannel::setPurgeCount(const std::string& count) std::string::const_iterator it = count.begin(); std::string::const_iterator end = count.end(); - while (it != end && std::isspace(*it)) ++it; - while (it != end && std::isdigit(*it)) { n *= 10; n += *it++ - '0'; } - while (it != end && std::isspace(*it)) ++it; + while (it != end && Ascii::isSpace(*it)) ++it; + while (it != end && Ascii::isDigit(*it)) { n *= 10; n += *it++ - '0'; } + while (it != end && Ascii::isSpace(*it)) ++it; if (0 == n) throw InvalidArgumentException("Zero is not valid purge count."); diff --git a/Foundation/src/PatternFormatter.cpp b/Foundation/src/PatternFormatter.cpp index 206dc0cf8..d8b9d66bf 100644 --- a/Foundation/src/PatternFormatter.cpp +++ b/Foundation/src/PatternFormatter.cpp @@ -43,8 +43,6 @@ #include "Poco/Timestamp.h" #include "Poco/Timezone.h" #include "Poco/Environment.h" -#include -#include namespace Poco { @@ -74,7 +72,7 @@ PatternFormatter::~PatternFormatter() void PatternFormatter::format(const Message& msg, std::string& text) { - Timestamp timestamp = msg.getTime(); + Timestamp timestamp = msg.getTime(); if (_localTime) { timestamp += Timezone::utcOffset()*Timestamp::resolution(); diff --git a/Foundation/src/PriorityNotificationQueue.cpp b/Foundation/src/PriorityNotificationQueue.cpp index 1ae2f8668..f2ed9e004 100644 --- a/Foundation/src/PriorityNotificationQueue.cpp +++ b/Foundation/src/PriorityNotificationQueue.cpp @@ -1,205 +1,210 @@ -// -// PriorityNotificationQueue.cpp -// +// +// PriorityNotificationQueue.cpp +// // $Id: //poco/Main/Foundation/src/PriorityNotificationQueue.cpp#1 $ -// -// Library: Foundation -// Package: Notifications -// Module: PriorityNotificationQueue -// -// Copyright (c) 2009, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - - -#include "Poco/PriorityNotificationQueue.h" -#include "Poco/NotificationCenter.h" -#include "Poco/Notification.h" -#include "Poco/SingletonHolder.h" - - -namespace Poco { - - -PriorityNotificationQueue::PriorityNotificationQueue() -{ -} - - -PriorityNotificationQueue::~PriorityNotificationQueue() -{ - clear(); -} - - -void PriorityNotificationQueue::enqueueNotification(Notification::Ptr pNotification, int priority) -{ - poco_check_ptr (pNotification); - FastMutex::ScopedLock lock(_mutex); - if (_waitQueue.empty()) - { - _nfQueue.insert(NfQueue::value_type(priority, pNotification)); - } - else - { - poco_assert_dbg(_nfQueue.empty()); - WaitInfo* pWI = _waitQueue.front(); - _waitQueue.pop_front(); - pWI->pNf = pNotification; - pWI->nfAvailable.set(); - } -} - - -Notification* PriorityNotificationQueue::dequeueNotification() -{ - FastMutex::ScopedLock lock(_mutex); - return dequeueOne().duplicate(); -} - - -Notification* PriorityNotificationQueue::waitDequeueNotification() -{ - Notification::Ptr pNf; - WaitInfo* pWI = 0; - { - FastMutex::ScopedLock lock(_mutex); - pNf = dequeueOne(); - if (pNf) return pNf.duplicate(); - pWI = new WaitInfo; - _waitQueue.push_back(pWI); - } - pWI->nfAvailable.wait(); - pNf = pWI->pNf; - delete pWI; - return pNf.duplicate(); -} - - -Notification* PriorityNotificationQueue::waitDequeueNotification(long milliseconds) -{ - Notification::Ptr pNf; - WaitInfo* pWI = 0; - { - FastMutex::ScopedLock lock(_mutex); - pNf = dequeueOne(); - if (pNf) return pNf.duplicate(); - pWI = new WaitInfo; - _waitQueue.push_back(pWI); - } - if (pWI->nfAvailable.tryWait(milliseconds)) - { - pNf = pWI->pNf; - } - else - { - FastMutex::ScopedLock lock(_mutex); - pNf = pWI->pNf; - for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it) - { - if (*it == pWI) - { - _waitQueue.erase(it); - break; - } - } - } - delete pWI; - return pNf.duplicate(); -} - - -void PriorityNotificationQueue::dispatch(NotificationCenter& notificationCenter) -{ - FastMutex::ScopedLock lock(_mutex); - Notification::Ptr pNf = dequeueOne(); - while (pNf) - { - notificationCenter.postNotification(pNf); - pNf = dequeueOne(); - } -} - - -void PriorityNotificationQueue::wakeUpAll() -{ - FastMutex::ScopedLock lock(_mutex); - for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it) - { - (*it)->nfAvailable.set(); - } - _waitQueue.clear(); -} - - -bool PriorityNotificationQueue::empty() const -{ - FastMutex::ScopedLock lock(_mutex); - return _nfQueue.empty(); -} - - -int PriorityNotificationQueue::size() const -{ - FastMutex::ScopedLock lock(_mutex); - return static_cast(_nfQueue.size()); -} - - -void PriorityNotificationQueue::clear() -{ - FastMutex::ScopedLock lock(_mutex); - _nfQueue.clear(); -} - - -bool PriorityNotificationQueue::hasIdleThreads() const -{ - FastMutex::ScopedLock lock(_mutex); - return !_waitQueue.empty(); -} - - -Notification::Ptr PriorityNotificationQueue::dequeueOne() -{ - Notification::Ptr pNf; - NfQueue::iterator it = _nfQueue.begin(); - if (it != _nfQueue.end()) - { - pNf = it->second; - _nfQueue.erase(it); - } - return pNf; -} - - -PriorityNotificationQueue& PriorityNotificationQueue::defaultQueue() -{ - static SingletonHolder sh; - return *sh.get(); -} - - -} // namespace Poco +// +// Library: Foundation +// Package: Notifications +// Module: PriorityNotificationQueue +// +// Copyright (c) 2009, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// + + +#include "Poco/PriorityNotificationQueue.h" +#include "Poco/NotificationCenter.h" +#include "Poco/Notification.h" +#include "Poco/SingletonHolder.h" + + +namespace Poco { + + +PriorityNotificationQueue::PriorityNotificationQueue() +{ +} + + +PriorityNotificationQueue::~PriorityNotificationQueue() +{ + clear(); +} + + +void PriorityNotificationQueue::enqueueNotification(Notification::Ptr pNotification, int priority) +{ + poco_check_ptr (pNotification); + FastMutex::ScopedLock lock(_mutex); + if (_waitQueue.empty()) + { + _nfQueue.insert(NfQueue::value_type(priority, pNotification)); + } + else + { + poco_assert_dbg(_nfQueue.empty()); + WaitInfo* pWI = _waitQueue.front(); + _waitQueue.pop_front(); + pWI->pNf = pNotification; + pWI->nfAvailable.set(); + } +} + + +Notification* PriorityNotificationQueue::dequeueNotification() +{ + FastMutex::ScopedLock lock(_mutex); + return dequeueOne().duplicate(); +} + + +Notification* PriorityNotificationQueue::waitDequeueNotification() +{ + Notification::Ptr pNf; + WaitInfo* pWI = 0; + { + FastMutex::ScopedLock lock(_mutex); + pNf = dequeueOne(); + if (pNf) return pNf.duplicate(); + pWI = new WaitInfo; + _waitQueue.push_back(pWI); + } + pWI->nfAvailable.wait(); + pNf = pWI->pNf; + delete pWI; + return pNf.duplicate(); +} + + +Notification* PriorityNotificationQueue::waitDequeueNotification(long milliseconds) +{ + Notification::Ptr pNf; + WaitInfo* pWI = 0; + { + FastMutex::ScopedLock lock(_mutex); + pNf = dequeueOne(); + if (pNf) return pNf.duplicate(); + pWI = new WaitInfo; + _waitQueue.push_back(pWI); + } + if (pWI->nfAvailable.tryWait(milliseconds)) + { + pNf = pWI->pNf; + } + else + { + FastMutex::ScopedLock lock(_mutex); + pNf = pWI->pNf; + for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it) + { + if (*it == pWI) + { + _waitQueue.erase(it); + break; + } + } + } + delete pWI; + return pNf.duplicate(); +} + + +void PriorityNotificationQueue::dispatch(NotificationCenter& notificationCenter) +{ + FastMutex::ScopedLock lock(_mutex); + Notification::Ptr pNf = dequeueOne(); + while (pNf) + { + notificationCenter.postNotification(pNf); + pNf = dequeueOne(); + } +} + + +void PriorityNotificationQueue::wakeUpAll() +{ + FastMutex::ScopedLock lock(_mutex); + for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it) + { + (*it)->nfAvailable.set(); + } + _waitQueue.clear(); +} + + +bool PriorityNotificationQueue::empty() const +{ + FastMutex::ScopedLock lock(_mutex); + return _nfQueue.empty(); +} + + +int PriorityNotificationQueue::size() const +{ + FastMutex::ScopedLock lock(_mutex); + return static_cast(_nfQueue.size()); +} + + +void PriorityNotificationQueue::clear() +{ + FastMutex::ScopedLock lock(_mutex); + _nfQueue.clear(); +} + + +bool PriorityNotificationQueue::hasIdleThreads() const +{ + FastMutex::ScopedLock lock(_mutex); + return !_waitQueue.empty(); +} + + +Notification::Ptr PriorityNotificationQueue::dequeueOne() +{ + Notification::Ptr pNf; + NfQueue::iterator it = _nfQueue.begin(); + if (it != _nfQueue.end()) + { + pNf = it->second; + _nfQueue.erase(it); + } + return pNf; +} + + +namespace +{ + static SingletonHolder sh; +} + + +PriorityNotificationQueue& PriorityNotificationQueue::defaultQueue() +{ + return *sh.get(); +} + + +} // namespace Poco diff --git a/Foundation/src/RWLock.cpp b/Foundation/src/RWLock.cpp index c4833fb1c..3811f2fab 100644 --- a/Foundation/src/RWLock.cpp +++ b/Foundation/src/RWLock.cpp @@ -43,6 +43,8 @@ #else #include "RWLock_WIN32.cpp" #endif +#elif defined(POCO_ANDROID) +#include "RWLock_Android.cpp" #elif defined(POCO_VXWORKS) #include "RWLock_VX.cpp" #else diff --git a/Foundation/src/SharedLibrary_WIN32.cpp b/Foundation/src/SharedLibrary_WIN32.cpp index 66f922bcf..4ed70b232 100644 --- a/Foundation/src/SharedLibrary_WIN32.cpp +++ b/Foundation/src/SharedLibrary_WIN32.cpp @@ -61,7 +61,10 @@ void SharedLibraryImpl::loadImpl(const std::string& path) FastMutex::ScopedLock lock(_mutex); if (_handle) throw LibraryAlreadyLoadedException(_path); - _handle = LoadLibraryA(path.c_str()); + DWORD flags(0); + Path p(path); + if (p.isAbsolute()) flags |= LOAD_WITH_ALTERED_SEARCH_PATH; + _handle = LoadLibraryExA(path.c_str(), 0, flags); if (!_handle) throw LibraryLoadException(path); _path = path; } diff --git a/Foundation/src/Timezone_VX.cpp b/Foundation/src/Timezone_VX.cpp index 609e44846..419f9c206 100644 --- a/Foundation/src/Timezone_VX.cpp +++ b/Foundation/src/Timezone_VX.cpp @@ -55,11 +55,11 @@ int Timezone::utcOffset() int Timezone::dst() { - std::time_t now = std::time(NULL); - struct std::tm t; - if (!localtime_r(&now, &t)) - throw Poco::SystemException("cannot get local time DST offset"); - return t.tm_isdst == 1 ? 3600 : 0; + std::time_t now = std::time(NULL); + struct std::tm t; + if (localtime_r(&now, &t) != OK) + throw Poco::SystemException("cannot get local time DST offset"); + return t.tm_isdst == 1 ? 3600 : 0; }