truncated send always callback on writeable
authorAndy Green <andy.green@linaro.org>
Thu, 10 Apr 2014 03:23:18 +0000 (11:23 +0800)
committerAndy Green <andy.green@linaro.org>
Thu, 10 Apr 2014 03:23:18 +0000 (11:23 +0800)
Suggested by a Windows log where leaf.jpg meets EAGAIN and after
issuing the truncated send buffer, never sends any more

https://github.com/warmcat/libwebsockets/issues/111#issuecomment-39873129

Added note in README.coding about WRITEABLE callbacks able to
be generated by lws.

Signed-off-by: Andy Green <andy.green@linaro.org>
README.coding
lib/output.c

index a34211e..333011c 100644 (file)
@@ -67,6 +67,20 @@ in the ...WRITEABLE callback.
 See the test server code for an example of how to do this.
 
 
+Do not rely on only your own WRITEABLE requests appearing
+---------------------------------------------------------
+
+Libwebsockets may generate additional LWS_CALLBACK_CLIENT_WRITEABLE events
+if it met network conditions where it had to buffer your send data internally.
+
+So your code for LWS_CALLBACK_CLIENT_WRITEABLE needs to own the decision
+about what to send, it can't assume that just because the writeable callback
+came it really is time to send something.
+
+It's quite possible you get an 'extra' writeable callback at any time and
+just need to return 0 and wait for the expected callback later.
+
+
 Closing connections from the user side
 --------------------------------------
 
index 9c98cae..7419b8e 100644 (file)
@@ -148,8 +148,9 @@ handle_truncated_send:
                        lwsl_info("***** %x partial send completed\n", wsi);
                        /* done with it, but don't free it */
                        n = real_len;
-               } else
-                       libwebsocket_callback_on_writable(
+               }
+               /* always callback on writeable */
+               libwebsocket_callback_on_writable(
                                             wsi->protocol->owning_server, wsi);
 
                return n;