]> granicus.if.org Git - libevent/commitdiff
Roughly 20% speed increase when line-draining a buffer using EVBUFFER_EOL_CRLF
authorMina Naguib <mina.git@naguib.ca>
Tue, 31 May 2011 17:56:56 +0000 (13:56 -0400)
committerMina Naguib <mina.git@naguib.ca>
Tue, 31 May 2011 17:56:56 +0000 (13:56 -0400)
buffer.c

index 9d6ffc102b032dfef8b331b1856696bc35a74ee5..16cb2c90c2b145fd8459d04bf0dec209aeda6f7e 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -1373,21 +1373,17 @@ evbuffer_search_eol(struct evbuffer *buffer,
                break;
        }
        case EVBUFFER_EOL_CRLF:
-               while (1) {
-                       if (evbuffer_find_eol_char(&it) < 0)
-                               goto done;
-                       if (evbuffer_getchr(&it) == '\n') {
-                               extra_drain = 1;
-                               break;
-                       } else if (!evbuffer_ptr_memcmp(
-                                   buffer, &it, "\r\n", 2)) {
-                               extra_drain = 2;
-                               break;
-                       } else {
-                               if (evbuffer_ptr_set(buffer, &it, 1,
-                                       EVBUFFER_PTR_ADD)<0)
-                                       goto done;
-                       }
+               // Is a LF
+               if (evbuffer_strchr(&it, '\n') < 0)
+                       goto done;
+               extra_drain = 1;
+               // Optionally preceeded by a CR
+               if (it.pos < 1) break;
+               memcpy(&it2, &it, sizeof(it));
+               if (evbuffer_ptr_set(buffer, &it2, it2.pos - 1, EVBUFFER_PTR_SET)<0) break;
+               if (evbuffer_getchr(&it2) == '\r') {
+                       memcpy(&it, &it2, sizeof(it));
+                       extra_drain = 2;
                }
                break;
        case EVBUFFER_EOL_LF: