aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable/lib/action_cable/connection/faye_event_loop.rb
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2016-03-04 05:31:48 +1030
committerMatthew Draper <matthew@trebex.net>2016-03-04 05:31:48 +1030
commitbbba0649f529626a076c4247047b60cfbe86d5e4 (patch)
treecdbf52c160399441574d1f13dd6587ee504e002d /actioncable/lib/action_cable/connection/faye_event_loop.rb
parentcd73632d9d47752013f46e775e59241215cfd8e9 (diff)
parenta373be9da45d4bee684ea03420212780ec1ef4b1 (diff)
downloadrails-bbba0649f529626a076c4247047b60cfbe86d5e4.tar.gz
rails-bbba0649f529626a076c4247047b60cfbe86d5e4.tar.bz2
rails-bbba0649f529626a076c4247047b60cfbe86d5e4.zip
Merge pull request #23992 from matthewd/em-option
Support faye-websocket + EventMachine as an option
Diffstat (limited to 'actioncable/lib/action_cable/connection/faye_event_loop.rb')
-rw-r--r--actioncable/lib/action_cable/connection/faye_event_loop.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/actioncable/lib/action_cable/connection/faye_event_loop.rb b/actioncable/lib/action_cable/connection/faye_event_loop.rb
new file mode 100644
index 0000000000..8b70f3d84e
--- /dev/null
+++ b/actioncable/lib/action_cable/connection/faye_event_loop.rb
@@ -0,0 +1,44 @@
+require 'thread'
+
+require 'eventmachine'
+EventMachine.epoll if EventMachine.epoll?
+EventMachine.kqueue if EventMachine.kqueue?
+
+module ActionCable
+ module Connection
+ class FayeEventLoop
+ @@mutex = Mutex.new
+
+ def timer(interval, &block)
+ ensure_reactor_running
+ EMTimer.new(::EM::PeriodicTimer.new(interval, &block))
+ end
+
+ def post(task = nil, &block)
+ task ||= block
+
+ ensure_reactor_running
+ ::EM.next_tick(&task)
+ end
+
+ private
+ def ensure_reactor_running
+ return if EventMachine.reactor_running?
+ @@mutex.synchronize do
+ Thread.new { EventMachine.run } unless EventMachine.reactor_running?
+ Thread.pass until EventMachine.reactor_running?
+ end
+ end
+
+ class EMTimer
+ def initialize(inner)
+ @inner = inner
+ end
+
+ def shutdown
+ inner.cancel
+ end
+ end
+ end
+ end
+end