util.roster: Initial skeleton commit
[prosody.git] / net / server_select.lua
index 9bc112bbc08724b416821ff801741b37c4a8a7bf..298e560aa00cc6a5ab2eebde12b7b53634641a08 100644 (file)
@@ -343,9 +343,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        _closelist[ handler ] = nil
                        handler = nil
                end
-       if server then
-               server.remove( )
-       end
+               if server then
+                       server.remove( )
+               end
                out_put "server.lua: closed client handler and removed socket from list"
                return true
        end
@@ -479,11 +479,11 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        bufferqueuelen = 0
                        bufferlen = 0
                        _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist
-                       _ = needtls and handler:starttls(nil, true)
                        _writetimes[ handler ] = nil
                        if drain then
                                drain(handler)
                        end
+                       _ = needtls and handler:starttls(nil, true)
                        _ = toclose and handler:close( )
                        return true
                elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write
@@ -629,7 +629,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        listeners.onconnect(handler);
                        handler.sendbuffer = _sendbuffer;
                        if bufferqueuelen > 0 then
-                               return _senddbuffer();
+                               return _sendbuffer();
                        end
                end
        end
@@ -675,6 +675,28 @@ closesocket = function( socket )
        --mem_free( )
 end
 
+local function link(sender, receiver, buffersize)
+       sender:set_mode(buffersize);
+       local sender_locked;
+       local _sendbuffer = receiver.sendbuffer;
+       function receiver.sendbuffer()
+               _sendbuffer();
+               if sender_locked and receiver.bufferlen() < buffersize then
+                       sender:lock_read(false); -- Unlock now
+                       sender_locked = nil;
+               end
+       end
+       
+       local _readbuffer = sender.readbuffer;
+       function sender.readbuffer()
+               _readbuffer();
+               if not sender_locked and receiver.bufferlen() >= buffersize then
+                       sender_locked = true;
+                       sender:lock_read(true);
+               end
+       end
+end
+
 ----------------------------------// PUBLIC //--
 
 addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server
@@ -898,6 +920,7 @@ return {
        wrapclient = wrapclient,
        
        loop = loop,
+       link = link,
        stats = stats,
        closeall = closeall,
        addtimer = addtimer,