diff options
author | Matthew Wild <mwild1@gmail.com> | 2010-05-05 15:33:58 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2010-05-05 15:33:58 +0100 |
commit | 1dce4a3033300f40a4b74b286162bab34337f9bb (patch) | |
tree | 1c819b3d1b29b20b4b275bdb6c884a1c1bd4af83 /net/server_event.lua | |
parent | 697b71895ecc7968c2cb56058abded5017ecb090 (diff) | |
parent | ec60bf9e1b50e97162097027e852ce5d0db4bdf8 (diff) | |
download | prosody-1dce4a3033300f40a4b74b286162bab34337f9bb.tar.gz prosody-1dce4a3033300f40a4b74b286162bab34337f9bb.zip |
Merge 0.7->trunk
Diffstat (limited to 'net/server_event.lua')
-rw-r--r-- | net/server_event.lua | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/net/server_event.lua b/net/server_event.lua index dde13e61..43e70a0f 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -282,8 +282,21 @@ do return nointerface, noreading, nowriting end + --TODO: Deprecate function interface_mt:lock_read(switch) - return self:_lock(self.nointerface, switch, self.nowriting); + if switch then + return self:pause(); + else + return self:resume(); + end + end + + function interface_mt:pause() + return self:_lock(self.nointerface, true, self.nowriting); + end + + function interface_mt:resume() + return self:_lock(self.nointerface, false, self.nowriting); end function interface_mt:counter(c) @@ -389,6 +402,13 @@ do self.starttls = false; -- prevent starttls() end end + + function interface_mt:set_mode(pattern) + if pattern then + self._pattern = pattern; + end + return self._pattern; + end function interface_mt:set_send(new_send) -- No-op, we always use the underlying connection's send @@ -445,6 +465,8 @@ do end function interface_mt:ontimeout() end + function interface_mt:ondrain() + end function interface_mt:onstatus() debug("server.lua: Dummy onstatus()") end @@ -525,6 +547,7 @@ do if succ then -- writing succesful interface.writebuffer = "" interface.writebufferlen = 0 + interface:ondrain(); if interface.fatalerror then debug "closing client after writing" interface:_close() -- close interface if needed @@ -586,7 +609,7 @@ do interface.eventreadtimeout = nil end end - local buffer, err, part = interface.conn:receive( pattern ) -- receive buffer with "pattern" + local buffer, err, part = interface.conn:receive( interface._pattern ) -- receive buffer with "pattern" --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) ) buffer = buffer or part or "" local len = string_len( buffer ) @@ -822,11 +845,32 @@ function hook_signal(signal_num, handler) return signal_events[signal_num]; end +local function link(sender, receiver, buffersize) + sender:set_mode(buffersize); + local sender_locked; + + function receiver:ondrain() + if sender_locked then + sender:resume(); + sender_locked = nil; + end + end + + function sender:onincoming(data) + receiver:write(data); + if receiver.writebufferlen >= buffersize then + sender_locked = true; + sender:pause(); + end + end +end + return { cfg = cfg, base = base, loop = loop, + link = link, event = event, event_base = base, addevent = newevent, |