diff options
author | daurnimator <quae@daurnimator.com> | 2015-01-06 20:01:59 -0500 |
---|---|---|
committer | daurnimator <quae@daurnimator.com> | 2015-01-06 20:01:59 -0500 |
commit | e6ab467ef9f3f98a3f041ab6a525321acd2707ee (patch) | |
tree | 04d093edf8ae45cd7be94face597cfc971e4c864 | |
parent | 3ce10e3af3c6d5a7447e01110f0a375f9028d953 (diff) | |
download | prosody-e6ab467ef9f3f98a3f041ab6a525321acd2707ee.tar.gz prosody-e6ab467ef9f3f98a3f041ab6a525321acd2707ee.zip |
net.cqueues: Add workaround for luaevent callback getting collected
-rw-r--r-- | net/cqueues.lua | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/cqueues.lua b/net/cqueues.lua index e82fe4ad..a67e405a 100644 --- a/net/cqueues.lua +++ b/net/cqueues.lua @@ -43,7 +43,11 @@ elseif server.event and server.base then -- server_event cq = cqueues.new(); -- Only need to listen for readable; cqueues handles everything under the hood local EV_READ = server.event.EV_READ; - server.base:addevent(cq:pollfd(), EV_READ, function(e) + local event_handle; + event_handle = server.base:addevent(cq:pollfd(), EV_READ, function(e) + -- Need to reference event_handle or this callback will get collected + -- This creates a circular reference that can only be broken if event_handle is manually :close()'d + local _ = event_handle; assert(cq:loop(0)); -- Convert a cq timeout to an acceptable timeout for luaevent local t = cq:timeout(); |