Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: webrtc/base/physicalsocketserver.h

Issue 2880923002: Support epoll in PhysicalSocketServer. (Closed)
Patch Set: Defer adding/removing of dispatchers while processing events. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | webrtc/base/physicalsocketserver.cc » ('j') | webrtc/base/physicalsocketserver.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/base/physicalsocketserver.h
diff --git a/webrtc/base/physicalsocketserver.h b/webrtc/base/physicalsocketserver.h
index 5f843da20c78879181f7bc09bd1fddcc26691f9c..61bb7ca3c3ed89a3748e0a88f08f530c95dabdb1 100644
--- a/webrtc/base/physicalsocketserver.h
+++ b/webrtc/base/physicalsocketserver.h
@@ -11,7 +11,13 @@
#ifndef WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
+#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX)
+#include <sys/epoll.h>
+#define WEBRTC_USE_EPOLL 1
+#endif
+
#include <memory>
+#include <set>
#include <vector>
#include "webrtc/base/nethelpers.h"
@@ -76,6 +82,7 @@ class PhysicalSocketServer : public SocketServer {
void Add(Dispatcher* dispatcher);
void Remove(Dispatcher* dispatcher);
+ void Update(Dispatcher* dispatcher);
#if defined(WEBRTC_POSIX)
// Sets the function to be executed in response to the specified POSIX signal.
@@ -96,15 +103,35 @@ class PhysicalSocketServer : public SocketServer {
private:
typedef std::vector<Dispatcher*> DispatcherList;
+ typedef std::set<Dispatcher*> DispatcherSet;
typedef std::vector<size_t*> IteratorList;
#if defined(WEBRTC_POSIX)
+ bool WaitSelect(int cms, bool process_io);
+ void AddRemovePendingDispatchers();
static bool InstallSignal(int signum, void (*handler)(int));
std::unique_ptr<PosixSignalDispatcher> signal_dispatcher_;
-#endif
+#endif // WEBRTC_POSIX
+#if defined(WEBRTC_USE_EPOLL)
+ void AddEpoll(Dispatcher* dispatcher);
+ void RemoveEpoll(Dispatcher* dispatcher);
+ void UpdateEpoll(Dispatcher* dispatcher);
+ bool WaitEpoll(int cms);
+ bool WaitPoll(int cms, Dispatcher* dispatcher);
+
+ int epoll_fd_ = INVALID_SOCKET;
+ std::vector<struct epoll_event> epoll_events_;
+#endif // WEBRTC_USE_EPOLL
+#if defined(WEBRTC_WIN)
DispatcherList dispatchers_;
IteratorList iterators_;
+#else
+ DispatcherSet dispatchers_;
+ DispatcherSet pending_add_dispatchers_;
+ DispatcherSet pending_remove_dispatchers_;
+ bool processing_dispatchers_ = false;
+#endif
Taylor Brandstetter 2017/05/30 22:05:50 This code is going to confusing to maintain if |di
joachim 2017/05/31 17:18:03 I agree. As commented before, I wanted to switch t
Signaler* signal_wakeup_;
CriticalSection crit_;
bool fWait_;
@@ -172,9 +199,9 @@ class PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> {
void MaybeRemapSendError();
uint8_t enabled_events() const { return enabled_events_; }
- void SetEnabledEvents(uint8_t events);
- void EnableEvents(uint8_t events);
- void DisableEvents(uint8_t events);
+ virtual void SetEnabledEvents(uint8_t events);
+ virtual void EnableEvents(uint8_t events);
+ virtual void DisableEvents(uint8_t events);
static int TranslateOption(Option opt, int* slevel, int* sopt);
@@ -220,13 +247,28 @@ class SocketDispatcher : public Dispatcher, public PhysicalSocket {
int Close() override;
-#if defined(WEBRTC_WIN)
+#if defined(WEBRTC_USE_EPOLL)
+ protected:
+ void StartBatchedEventUpdates();
+ void FinishBatchedEventUpdates();
+
+ void SetEnabledEvents(uint8_t events) override;
+ void EnableEvents(uint8_t events) override;
+ void DisableEvents(uint8_t events) override;
+#endif
+
private:
+#if defined(WEBRTC_WIN)
static int next_id_;
int id_;
bool signal_close_;
int signal_err_;
#endif // WEBRTC_WIN
+#if defined(WEBRTC_USE_EPOLL)
+ void MaybeUpdateDispatcher(uint8_t old_events);
+
+ int saved_enabled_events_ = -1;
+#endif
};
} // namespace rtc
« no previous file with comments | « no previous file | webrtc/base/physicalsocketserver.cc » ('j') | webrtc/base/physicalsocketserver.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698