tsocket: make use of tevent_queue_add_optimize_empty() to optimize for the empty...
authorStefan Metzmacher <metze@samba.org>
Thu, 28 Jul 2011 08:37:51 +0000 (10:37 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 9 Aug 2011 14:17:11 +0000 (16:17 +0200)
metze

lib/tsocket/tsocket_helpers.c

index db6b6148e959e26a4b23c64628ffaa66325a989c..7ee4cef06ca88306142d3117b5d04ffa4d0e7c0c 100644 (file)
@@ -52,7 +52,7 @@ struct tevent_req *tdgram_sendto_queue_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req;
        struct tdgram_sendto_queue_state *state;
-       bool ok;
+       struct tevent_queue_entry *e;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct tdgram_sendto_queue_state);
@@ -67,21 +67,25 @@ struct tevent_req *tdgram_sendto_queue_send(TALLOC_CTX *mem_ctx,
        state->caller.dst       = dst;
        state->ret              = -1;
 
-       ok = tevent_queue_add(queue,
-                             ev,
-                             req,
-                             tdgram_sendto_queue_trigger,
-                             NULL);
-       if (!ok) {
-               tevent_req_oom(req);
-               goto post;
+       /*
+        * we use tevent_queue_add_optimize_empty() with allow_direct
+        * in order to optimize for the empty queue case.
+        */
+       e = tevent_queue_add_optimize_empty(
+                               queue,
+                               ev,
+                               req,
+                               tdgram_sendto_queue_trigger,
+                               NULL,
+                               true);
+       if (tevent_req_nomem(e, req)) {
+               return tevent_req_post(req, ev);
+       }
+       if (!tevent_req_is_in_progress(req)) {
+               return tevent_req_post(req, ev);
        }
 
        return req;
-
- post:
-       tevent_req_post(req, ev);
-       return req;
 }
 
 static void tdgram_sendto_queue_trigger(struct tevent_req *req,
@@ -326,7 +330,7 @@ struct tevent_req *tstream_readv_pdu_queue_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req;
        struct tstream_readv_pdu_queue_state *state;
-       bool ok;
+       struct tevent_queue_entry *e;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct tstream_readv_pdu_queue_state);
@@ -340,20 +344,25 @@ struct tevent_req *tstream_readv_pdu_queue_send(TALLOC_CTX *mem_ctx,
        state->caller.next_vector_private       = next_vector_private;
        state->ret                              = -1;
 
-       ok = tevent_queue_add(queue,
-                             ev,
-                             req,
-                             tstream_readv_pdu_queue_trigger,
-                             NULL);
-       if (!ok) {
-               tevent_req_oom(req);
-               goto post;
+       /*
+        * we use tevent_queue_add_optimize_empty() with allow_direct
+        * in order to optimize for the empty queue case.
+        */
+       e = tevent_queue_add_optimize_empty(
+                               queue,
+                               ev,
+                               req,
+                               tstream_readv_pdu_queue_trigger,
+                               NULL,
+                               true);
+       if (tevent_req_nomem(e, req)) {
+               return tevent_req_post(req, ev);
+       }
+       if (!tevent_req_is_in_progress(req)) {
+               return tevent_req_post(req, ev);
        }
 
        return req;
-
- post:
-       return tevent_req_post(req, ev);
 }
 
 static void tstream_readv_pdu_queue_trigger(struct tevent_req *req,
@@ -433,7 +442,7 @@ struct tevent_req *tstream_writev_queue_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req;
        struct tstream_writev_queue_state *state;
-       bool ok;
+       struct tevent_queue_entry *e;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct tstream_writev_queue_state);
@@ -447,20 +456,25 @@ struct tevent_req *tstream_writev_queue_send(TALLOC_CTX *mem_ctx,
        state->caller.count     = count;
        state->ret              = -1;
 
-       ok = tevent_queue_add(queue,
-                             ev,
-                             req,
-                             tstream_writev_queue_trigger,
-                             NULL);
-       if (!ok) {
-               tevent_req_oom(req);
-               goto post;
+       /*
+        * we use tevent_queue_add_optimize_empty() with allow_direct
+        * in order to optimize for the empty queue case.
+        */
+       e = tevent_queue_add_optimize_empty(
+                               queue,
+                               ev,
+                               req,
+                               tstream_writev_queue_trigger,
+                               NULL,
+                               true);
+       if (tevent_req_nomem(e, req)) {
+               return tevent_req_post(req, ev);
+       }
+       if (!tevent_req_is_in_progress(req)) {
+               return tevent_req_post(req, ev);
        }
 
        return req;
-
- post:
-       return tevent_req_post(req, ev);
 }
 
 static void tstream_writev_queue_trigger(struct tevent_req *req,