diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
commit | 2d37894b1b037cf24231090eda8589bbb44fb6fc (patch) | |
tree | be835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/poco/Foundation/src/AsyncChannel.cpp | |
parent | 718c552901d703c502ccbefdfc3c9028d608b947 (diff) | |
download | ydb-2d37894b1b037cf24231090eda8589bbb44fb6fc.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/poco/Foundation/src/AsyncChannel.cpp')
-rw-r--r-- | contrib/libs/poco/Foundation/src/AsyncChannel.cpp | 336 |
1 files changed, 168 insertions, 168 deletions
diff --git a/contrib/libs/poco/Foundation/src/AsyncChannel.cpp b/contrib/libs/poco/Foundation/src/AsyncChannel.cpp index 43f6e1eabe..adfadf4d09 100644 --- a/contrib/libs/poco/Foundation/src/AsyncChannel.cpp +++ b/contrib/libs/poco/Foundation/src/AsyncChannel.cpp @@ -1,168 +1,168 @@ -// -// AsyncChannel.cpp -// -// Library: Foundation -// Package: Logging -// Module: AsyncChannel -// -// Copyright (c) 2004-2007, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/AsyncChannel.h" -#include "Poco/Notification.h" -#include "Poco/Message.h" -#include "Poco/Formatter.h" -#include "Poco/AutoPtr.h" -#include "Poco/LoggingRegistry.h" -#include "Poco/Exception.h" - - -namespace Poco { - - -class MessageNotification: public Notification -{ -public: - MessageNotification(const Message& msg): - _msg(msg) - { - } - - ~MessageNotification() - { - } - - const Message& message() const - { - return _msg; - } - -private: - Message _msg; -}; - - -AsyncChannel::AsyncChannel(Channel* pChannel, Thread::Priority prio): - _pChannel(pChannel), - _thread("AsyncChannel") -{ - if (_pChannel) _pChannel->duplicate(); - _thread.setPriority(prio); -} - - -AsyncChannel::~AsyncChannel() -{ - try - { - close(); - if (_pChannel) _pChannel->release(); - } - catch (...) - { - poco_unexpected(); - } -} - - -void AsyncChannel::setChannel(Channel* pChannel) -{ - FastMutex::ScopedLock lock(_channelMutex); - - if (_pChannel) _pChannel->release(); - _pChannel = pChannel; - if (_pChannel) _pChannel->duplicate(); -} - - -Channel* AsyncChannel::getChannel() const -{ - return _pChannel; -} - - -void AsyncChannel::open() -{ - FastMutex::ScopedLock lock(_threadMutex); - - if (!_thread.isRunning()) - _thread.start(*this); -} - - -void AsyncChannel::close() -{ - if (_thread.isRunning()) - { - while (!_queue.empty()) Thread::sleep(100); - - do - { - _queue.wakeUpAll(); - } - while (!_thread.tryJoin(100)); - } -} - - -void AsyncChannel::log(const Message& msg) -{ - open(); - - _queue.enqueueNotification(new MessageNotification(msg)); -} - - -void AsyncChannel::setProperty(const std::string& name, const std::string& value) -{ - if (name == "channel") - setChannel(LoggingRegistry::defaultRegistry().channelForName(value)); - else if (name == "priority") - setPriority(value); - else - Channel::setProperty(name, value); -} - - -void AsyncChannel::run() -{ - AutoPtr<Notification> nf = _queue.waitDequeueNotification(); - while (nf) - { - MessageNotification* pNf = dynamic_cast<MessageNotification*>(nf.get()); - { - FastMutex::ScopedLock lock(_channelMutex); - - if (pNf && _pChannel) _pChannel->log(pNf->message()); - } - nf = _queue.waitDequeueNotification(); - } -} - - -void AsyncChannel::setPriority(const std::string& value) -{ - Thread::Priority prio = Thread::PRIO_NORMAL; - - if (value == "lowest") - prio = Thread::PRIO_LOWEST; - else if (value == "low") - prio = Thread::PRIO_LOW; - else if (value == "normal") - prio = Thread::PRIO_NORMAL; - else if (value == "high") - prio = Thread::PRIO_HIGH; - else if (value == "highest") - prio = Thread::PRIO_HIGHEST; - else - throw InvalidArgumentException("thread priority", value); - - _thread.setPriority(prio); -} - - -} // namespace Poco +// +// AsyncChannel.cpp +// +// Library: Foundation +// Package: Logging +// Module: AsyncChannel +// +// Copyright (c) 2004-2007, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/AsyncChannel.h" +#include "Poco/Notification.h" +#include "Poco/Message.h" +#include "Poco/Formatter.h" +#include "Poco/AutoPtr.h" +#include "Poco/LoggingRegistry.h" +#include "Poco/Exception.h" + + +namespace Poco { + + +class MessageNotification: public Notification +{ +public: + MessageNotification(const Message& msg): + _msg(msg) + { + } + + ~MessageNotification() + { + } + + const Message& message() const + { + return _msg; + } + +private: + Message _msg; +}; + + +AsyncChannel::AsyncChannel(Channel* pChannel, Thread::Priority prio): + _pChannel(pChannel), + _thread("AsyncChannel") +{ + if (_pChannel) _pChannel->duplicate(); + _thread.setPriority(prio); +} + + +AsyncChannel::~AsyncChannel() +{ + try + { + close(); + if (_pChannel) _pChannel->release(); + } + catch (...) + { + poco_unexpected(); + } +} + + +void AsyncChannel::setChannel(Channel* pChannel) +{ + FastMutex::ScopedLock lock(_channelMutex); + + if (_pChannel) _pChannel->release(); + _pChannel = pChannel; + if (_pChannel) _pChannel->duplicate(); +} + + +Channel* AsyncChannel::getChannel() const +{ + return _pChannel; +} + + +void AsyncChannel::open() +{ + FastMutex::ScopedLock lock(_threadMutex); + + if (!_thread.isRunning()) + _thread.start(*this); +} + + +void AsyncChannel::close() +{ + if (_thread.isRunning()) + { + while (!_queue.empty()) Thread::sleep(100); + + do + { + _queue.wakeUpAll(); + } + while (!_thread.tryJoin(100)); + } +} + + +void AsyncChannel::log(const Message& msg) +{ + open(); + + _queue.enqueueNotification(new MessageNotification(msg)); +} + + +void AsyncChannel::setProperty(const std::string& name, const std::string& value) +{ + if (name == "channel") + setChannel(LoggingRegistry::defaultRegistry().channelForName(value)); + else if (name == "priority") + setPriority(value); + else + Channel::setProperty(name, value); +} + + +void AsyncChannel::run() +{ + AutoPtr<Notification> nf = _queue.waitDequeueNotification(); + while (nf) + { + MessageNotification* pNf = dynamic_cast<MessageNotification*>(nf.get()); + { + FastMutex::ScopedLock lock(_channelMutex); + + if (pNf && _pChannel) _pChannel->log(pNf->message()); + } + nf = _queue.waitDequeueNotification(); + } +} + + +void AsyncChannel::setPriority(const std::string& value) +{ + Thread::Priority prio = Thread::PRIO_NORMAL; + + if (value == "lowest") + prio = Thread::PRIO_LOWEST; + else if (value == "low") + prio = Thread::PRIO_LOW; + else if (value == "normal") + prio = Thread::PRIO_NORMAL; + else if (value == "high") + prio = Thread::PRIO_HIGH; + else if (value == "highest") + prio = Thread::PRIO_HIGHEST; + else + throw InvalidArgumentException("thread priority", value); + + _thread.setPriority(prio); +} + + +} // namespace Poco |