From 829616534e0cd560bda55252b54d497c76ef77c1 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 17 Jun 2016 18:20:11 +0200 Subject: [PATCH] event/DeferredCall: new class supposed to replace DeferredMonitor Comes with a callback pointer instead of a virtual method, which allows multiple instances in one class. --- Makefile.am | 1 + src/event/DeferredCall.hxx | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/event/DeferredCall.hxx diff --git a/Makefile.am b/Makefile.am index 543b9e71f..87c8dd0ff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -494,6 +494,7 @@ libevent_a_SOURCES = \ src/event/TimeoutMonitor.hxx src/event/TimeoutMonitor.cxx \ src/event/IdleMonitor.hxx src/event/IdleMonitor.cxx \ src/event/DeferredMonitor.hxx src/event/DeferredMonitor.cxx \ + src/event/DeferredCall.hxx \ src/event/MaskMonitor.hxx src/event/MaskMonitor.cxx \ src/event/SocketMonitor.cxx src/event/SocketMonitor.hxx \ src/event/BufferedSocket.cxx src/event/BufferedSocket.hxx \ diff --git a/src/event/DeferredCall.hxx b/src/event/DeferredCall.hxx new file mode 100644 index 000000000..170894d84 --- /dev/null +++ b/src/event/DeferredCall.hxx @@ -0,0 +1,50 @@ +/* + * 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_DEFERRED_CALL_HXX +#define MPD_EVENT_DEFERRED_CALL_HXX + +#include "check.h" +#include "DeferredMonitor.hxx" +#include "util/BindMethod.hxx" + +/** + * Invoke a method call in the #EventLoop. + * + * This class is thread-safe. + */ +class DeferredCall final : DeferredMonitor { + typedef BoundMethod Callback; + const Callback callback; + +public: + DeferredCall(EventLoop &_loop, Callback _callback) + :DeferredMonitor(_loop), callback(_callback) {} + + using DeferredMonitor::GetEventLoop; + using DeferredMonitor::Schedule; + using DeferredMonitor::Cancel; + +protected: + void RunDeferred() override { + callback(); + } +}; + +#endif