yerden

ev.c patch

Oct 2nd, 2016
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/lib/libsts_evloop/sts_ev.c b/lib/libsts_evloop/sts_ev.c
  2. index 173e4fe..de45e7e 100644
  3. --- a/lib/libsts_evloop/sts_ev.c
  4. +++ b/lib/libsts_evloop/sts_ev.c
  5. @@ -206,31 +206,30 @@ send_cb(EV_P, ev_io *w, int revents)
  6.     p[0] = w->fd;
  7.     p[1] = MSG_NOSIGNAL;
  8.  
  9. -   while ((buf = sts_fifo_last(conn->buf_txq)) != NULL) {
  10. -       written = sts_ring_buffer_send(buf, send_buffer, p, NULL);
  11. +   if ((buf = sts_fifo_get(conn->buf_txq)) == NULL) {
  12. +       /* No data to send */
  13. +       ev_io_stop(loop, w);
  14.  
  15. -       if (written == -1) {
  16. -           if (IO_IS_BLOCKED())
  17. -               break;
  18. +       /* return if read watcher is on, otherwise ... */
  19. +       if (! ev_is_active(&conn->rd))
  20. +           goto shut_conn;
  21. +   } else {
  22. +       written = sts_ring_buffer_send(buf, send_buffer, p, NULL);
  23.  
  24. +       if (written > 0) {
  25. +           /* buffer drained */
  26. +           ring_buffer_put(mp, buf);
  27. +       } else if (written < 0 && ! IO_IS_BLOCKED()) {
  28. +           /* unfixable error */
  29.             perror("send");
  30.             goto shut_conn;
  31. +       } else {
  32. +           /* buffer is not empty */
  33. +           sts_fifo_return(conn->buf_txq, buf);
  34.         }
  35. -
  36. -       if (sts_ring_buffer_used(buf))
  37. -           break;
  38. -
  39. -       buf = sts_fifo_get(conn->buf_txq);
  40. -       ring_buffer_put(mp, buf);
  41.     }
  42.  
  43. -   /* If nothing to send, stop watching */
  44. -   if (sts_fifo_last(conn->buf_txq) == NULL)
  45. -       ev_io_stop(loop, w);
  46. -
  47. -   /* return if read watcher is on, otherwise ... */
  48. -   if (ev_is_active(&conn->rd))
  49. -       return;
  50. +   return;
  51.  
  52.     /* ... connection is to shut down */
  53.  shut_conn:
  54. diff --git a/lib/libsts_evloop/sts_tcpsrv.c b/lib/libsts_evloop/sts_tcpsrv.c
  55. index 390b781..d034ce0 100644
  56. --- a/lib/libsts_evloop/sts_tcpsrv.c
  57. +++ b/lib/libsts_evloop/sts_tcpsrv.c
  58. @@ -346,21 +346,18 @@ sts_evloop_srv_send(void *arg, const void *data, size_t len)
  59.  
  60.     buf = sts_fifo_last(conn->buf_txq);
  61.     for (written = 0; written < len; written += ret) {
  62. -       if (buf == NULL) {
  63. +       if (buf == NULL || sts_ring_buffer_unused(buf) == 0) {
  64. +           /* no buffer or full buffer */
  65.             if ((buf = ring_buffer_get(mp)) == NULL)
  66.                 break;
  67.             if (sts_fifo_put(conn->buf_txq, buf) == 0)
  68.                 break;
  69.         }
  70.         ret = sts_ring_buffer_add(buf, p + written, len - written);
  71. -       if (ret == 0)
  72. -           /* full buffer */
  73. -           buf = NULL;
  74.     }
  75.  
  76. -   if (written) {
  77. +   if (written)
  78.         ev_io_start(conn->srv->evl, &conn->wr);
  79. -   }
  80.  
  81.     return written;
  82.  }
Add Comment
Please, Sign In to add comment