<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -139,6 +139,16 @@ VALUE backend_close(VALUE self)
   return Qtrue;
 }
 
+VALUE backend_set_trace(VALUE self, VALUE state)
+{
+  backend_t *backend = NULL;
+  DATA_GET(self, backend_t, backend);
+  
+  backend-&gt;trace = (state == Qtrue);
+  
+  return state;
+}
+
 VALUE backend_set_maxfds(VALUE self, VALUE max)
 {
   struct rlimit rlim;
@@ -176,11 +186,22 @@ static void backend_free(backend_t *backend)
 VALUE backend_alloc(VALUE klass)
 {
   backend_t *backend = ALLOC_N(backend_t, 1);
-  VALUE obj = Data_Wrap_Struct(klass, NULL, backend_free, backend);
+  VALUE obj = Data_Wrap_Struct(klass, NULL, backend_free, backend);  
+  
+  backend-&gt;address = NULL;
+  backend-&gt;port    = 3000;
+  backend-&gt;fd      = -1;
+  backend-&gt;open    = 0;
+  
+  backend-&gt;trace   = 0;
+  
+  backend-&gt;obj     = obj;
+  backend-&gt;app     = Qnil;
   
   connections_init(backend);
+  backend-&gt;thread_count = 0;
   
-  backend-&gt;obj = obj;
+  backend-&gt;loop    = NULL;
   
   return obj;
 }
@@ -195,6 +216,7 @@ void backend_define(void)
   rb_define_protected_method(cBackend, &quot;listen_on_port&quot;, backend_listen_on_port, 2);
   rb_define_protected_method(cBackend, &quot;loop!&quot;, backend_loop, 0);
   rb_define_protected_method(cBackend, &quot;close&quot;, backend_close, 0);
+  rb_define_protected_method(cBackend, &quot;trace=&quot;, backend_set_trace, 1);
   rb_define_protected_method(cBackend, &quot;maxfds=&quot;, backend_set_maxfds, 1);
   rb_define_protected_method(cBackend, &quot;maxfds&quot;, backend_get_maxfds, 0);
 }</diff>
      <filename>ext/thin_backend/backend.c</filename>
    </modified>
    <modified>
      <diff>@@ -9,8 +9,7 @@
 
 static void connection_writable_cb(EV_P_ struct ev_io *watcher, int revents)
 {
-  connection_t *c = get_ev_data(connection, watcher, write);
-  int           sent;
+  connection_t *c = get_ev_data(connection, watcher, write);  
   
   if (EV_ERROR &amp; revents) {
     connection_error(c, &quot;Error writing on connection socket&quot;);
@@ -20,11 +19,13 @@ static void connection_writable_cb(EV_P_ struct ev_io *watcher, int revents)
   if (c-&gt;write_buffer.len == 0)
     return;
   
-  sent = send(c-&gt;fd,
-              (char *) c-&gt;write_buffer.ptr + c-&gt;write_buffer.offset,
-              c-&gt;write_buffer.len - c-&gt;write_buffer.offset,
-              0);
+  size_t sent;
+  size_t len = c-&gt;write_buffer.len - c-&gt;write_buffer.offset;
+  char  *buf = (char *) c-&gt;write_buffer.ptr + c-&gt;write_buffer.offset;
   
+  trace(c-&gt;backend, buf, len);
+  
+  sent = send(c-&gt;fd, buf, len, 0);
   ev_timer_again(c-&gt;loop, &amp;c-&gt;timeout_watcher);
   
   if (sent &lt; 0) {
@@ -39,7 +40,8 @@ static void connection_writable_cb(EV_P_ struct ev_io *watcher, int revents)
     /* if all the buffer is written we can clear it from memory */
     buffer_reset(&amp;c-&gt;write_buffer);
     
-    /* we can stream the request, so do do close it unless it's marked */
+    /* we can stream the request, so do not close it unless it's marked
+     * as finished */
     if (c-&gt;finished)
       connection_close(c);
   }
@@ -54,7 +56,7 @@ void connection_watch_writable(connection_t *c)
 static void connection_readable_cb(EV_P_ struct ev_io *watcher, int revents)
 {
   connection_t *c = get_ev_data(connection, watcher, read);
-  size_t        n;
+  size_t        received;
   char          buf[BUFFER_CHUNK_SIZE];
   
   if (EV_ERROR &amp; revents) {
@@ -62,21 +64,23 @@ static void connection_readable_cb(EV_P_ struct ev_io *watcher, int revents)
     return;
   }
   
-  n = recv(c-&gt;fd, buf, BUFFER_CHUNK_SIZE, 0);
+  received = recv(c-&gt;fd, buf, BUFFER_CHUNK_SIZE, 0);
   ev_timer_again(c-&gt;loop, &amp;c-&gt;timeout_watcher);
   
-  if (n == -1) {
+  if (received == -1) {
     /* error, closing connection */
     connection_errno(c);
     return;
   }
   
-  if (n == 0) {
+  if (received == 0) {
     /* received 0 byte, read again next loop */
     return;
   }
   
-  request_parse(c, buf, n);
+  trace(c-&gt;backend, buf, received);
+  
+  request_parse(c, buf, received);
 }
 
 static void connection_timeout_cb(EV_P_ struct ev_timer *watcher, int revents)</diff>
      <filename>ext/thin_backend/connection.c</filename>
    </modified>
    <modified>
      <diff>@@ -13,10 +13,4 @@
 #define DATA_GET(from,type,name) Data_Get_Struct(from,type,name); RAISE_NOT_NULL(name);
 #define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, &quot;Wrong argument type for &quot; # V &quot; required &quot; # T);
 
-#ifdef DEBUG
-#define trace(msg) fprintf(stderr, &quot;[%s:%s:%d] %s\n&quot;, __FILE__, __FUNCTION__, __LINE__, msg)
-#else
-#define trace(msg) 
-#endif
-
 #endif</diff>
      <filename>ext/thin_backend/ext_help.h</filename>
    </modified>
    <modified>
      <diff>@@ -81,9 +81,12 @@ struct backend_s {
   char               *address;
   unsigned            port;
   int                 fd;
-  unsigned            open;
+  unsigned            open : 1;
   struct sockaddr_in  local_addr;
   
+  /* debugging */
+  unsigned            trace : 1;
+  
   /* ruby */
   VALUE               obj; /* Ruby Backend object */
   VALUE               app; /* Rack app */
@@ -113,6 +116,8 @@ struct backend_s {
 
 #define log_errno(b) log_error(b, strerror(errno))
 
+#define trace(b, msg, len) if (b-&gt;trace) { rb_funcall(b-&gt;obj, rb_intern(&quot;trace&quot;), 1, rb_str_new(msg, len)); }
+
 extern VALUE cStringIO;
 extern VALUE sInternedCall;
 extern VALUE sInternedKeys;</diff>
      <filename>ext/thin_backend/thin.h</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,8 @@ module Thin
       def config
         self.maxfds = @maximum_connections
         @maximum_connections = maxfds
+        
+        self.trace = Logging.trace?
       end
     
       def running?</diff>
      <filename>lib/thin/backends/turbo.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>00fd626bc51f5095261114285a01311264862b4e</id>
    </parent>
  </parents>
  <author>
    <name>macournoyer</name>
    <email>macournoyer@gmail.com</email>
  </author>
  <url>http://github.com/macournoyer/thin-turbo/commit/41921bb6a498b237fda43d57f4cb2baae91482f9</url>
  <id>41921bb6a498b237fda43d57f4cb2baae91482f9</id>
  <committed-date>2008-06-02T19:37:59-07:00</committed-date>
  <authored-date>2008-06-02T19:37:59-07:00</authored-date>
  <message>Add trace support</message>
  <tree>a38bf0b741a9a8e75942395244417a5180002aba</tree>
  <committer>
    <name>macournoyer</name>
    <email>macournoyer@gmail.com</email>
  </committer>
</commit>
