Mercurial > prosody-hg
comparison net/server_event.lua @ 4962:1d8fb12a9b2d
net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 22 Jul 2012 16:54:33 +0100 |
| parents | 32b638a8da5b |
| children | 724848dfde36 |
comparison
equal
deleted
inserted
replaced
| 4961:29b24a4028ed | 4962:1d8fb12a9b2d |
|---|---|
| 247 self:_lock( false, true, true ) -- unlock read/write events, but keep interface locked | 247 self:_lock( false, true, true ) -- unlock read/write events, but keep interface locked |
| 248 self.eventhandshake = addevent( base, self.conn, EV_READWRITE, handshakecallback, cfg.HANDSHAKE_TIMEOUT ) | 248 self.eventhandshake = addevent( base, self.conn, EV_READWRITE, handshakecallback, cfg.HANDSHAKE_TIMEOUT ) |
| 249 return true | 249 return true |
| 250 end | 250 end |
| 251 function interface_mt:_destroy() -- close this interface + events and call last listener | 251 function interface_mt:_destroy() -- close this interface + events and call last listener |
| 252 debug( "closing client with id:", self.id ) | 252 debug( "closing client with id:", self.id, self.fatalerror ) |
| 253 self:_lock( true, true, true ) -- first of all, lock the interface to avoid further actions | 253 self:_lock( true, true, true ) -- first of all, lock the interface to avoid further actions |
| 254 local _ | 254 local _ |
| 255 _ = self.eventread and self.eventread:close( ) -- close events; this must be called outside of the event callbacks! | 255 _ = self.eventread and self.eventread:close( ) -- close events; this must be called outside of the event callbacks! |
| 256 if self.type == "client" then | 256 if self.type == "client" then |
| 257 _ = self.eventwrite and self.eventwrite:close( ) | 257 _ = self.eventwrite and self.eventwrite:close( ) |
| 326 --vdebug( "register new write event" ) | 326 --vdebug( "register new write event" ) |
| 327 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) | 327 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) |
| 328 end | 328 end |
| 329 return true | 329 return true |
| 330 end | 330 end |
| 331 function interface_mt:close(now) | 331 function interface_mt:close() |
| 332 if self.nointerface then return nil, "locked"; end | 332 if self.nointerface then return nil, "locked"; end |
| 333 debug( "try to close client connection with id:", self.id ) | 333 debug( "try to close client connection with id:", self.id ) |
| 334 if self.type == "client" then | 334 if self.type == "client" then |
| 335 self.fatalerror = "client to close" | 335 self.fatalerror = "client to close" |
| 336 if ( not self.eventwrite ) or now then -- try to close immediately | 336 if self.eventwrite then -- wait for incomplete write request |
| 337 self:_lock( true, true, false ) | |
| 338 debug "closing delayed until writebuffer is empty" | |
| 339 return nil, "writebuffer not empty, waiting" | |
| 340 else -- close now | |
| 337 self:_lock( true, true, true ) | 341 self:_lock( true, true, true ) |
| 338 self:_close() | 342 self:_close() |
| 339 return true | 343 return true |
| 340 else -- wait for incomplete write request | |
| 341 self:_lock( true, true, false ) | |
| 342 debug "closing delayed until writebuffer is empty" | |
| 343 return nil, "writebuffer not empty, waiting" | |
| 344 end | 344 end |
| 345 else | 345 else |
| 346 debug( "try to close server with id:", tostring(self.id), "args:", tostring(now) ) | 346 debug( "try to close server with id:", tostring(self.id)) |
| 347 self.fatalerror = "server to close" | 347 self.fatalerror = "server to close" |
| 348 self:_lock( true ) | 348 self:_lock( true ) |
| 349 self:_close( 0 ) -- add new event to remove the server interface | 349 self:_close( 0 ) -- add new event to remove the server interface |
| 350 return true | 350 return true |
| 351 end | 351 end |
