| Index: src/shared/EventWithSetter.cpp |
| diff --git a/src/shared/EventWithSetter.cpp b/src/shared/EventWithSetter.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..117b99ed36d11c37423560737c5c7cfdd466abc4 |
| --- /dev/null |
| +++ b/src/shared/EventWithSetter.cpp |
| @@ -0,0 +1,87 @@ |
| +/* |
| +* This file is part of Adblock Plus <https://adblockplus.org/>, |
| +* Copyright (C) 2006-2016 Eyeo GmbH |
| +* |
| +* Adblock Plus is free software: you can redistribute it and/or modify |
| +* it under the terms of the GNU General Public License version 3 as |
| +* published by the Free Software Foundation. |
| +* |
| +* Adblock Plus is distributed in the hope that it will be useful, |
| +* but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +* GNU General Public License for more details. |
| +* |
| +* You should have received a copy of the GNU General Public License |
| +* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| +*/ |
| +#include <cassert> |
| +#include "EventWithSetter.h" |
| + |
| +Event::Event() |
| + : m_handle(CreateEvent(/*eventAttributes*/nullptr, /*manualReset*/TRUE, |
| +/*initState*/FALSE, /*name*/nullptr)) |
| +{ |
| + assert(!!*this && "Handle should be successfully created"); |
| +} |
| + |
| +Event::~Event() |
| +{ |
| + if (!!*this) { |
| + CloseHandle(m_handle); |
| + } |
| +} |
| + |
| +void Event::Set() |
| +{ |
| + SetEvent(m_handle); |
| +} |
| + |
| +void Event::Reset() |
| +{ |
| + ResetEvent(m_handle); |
| +} |
| + |
| +bool Event::Wait(int32_t timeoutMsec /*= InfiniteTimeout*/) |
| +{ |
| + return WaitForSingleObject(m_handle, timeoutMsec) == WAIT_OBJECT_0; |
| +} |
| + |
| +EventWithSetter::Setter::Setter(const DataPtr& data) |
| + : m_data(data) |
| +{ |
| +} |
| + |
| +EventWithSetter::Setter::~Setter() |
| +{ |
| + if (!m_data->isSetCalled) |
| + m_data->event.Set(); |
| +} |
| + |
| +void EventWithSetter::Setter::Set() |
| +{ |
| + m_data->isSetCalled = true; |
| + m_data->event.Set(); |
| +} |
| + |
| +EventWithSetter::EventWithSetter() |
| + : m_data(std::make_shared<Data>()) |
| +{ |
| +} |
| + |
| +std::shared_ptr<EventWithSetter::Setter> EventWithSetter::CreateSetter() |
| +{ |
| + std::shared_ptr<Setter> retValue = m_data->eventSetter.lock(); |
| + assert(!m_data->isSetterCreated && !retValue && "Setter is already created however it's supposed to be created only once"); |
| + if (!retValue) |
| + { |
| + retValue = std::make_shared<Setter>(m_data); |
| + } |
| + m_data->isSetterCreated = true; |
| + return retValue; |
| +} |
| + |
| +bool EventWithSetter::Wait(int32_t timeoutMsec /*= Event::InfiniteTimeout*/) |
| +{ |
| + assert(m_data->isSetterCreated && "Wrong class usage. The setter should be created before calling Wait."); |
| + return m_data->isSetterCreated && m_data->event.Wait(timeoutMsec) && m_data->isSetCalled; |
| +} |