View difference between Paste ID: Ps81hmXf and b3fJQFKP
SHOW: | | - or go back to the newest paste.
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
 }