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

Unified Diff: webrtc/base/physicalsocketserver.h

Issue 2880923002: Support epoll in PhysicalSocketServer. (Closed)
Patch Set: Win: Prevent updates to dispatcher in loop before waiting. 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') | no next file with comments »
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..dec37c256cdf8a4302c4aa3022aa70d610b49146 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.
@@ -95,16 +102,30 @@ class PhysicalSocketServer : public SocketServer {
#endif
private:
- typedef std::vector<Dispatcher*> DispatcherList;
- typedef std::vector<size_t*> IteratorList;
+ typedef std::set<Dispatcher*> DispatcherSet;
+
+ void AddRemovePendingDispatchers();
#if defined(WEBRTC_POSIX)
+ bool WaitSelect(int cms, bool process_io);
static bool InstallSignal(int signum, void (*handler)(int));
std::unique_ptr<PosixSignalDispatcher> signal_dispatcher_;
-#endif
- DispatcherList dispatchers_;
- IteratorList iterators_;
+#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
+ DispatcherSet dispatchers_;
+ DispatcherSet pending_add_dispatchers_;
+ DispatcherSet pending_remove_dispatchers_;
+ bool processing_dispatchers_ = false;
Signaler* signal_wakeup_;
CriticalSection crit_;
bool fWait_;
@@ -172,9 +193,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 +241,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') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698