diff options
author | Max Kellermann <max@duempel.org> | 2016-03-05 18:49:42 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2016-03-05 19:15:50 +0100 |
commit | e52ac0b187bc822eb45d5589e1d9637a348e7a54 (patch) | |
tree | 07590a6b76e0f1a9cb82d4a111c3136e80d50e1a /src/event | |
parent | eaa1590866b6af615a66a5f29817de066b45fae0 (diff) |
event/MaskMonitor: new class to replace code in GlobalEvents and Idle
Diffstat (limited to 'src/event')
-rw-r--r-- | src/event/MaskMonitor.cxx | 36 | ||||
-rw-r--r-- | src/event/MaskMonitor.hxx | 53 |
2 files changed, 89 insertions, 0 deletions
diff --git a/src/event/MaskMonitor.cxx b/src/event/MaskMonitor.cxx new file mode 100644 index 000000000..ff9cb9d47 --- /dev/null +++ b/src/event/MaskMonitor.cxx @@ -0,0 +1,36 @@ +/* + * Copyright 2003-2016 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "MaskMonitor.hxx" + +void +MaskMonitor::OrMask(unsigned new_mask) +{ + if (pending_mask.fetch_or(new_mask) == 0) + DeferredMonitor::Schedule(); +} + +void +MaskMonitor::RunDeferred() +{ + const unsigned mask = pending_mask.exchange(0); + if (mask != 0) + HandleMask(mask); +} diff --git a/src/event/MaskMonitor.hxx b/src/event/MaskMonitor.hxx new file mode 100644 index 000000000..db6803bbf --- /dev/null +++ b/src/event/MaskMonitor.hxx @@ -0,0 +1,53 @@ +/* + * Copyright 2003-2016 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_EVENT_MASK_MONITOR_HXX +#define MPD_EVENT_MASK_MONITOR_HXX + +#include "check.h" +#include "DeferredMonitor.hxx" + +#include <atomic> + +/** + * Manage a bit mask of events that have occurred. Every time the + * mask becomes non-zero, OnMask() is called in #EventLoop's thread. + * + * This class is thread-safe. + */ +class MaskMonitor : DeferredMonitor { + std::atomic_uint pending_mask; + +public: + explicit MaskMonitor(EventLoop &_loop) + :DeferredMonitor(_loop), pending_mask(0) {} + + using DeferredMonitor::GetEventLoop; + using DeferredMonitor::Cancel; + + void OrMask(unsigned new_mask); + +protected: + virtual void HandleMask(unsigned mask) = 0; + + /* virtual methode from class DeferredMonitor */ + void RunDeferred() override; +}; + +#endif |