Commit eda06993 authored by Max Kellermann's avatar Max Kellermann

event/MultiSocketMonitor: add method Reset()

parent 4b30ef1c
...@@ -31,9 +31,15 @@ MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop) ...@@ -31,9 +31,15 @@ MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop)
:IdleMonitor(_loop), TimeoutMonitor(_loop) { :IdleMonitor(_loop), TimeoutMonitor(_loop) {
} }
MultiSocketMonitor::~MultiSocketMonitor() void
MultiSocketMonitor::Reset()
{ {
// TODO assert(GetEventLoop().IsInsideOrNull());
fds.clear();
IdleMonitor::Cancel();
TimeoutMonitor::Cancel();
ready = refresh = false;
} }
void void
......
...@@ -119,11 +119,26 @@ public: ...@@ -119,11 +119,26 @@ public:
static constexpr unsigned HANGUP = SocketMonitor::HANGUP; static constexpr unsigned HANGUP = SocketMonitor::HANGUP;
MultiSocketMonitor(EventLoop &_loop); MultiSocketMonitor(EventLoop &_loop);
~MultiSocketMonitor();
using IdleMonitor::GetEventLoop; using IdleMonitor::GetEventLoop;
public: /**
* Clear the socket list and disable all #EventLoop
* registrations. Run this in the #EventLoop thread before
* destroying this object.
*
* Later, this object can be reused and reactivated by calling
* InvalidateSockets().
*
* Note that this class doesn't have a destructor which calls
* this method, because this would be racy and thus pointless:
* at the time ~MultiSocketMonitor() is called, our virtual
* methods have been morphed to be pure again, and in the
* meantime the #EventLoop thread could invoke those pure
* methods.
*/
void Reset();
/** /**
* Invalidate the socket list. A call to PrepareSockets() is * Invalidate the socket list. A call to PrepareSockets() is
* scheduled which will then update the list. * scheduled which will then update the list.
......
...@@ -98,12 +98,8 @@ public: ...@@ -98,12 +98,8 @@ public:
} }
~AlsaInputStream() { ~AlsaInputStream() {
/* ClearSocketList must be called from within the
IOThread; if we don't do it manually here, the
~MultiSocketMonitor() will do it in the current
thread */
BlockingCall(MultiSocketMonitor::GetEventLoop(), [this](){ BlockingCall(MultiSocketMonitor::GetEventLoop(), [this](){
ClearSocketList(); MultiSocketMonitor::Reset();
}); });
snd_pcm_close(capture_handle); snd_pcm_close(capture_handle);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment