[Groonga-commit] groonga/groonga [master] Swapped the role of body and ctx->outbuf.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 6月 8日 (火) 21:58:15 JST


Daijiro MORI	2010-06-08 12:58:15 +0000 (Tue, 08 Jun 2010)

  New Revision: d4bfb2e61b9a68f34d6e81acf2753956d3fb43f0

  Log:
    Swapped the role of body and ctx->outbuf.

  Modified files:
    src/groonga.c

  Modified: src/groonga.c (+46 -46)
===================================================================
--- src/groonga.c    2010-06-08 04:06:39 +0000 (3bdc204)
+++ src/groonga.c    2010-06-08 12:58:15 +0000 (e841f5d)
@@ -360,6 +360,7 @@ parse_htpath(const char *p, const char *pe,
 static void
 do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
 {
+  grn_sock fd = msg->u.fd;
   grn_http_request_type t = grn_http_request_type_none;
   grn_com_header *header = &msg->header;
   switch (header->qtype) {
@@ -408,7 +409,6 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
         grn_timeval_now(ctx, &ctx->impl->tv); /* should be initialized in grn_ctx_qe_exec() */
         GRN_LOG(ctx, GRN_LOG_NONE, "%08x|>%.*s", (intptr_t)ctx, pathe - path, path);
         GRN_TEXT_INIT(&key, 0);
-        GRN_BULK_REWIND(body);
 
         g = grn_text_urldec(ctx, &key, path + 1, pathe, '?');
         if (!GRN_TEXT_LEN(&key)) { GRN_TEXT_SETS(ctx, &key, INDEX_HTML); }
@@ -437,7 +437,7 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
             grn_obj_reinit(ctx, val, GRN_DB_INT32, 0);
             GRN_INT32_SET(ctx, val, (int32_t)ot);
           }
-          grn_ctx_push(ctx, body);
+          grn_ctx_push(ctx, ctx->impl->outbuf);
           expr_rc = grn_expr_exec(ctx, expr, 1);
           val = grn_ctx_pop(ctx);
           grn_expr_clear_vars(ctx, expr);
@@ -448,7 +448,7 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
             GRN_TEXT_SET(ctx, val,
                          GRN_TEXT_VALUE(&key), filename_end - GRN_TEXT_VALUE(&key));
           }
-          grn_ctx_push(ctx, body);
+          grn_ctx_push(ctx, ctx->impl->outbuf);
           expr_rc = grn_expr_exec(ctx, expr, 1);
           val = grn_ctx_pop(ctx);
           grn_expr_clear_vars(ctx, expr);
@@ -457,55 +457,62 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
       }
       /* TODO: Content-Length */
       if (!expr_rc) {
-        GRN_TEXT_SETS(ctx, ctx->impl->outbuf, "HTTP/1.1 200 OK\r\n");
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Connection: close\r\n");
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Content-Type: ");
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, mime_type);
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "\r\nContent-Length: ");
+        GRN_TEXT_SETS(ctx, body, "HTTP/1.1 200 OK\r\n");
+        GRN_TEXT_PUTS(ctx, body, "Connection: close\r\n");
+        GRN_TEXT_PUTS(ctx, body, "Content-Type: ");
+        GRN_TEXT_PUTS(ctx, body, mime_type);
+        GRN_TEXT_PUTS(ctx, body, "\r\nContent-Length: ");
         if (GRN_TEXT_LEN(&jsonp_func)) {
-          grn_text_lltoa(ctx, ctx->impl->outbuf,
-                         GRN_TEXT_LEN(body) + GRN_TEXT_LEN(&jsonp_func) + 3);
-          GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "\r\n\r\n");
-          GRN_TEXT_PUT(ctx, ctx->impl->outbuf, GRN_TEXT_VALUE(&jsonp_func), GRN_TEXT_LEN(&jsonp_func));
-          GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '(');
-          GRN_TEXT_PUT(ctx, ctx->impl->outbuf, GRN_TEXT_VALUE(body), GRN_TEXT_LEN(body));
-          GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, ");");
+          grn_text_lltoa(ctx, body,
+                         GRN_TEXT_LEN(ctx->impl->outbuf) + GRN_TEXT_LEN(&jsonp_func) + 3);
+          GRN_TEXT_PUTS(ctx, body, "\r\n\r\n");
+          GRN_TEXT_PUT(ctx, body, GRN_TEXT_VALUE(&jsonp_func), GRN_TEXT_LEN(&jsonp_func));
+          GRN_TEXT_PUTC(ctx, body, '(');
+          GRN_TEXT_PUT(ctx, body, GRN_TEXT_VALUE(ctx->impl->outbuf),
+                       GRN_TEXT_LEN(ctx->impl->outbuf));
+          GRN_TEXT_PUTS(ctx, body, ");");
         } else {
-          grn_text_lltoa(ctx, ctx->impl->outbuf, GRN_TEXT_LEN(body));
-          GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "\r\n\r\n");
-          GRN_TEXT_PUT(ctx, ctx->impl->outbuf, GRN_TEXT_VALUE(body), GRN_TEXT_LEN(body));
+          grn_text_lltoa(ctx, body, GRN_TEXT_LEN(ctx->impl->outbuf));
+          GRN_TEXT_PUTS(ctx, body, "\r\n\r\n");
+          GRN_TEXT_PUT(ctx, body, GRN_TEXT_VALUE(ctx->impl->outbuf),
+                       GRN_TEXT_LEN(ctx->impl->outbuf));
         }
       } else {
         if (expr_rc == GRN_NO_SUCH_FILE_OR_DIRECTORY) {
-          GRN_TEXT_SETS(ctx, ctx->impl->outbuf, "HTTP/1.1 404 Not Found\r\n");
+          GRN_TEXT_SETS(ctx, body, "HTTP/1.1 404 Not Found\r\n");
         } else {
-          GRN_TEXT_SETS(ctx, ctx->impl->outbuf, "HTTP/1.1 500 Internal Server Error\r\n");
+          GRN_TEXT_SETS(ctx, body, "HTTP/1.1 500 Internal Server Error\r\n");
         }
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Content-Type: application/json\r\n\r\n");
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "[[");
-        grn_text_itoa(ctx, ctx->impl->outbuf, expr_rc);
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, ",0,0");
+        GRN_TEXT_PUTS(ctx, body, "Content-Type: application/json\r\n\r\n");
+        GRN_TEXT_PUTS(ctx, body, "[[");
+        grn_text_itoa(ctx, body, expr_rc);
+        GRN_TEXT_PUTS(ctx, body, ",0,0");
         if (ctx->errbuf && strlen(ctx->errbuf)) {
-          GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
-          grn_text_esc(ctx, ctx->impl->outbuf, ctx->errbuf, strlen(ctx->errbuf));
+          GRN_TEXT_PUTC(ctx, body, ',');
+          grn_text_esc(ctx, body, ctx->errbuf, strlen(ctx->errbuf));
           if (ctx->errfunc && ctx->errfile) {
             /* TODO: output backtrace */
-            GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, ",[[");
-            grn_text_esc(ctx, ctx->impl->outbuf, ctx->errfunc, strlen(ctx->errfile));
-            GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
-            grn_text_esc(ctx, ctx->impl->outbuf, ctx->errfile, strlen(ctx->errfile));
-            GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
-            grn_text_itoa(ctx, ctx->impl->outbuf, ctx->errline);
-            GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "]]");
+            GRN_TEXT_PUTS(ctx, body, ",[[");
+            grn_text_esc(ctx, body, ctx->errfunc, strlen(ctx->errfile));
+            GRN_TEXT_PUTC(ctx, body, ',');
+            grn_text_esc(ctx, body, ctx->errfile, strlen(ctx->errfile));
+            GRN_TEXT_PUTC(ctx, body, ',');
+            grn_text_itoa(ctx, body, ctx->errline);
+            GRN_TEXT_PUTS(ctx, body, "]]");
           }
         }
-        GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "]]");
+        GRN_TEXT_PUTS(ctx, body, "]]");
       }
       GRN_OBJ_FIN(ctx, &jsonp_func);
       if (ctx->stat == GRN_CTX_QUITTING) { ctx->stat = GRN_CTX_QUIT; }
       if (ctx->impl->output) {
         ctx->impl->output(ctx, 0, ctx->impl->data.ptr);
       }
+      if (send(fd, GRN_BULK_HEAD(body), GRN_BULK_VSIZE(body), MSG_NOSIGNAL) == -1) {
+        SERR("send");
+      }
+      GRN_BULK_REWIND(body);
+      GRN_BULK_REWIND(ctx->impl->outbuf);
       {
         uint64_t et;
         grn_timeval tv;
@@ -519,6 +526,10 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body)
 exit :
   // todo : support "Connection: keep-alive"
   ctx->stat = GRN_CTX_QUIT;
+  /* if (ctx->rc != GRN_OPERATION_WOULD_BLOCK) {...} */
+  grn_msg_close(ctx, (grn_obj *)msg);
+  /* if not keep alive connection */
+  grn_sock_close(fd);
 }
 
 enum {
@@ -1101,9 +1112,7 @@ h_worker(void *arg)
   GRN_LOG(&grn_gctx, GRN_LOG_NOTICE, "thread start (%d/%d)", nfthreads, nthreads + 1);
   MUTEX_LOCK(q_mutex);
   do {
-    grn_sock fd;
-    ssize_t ret;
-    grn_obj *msg, *out;
+    grn_obj *msg;
     nfthreads++;
     while (!(msg = (grn_obj *)grn_com_queue_deque(&grn_gctx, &ctx_new))) {
       COND_WAIT(q_cond, q_mutex);
@@ -1111,16 +1120,7 @@ h_worker(void *arg)
     }
     nfthreads--;
     MUTEX_UNLOCK(q_mutex);
-    fd = ((grn_msg *)msg)->u.fd;
     do_htreq(ctx, (grn_msg *)msg, &body);
-    out = ctx->impl->outbuf;
-    ret = send(fd, GRN_BULK_HEAD(out), GRN_BULK_VSIZE(out), MSG_NOSIGNAL);
-    if (ret == -1) { SERR("send"); }
-    GRN_BULK_REWIND(out);
-    /* if (ctx->rc != GRN_OPERATION_WOULD_BLOCK) {...} */
-    grn_msg_close(ctx, msg);
-    /* if not keep alive connection */
-    grn_sock_close(fd);
     MUTEX_LOCK(q_mutex);
   } while (nfthreads < max_nfthreads && grn_gctx.stat != GRN_CTX_QUIT);
 exit :




Groonga-commit メーリングリストの案内
Back to archive index