On Thu, 19 May 2016 17:47:52 +0200
Ben Noordhuis <...> wrote:

> 
> I suspect you're writing data faster than the other end of the pipe
> can read it.  Am I right that handle->write_queue_size keeps growing?
> 

I've added printing out the write_queue_size after write request creating in 
read_cb()
and in the write callback function too. It shows the value is always either 0 
or 6300144 (or 6300112) bytes.

To summarize my tests and for the sake of the results to be reproducible for 
whom it may be interesting
I put the full stuff here.

***** Source code (also attached as file: cpio-uv.c)
-------------------------------------------------------------------------------
#include <uv.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>


#define PRINT_UV_ERR(prefix, code)  do {\
    fflush(stdout);\
    fprintf(stderr, "%s: %s (%i): %s\n", prefix, uv_err_name(code), 
(int)(code), uv_strerror(code));\
    fflush(stderr);\
} while (0)


/* assuming that stdin and stdout can be handled with as pipes */
uv_pipe_t in, out;


void alloc_cb(uv_handle_t*, size_t, uv_buf_t*);
void read_cb(uv_stream_t*, ssize_t, const uv_buf_t*);
void write_cb(uv_write_t*, int);



int main(int _argc, char *_argv[])
{
  int ret = 0;

#ifdef BLOCK_SIGPIPE
  sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGPIPE);
  ret = sigprocmask(SIG_BLOCK, &set, NULL);
  if (ret != 0)
  {
    perror("sigprocmask");
    return ret;
  };
#endif

  uv_loop_t *loop = uv_default_loop();

  uv_pipe_init(loop, &in, 0);
  ret = uv_pipe_open(&in, fileno(stdin));
  if (ret < 0)
  {
    PRINT_UV_ERR("stdin open", ret);
    return ret;
  };

  uv_pipe_init(loop, &out, 0);
  ret = uv_pipe_open(&out, fileno(stdout));
  if (ret < 0)
  {
    PRINT_UV_ERR("stdout open", ret);
    return ret;
  };

  uv_read_start((uv_stream_t*)&in, alloc_cb, read_cb);

  return uv_run(loop, UV_RUN_DEFAULT);
}



void alloc_cb(uv_handle_t *_handle, size_t _suggested_size, uv_buf_t *_buf)
{
  /* allocate the memory for a new I/O buffer */
  *_buf = uv_buf_init((char*)malloc(_suggested_size), _suggested_size);
#ifndef NDEBUG
  fprintf(stderr, "[%p] create: I/O buffer\n", _buf->base);  fflush(stderr);
#endif
}


void read_cb(uv_stream_t *_stream, ssize_t _nread, const uv_buf_t *_buf)
{
  if (_nread < 0)
  {
    PRINT_UV_ERR("read", _nread);
    uv_read_stop(_stream);
  }
  else if (_nread > 0)
  {
    /* initialize a new buffer descriptor specifying the actual data length */
    uv_buf_t buf = uv_buf_init(_buf->base, _nread);

    /* create a write request descriptor */
    uv_write_t *wr = (uv_write_t*)malloc(sizeof(uv_write_t));
#ifndef NDEBUG
    fprintf(stderr, "[%p] create: write request\n", (void*)wr);  fflush(stderr);
    fprintf(stderr, "write_queue_size@read_cb=[%zu]\n", 
((uv_stream_t*)wr)->write_queue_size);  fflush(stderr);
#endif

    /* save a reference to the output buffer somehow along with the write 
request */
    wr->data = _buf->base;

    /* fire up the write request */
    uv_write(wr, (uv_stream_t*)&out, &buf, 1, write_cb);

    /* the I/O buffer being used up should be deleted somewhere */
  }
}


void write_cb(uv_write_t *_wr, int _status)
{
  if (_status < 0)
  {
    PRINT_UV_ERR("write", _status);
    uv_read_stop((uv_stream_t*)&in);
  };
#ifndef NDEBUG
    fprintf(stderr, "write_queue_size@write_cb=[%zu]\n", 
((uv_stream_t*)_wr)->write_queue_size);  fflush(stderr);
#endif

  /* when the write request has completed it's safe to free up the memory 
allocated for the I/O buffer */
  free(_wr->data);
#ifndef NDEBUG
  fprintf(stderr, "[%p] free: I/O buffer\n", _wr->data);  fflush(stderr);
#endif

  /* delete the write request descriptor */
  free(_wr);
#ifndef NDEBUG
  fprintf(stderr, "[%p] free: write request\n", (void*)_wr);  fflush(stderr);
#endif
}
-------------------------------------------------------------------------------

***** Variant with NO blocking SIGPIPE. Build command:
$ gcc -std=c99 -Wall -Wpedantic -O0 -g -pipe -D _DEFAULT_SOURCE   cpio-uv.c  
-lpthread -luv -o cpio-uv

***** Test 1.
$ { cat /dev/zero | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M count=1; 
}  2>log.txt
$ sort log.txt | uniq -c  >summary-test-1.txt
$ cat summary-test-1.txt
# ... there are 745 lines, see the attachment ...

***** Test 2.
$ { cat /dev/urandom | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M 
count=1; }  2>log.txt
$ sort log.txt | uniq -c  >summary-test-2.txt
$ cat summary-test-2.txt
      9 [0x1aea0a0] create: I/O buffer
      8 [0x1aea0a0] free: I/O buffer
      9 [0x1afa0b0] create: write request
      8 [0x1afa0b0] free: write request
      8 [0x1afa180] create: I/O buffer
      8 [0x1afa180] free: I/O buffer
      8 [0x1b0a190] create: write request
      8 [0x1b0a190] free: write request
      1 [0x1b0a260] create: I/O buffer
      1 [0x1b1a270] create: I/O buffer
      1 [0x1b2a280] create: I/O buffer
      1 [0x1b3a290] create: I/O buffer
      1 [0x1b4a2a0] create: I/O buffer
      1 [0x1b5a2b0] create: I/O buffer
      1 [0x1b6a2c0] create: I/O buffer
      1 [0x1b7a2d0] create: I/O buffer
      1 1048576 bytes (1.0 MB) copied, 0.116348 s, 9.0 MB/s
      1 1+0 records in
      1 1+0 records out
      2 write_queue_size@read_cb=[0]
     15 write_queue_size@read_cb=[6300112]
     16 write_queue_size@write_cb=[6300112]


***** Variant with blocking SIGPIPE. Build command:
$ gcc -std=c99 -Wall -Wpedantic -O0 -g -pipe -D _DEFAULT_SOURCE -D 
BLOCK_SIGPIPE  cpio-uv.c  -lpthread -luv -o cpio-uv

***** Test 3.
$ { cat /dev/zero | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M count=1; 
} 2>log.txt
$ sort log.txt | uniq -c  >summary-test-3.txt
$ cat summary-test-3.txt
# ... there are 134 lines, see the attachment ...

***** Test 4.
$ { cat /dev/urandom | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M 
count=1; } 2>log.txt
$ sort log.txt | uniq -c  >summary-test-4.txt
$ cat summary-test-4.txt
      9 [0xf0f0a0] create: I/O buffer
      9 [0xf0f0a0] free: I/O buffer
      9 [0xf1f0b0] create: write request
      9 [0xf1f0b0] free: write request
      9 [0xf1f180] create: I/O buffer
      9 [0xf1f180] free: I/O buffer
      9 [0xf2f190] create: write request
      9 [0xf2f190] free: write request
      1 [0xf2f260] create: I/O buffer
      1 [0xf3f270] create: I/O buffer
      1 [0xf4f280] create: I/O buffer
      1 [0xf5f290] create: I/O buffer
      1 [0xf6f2a0] create: I/O buffer
      1 [0xf7f2b0] create: I/O buffer
      1 [0xf8f2c0] create: I/O buffer
      1 [0xf9f2d0] create: I/O buffer
      1 [0xfaf2e0] create: I/O buffer
      1 1048576 bytes (1.0 MB) copied, 0.113904 s, 9.2 MB/s
      1 1+0 records in
      1 1+0 records out
      2 write: EPIPE (-32): broken pipe
      2 write_queue_size@read_cb=[0]
     16 write_queue_size@read_cb=[6300144]
     18 write_queue_size@write_cb=[6300144]

-------------------------------------------------------------------------------

Regardless of blocking SIGPIPE or not, if /dev/zero is used as input,
the memory used by the program starts constantly growing rather quickly.
Try this for example:
$ cat /dev/zero | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M count=500

-------------------------------------------------------------------------------

-- 
You received this message because you are subscribed to the Google Groups 
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.
      2 [0x24d10a0] create: I/O buffer
      1 [0x24d10a0] free: I/O buffer
      2 [0x24e10b0] create: write request
      1 [0x24e10b0] free: write request
      2 [0x24e1180] create: I/O buffer
      1 [0x24e1180] free: I/O buffer
      2 [0x24f1190] create: write request
      1 [0x24f1190] free: write request
      2 [0x24f1260] create: I/O buffer
      1 [0x24f1260] free: I/O buffer
      2 [0x2501270] create: write request
      1 [0x2501270] free: write request
      2 [0x2501340] create: I/O buffer
      1 [0x2501340] free: I/O buffer
      2 [0x2511350] create: write request
      1 [0x2511350] free: write request
      2 [0x2511420] create: I/O buffer
      1 [0x2511420] free: I/O buffer
      2 [0x2521430] create: write request
      1 [0x2521430] free: write request
      2 [0x2521500] create: I/O buffer
      1 [0x2521500] free: I/O buffer
      2 [0x2531510] create: write request
      1 [0x2531510] free: write request
      2 [0x25315e0] create: I/O buffer
      1 [0x25315e0] free: I/O buffer
      2 [0x25415f0] create: write request
      1 [0x25415f0] free: write request
      2 [0x25416c0] create: I/O buffer
      1 [0x25416c0] free: I/O buffer
      2 [0x25516d0] create: write request
      1 [0x25516d0] free: write request
      2 [0x25517a0] create: I/O buffer
      1 [0x25517a0] free: I/O buffer
      2 [0x25617b0] create: write request
      1 [0x25617b0] free: write request
      2 [0x2561880] create: I/O buffer
      1 [0x2561880] free: I/O buffer
      2 [0x2571890] create: write request
      1 [0x2571890] free: write request
      2 [0x2571960] create: I/O buffer
      1 [0x2571960] free: I/O buffer
      2 [0x2581970] create: write request
      1 [0x2581970] free: write request
      2 [0x2581a40] create: I/O buffer
      1 [0x2581a40] free: I/O buffer
      2 [0x2591a50] create: write request
      1 [0x2591a50] free: write request
      2 [0x2591b20] create: I/O buffer
      1 [0x2591b20] free: I/O buffer
      2 [0x25a1b30] create: write request
      1 [0x25a1b30] free: write request
      2 [0x25a1c00] create: I/O buffer
      1 [0x25a1c00] free: I/O buffer
      2 [0x25b1c10] create: write request
      1 [0x25b1c10] free: write request
      2 [0x25b1ce0] create: I/O buffer
      1 [0x25b1ce0] free: I/O buffer
      2 [0x25c1cf0] create: write request
      1 [0x25c1cf0] free: write request
      1 [0x25c1dc0] create: I/O buffer
      1 [0x25c1dc0] free: I/O buffer
      1 [0x25d1dd0] create: write request
      1 [0x25d1dd0] free: write request
      1 [0x25d1ea0] create: I/O buffer
      1 [0x25e1eb0] create: write request
      1 [0x25e1f80] create: I/O buffer
      1 [0x25f1f90] create: write request
      1 [0x25f2060] create: I/O buffer
      1 [0x2602070] create: write request
      1 [0x2602140] create: I/O buffer
      1 [0x2612150] create: write request
      1 [0x2612220] create: I/O buffer
      1 [0x2622230] create: write request
      1 [0x2622300] create: I/O buffer
      1 [0x2632310] create: write request
      1 [0x26323e0] create: I/O buffer
      1 [0x26423f0] create: write request
      1 [0x26424c0] create: I/O buffer
      1 [0x26524d0] create: write request
      1 [0x26525a0] create: I/O buffer
      1 [0x26625b0] create: write request
      1 [0x2662680] create: I/O buffer
      1 [0x2672690] create: write request
      1 [0x2672760] create: I/O buffer
      1 [0x2682770] create: write request
      1 [0x2682840] create: I/O buffer
      1 [0x2692850] create: write request
      1 [0x2692920] create: I/O buffer
      1 [0x26a2930] create: write request
      1 [0x26a2a00] create: I/O buffer
      1 [0x26b2a10] create: write request
      1 [0x26b2ae0] create: I/O buffer
      1 [0x26c2af0] create: write request
      1 [0x26c2bc0] create: I/O buffer
      1 [0x26d2bd0] create: write request
      1 [0x26d2ca0] create: I/O buffer
      1 [0x26e2cb0] create: write request
      1 [0x26e2d80] create: I/O buffer
      1 [0x26f2d90] create: write request
      1 [0x26f2e60] create: I/O buffer
      1 [0x2702e70] create: write request
      1 [0x2702f40] create: I/O buffer
      1 [0x2712f50] create: write request
      1 [0x2713020] create: I/O buffer
      1 [0x2723030] create: write request
      1 [0x2723100] create: I/O buffer
      1 [0x2733110] create: write request
      1 [0x27331e0] create: I/O buffer
      1 [0x27431f0] create: write request
      1 [0x27432c0] create: I/O buffer
      1 [0x27532d0] create: write request
      1 [0x27533a0] create: I/O buffer
      1 [0x27633b0] create: write request
      1 [0x2763480] create: I/O buffer
      1 [0x2773490] create: write request
      1 [0x2773560] create: I/O buffer
      1 [0x2783570] create: write request
      1 [0x2783640] create: I/O buffer
      1 [0x2793650] create: write request
      1 [0x2793720] create: I/O buffer
      1 [0x27a3730] create: write request
      1 [0x27a3800] create: I/O buffer
      1 [0x27b3810] create: write request
      1 [0x27b38e0] create: I/O buffer
      1 [0x27c38f0] create: write request
      1 [0x27c39c0] create: I/O buffer
      1 [0x27d39d0] create: write request
      1 [0x27d3aa0] create: I/O buffer
      1 [0x27e3ab0] create: write request
      1 [0x27e3b80] create: I/O buffer
      1 [0x27f3b90] create: write request
      1 [0x27f3c60] create: I/O buffer
      1 [0x2803c70] create: write request
      1 [0x2803d40] create: I/O buffer
      1 [0x2813d50] create: write request
      1 [0x2813e20] create: I/O buffer
      1 [0x2823e30] create: write request
      1 [0x2823f00] create: I/O buffer
      1 [0x2833f10] create: write request
      1 [0x2833fe0] create: I/O buffer
      1 [0x2843ff0] create: write request
      1 [0x28440c0] create: I/O buffer
      1 [0x28540d0] create: write request
      1 [0x28541a0] create: I/O buffer
      1 [0x28641b0] create: write request
      1 [0x2864280] create: I/O buffer
      1 [0x2874290] create: write request
      1 [0x2874360] create: I/O buffer
      1 [0x2884370] create: write request
      1 [0x2884440] create: I/O buffer
      1 [0x2894450] create: write request
      1 [0x2894520] create: I/O buffer
      1 [0x28a4530] create: write request
      1 [0x28a4600] create: I/O buffer
      1 [0x28b4610] create: write request
      1 [0x28b46e0] create: I/O buffer
      1 [0x28c46f0] create: write request
      1 [0x28c47c0] create: I/O buffer
      1 [0x28d47d0] create: write request
      1 [0x28d48a0] create: I/O buffer
      1 [0x28e48b0] create: write request
      1 [0x28e4980] create: I/O buffer
      1 [0x28f4990] create: write request
      1 [0x28f4a60] create: I/O buffer
      1 [0x2904a70] create: write request
      1 [0x2904b40] create: I/O buffer
      1 [0x2914b50] create: write request
      1 [0x2914c20] create: I/O buffer
      1 [0x2924c30] create: write request
      1 [0x2924d00] create: I/O buffer
      1 [0x2934d10] create: write request
      1 [0x2934de0] create: I/O buffer
      1 [0x2944df0] create: write request
      1 [0x2944ec0] create: I/O buffer
      1 [0x2954ed0] create: write request
      1 [0x2954fa0] create: I/O buffer
      1 [0x2964fb0] create: write request
      1 [0x2965080] create: I/O buffer
      1 [0x2975090] create: write request
      1 [0x2975160] create: I/O buffer
      1 [0x2985170] create: write request
      1 [0x2985240] create: I/O buffer
      1 [0x2995250] create: write request
      1 [0x2995320] create: I/O buffer
      1 [0x29a5330] create: write request
      1 [0x29a5400] create: I/O buffer
      1 [0x29b5410] create: write request
      1 [0x29b54e0] create: I/O buffer
      1 [0x29c54f0] create: write request
      1 [0x29c55c0] create: I/O buffer
      1 [0x29d55d0] create: write request
      1 [0x29d56a0] create: I/O buffer
      1 [0x29e56b0] create: write request
      1 [0x29e5780] create: I/O buffer
      1 [0x29f5790] create: write request
      1 [0x29f5860] create: I/O buffer
      1 [0x2a05870] create: write request
      1 [0x2a05940] create: I/O buffer
      1 [0x2a15950] create: write request
      1 [0x2a15a20] create: I/O buffer
      1 [0x2a25a30] create: write request
      1 [0x2a25b00] create: I/O buffer
      1 [0x2a35b10] create: write request
      1 [0x2a35be0] create: I/O buffer
      1 [0x2a45bf0] create: write request
      1 [0x2a45cc0] create: I/O buffer
      1 [0x2a55cd0] create: write request
      1 [0x2a55da0] create: I/O buffer
      1 [0x2a65db0] create: write request
      1 [0x2a65e80] create: I/O buffer
      1 [0x2a75e90] create: write request
      1 [0x2a75f60] create: I/O buffer
      1 [0x2a85f70] create: write request
      1 [0x2a86040] create: I/O buffer
      1 [0x2a96050] create: write request
      1 [0x2a96120] create: I/O buffer
      1 [0x2aa6130] create: write request
      1 [0x2aa6200] create: I/O buffer
      1 [0x2ab6210] create: write request
      1 [0x2ab62e0] create: I/O buffer
      1 [0x2ac62f0] create: write request
      1 [0x2ac63c0] create: I/O buffer
      1 [0x2ad63d0] create: write request
      1 [0x2ad64a0] create: I/O buffer
      1 [0x2ae64b0] create: write request
      1 [0x2ae6580] create: I/O buffer
      1 [0x2af6590] create: write request
      1 [0x2af6660] create: I/O buffer
      1 [0x2b06670] create: write request
      1 [0x2b06740] create: I/O buffer
      1 [0x2b16750] create: write request
      1 [0x2b16820] create: I/O buffer
      1 [0x2b26830] create: write request
      1 [0x2b26900] create: I/O buffer
      1 [0x2b36910] create: write request
      1 [0x2b369e0] create: I/O buffer
      1 [0x2b469f0] create: write request
      1 [0x2b46ac0] create: I/O buffer
      1 [0x2b56ad0] create: write request
      1 [0x2b56ba0] create: I/O buffer
      1 [0x2b66bb0] create: write request
      1 [0x2b66c80] create: I/O buffer
      1 [0x2b76c90] create: write request
      1 [0x2b76d60] create: I/O buffer
      1 [0x2b86d70] create: write request
      1 [0x2b86e40] create: I/O buffer
      1 [0x2b96e50] create: write request
      1 [0x2b96f20] create: I/O buffer
      1 [0x2ba6f30] create: write request
      1 [0x2ba7000] create: I/O buffer
      1 [0x2bb7010] create: write request
      1 [0x2bb70e0] create: I/O buffer
      1 [0x2bc70f0] create: write request
      1 [0x2bc71c0] create: I/O buffer
      1 [0x2bd71d0] create: write request
      1 [0x2bd72a0] create: I/O buffer
      1 [0x2be72b0] create: write request
      1 [0x2be7380] create: I/O buffer
      1 [0x2bf7390] create: write request
      1 [0x2bf7460] create: I/O buffer
      1 [0x2c07470] create: write request
      1 [0x2c07540] create: I/O buffer
      1 [0x2c17550] create: write request
      1 [0x2c17620] create: I/O buffer
      1 [0x2c27630] create: write request
      1 [0x2c27700] create: I/O buffer
      1 [0x2c37710] create: write request
      1 [0x2c377e0] create: I/O buffer
      1 [0x2c477f0] create: write request
      1 [0x2c478c0] create: I/O buffer
      1 [0x2c578d0] create: write request
      1 [0x2c579a0] create: I/O buffer
      1 [0x2c679b0] create: write request
      1 [0x2c67a80] create: I/O buffer
      1 [0x2c77a90] create: write request
      1 [0x2c77b60] create: I/O buffer
      1 [0x2c87b70] create: write request
      1 [0x2c87c40] create: I/O buffer
      1 [0x2c97c50] create: write request
      1 [0x2c97d20] create: I/O buffer
      1 [0x2ca7d30] create: write request
      1 [0x2ca7e00] create: I/O buffer
      1 [0x2cb7e10] create: write request
      1 [0x2cb7ee0] create: I/O buffer
      1 [0x2cc7ef0] create: write request
      1 [0x2cc7fc0] create: I/O buffer
      1 [0x2cd7fd0] create: write request
      1 [0x2cd80a0] create: I/O buffer
      1 [0x2ce80b0] create: write request
      1 [0x2ce8180] create: I/O buffer
      1 [0x2cf8190] create: write request
      1 [0x2cf8260] create: I/O buffer
      1 [0x2d08270] create: write request
      1 [0x2d08340] create: I/O buffer
      1 [0x2d18350] create: write request
      1 [0x2d18420] create: I/O buffer
      1 [0x2d28430] create: write request
      1 [0x2d28500] create: I/O buffer
      1 [0x2d38510] create: write request
      1 [0x2d385e0] create: I/O buffer
      1 [0x2d485f0] create: write request
      1 [0x2d486c0] create: I/O buffer
      1 [0x2d586d0] create: write request
      1 [0x2d587a0] create: I/O buffer
      1 [0x2d687b0] create: write request
      1 [0x2d68880] create: I/O buffer
      1 [0x2d78890] create: write request
      1 [0x2d78960] create: I/O buffer
      1 [0x2d88970] create: write request
      1 [0x2d88a40] create: I/O buffer
      1 [0x2d98a50] create: I/O buffer
      1 [0x2da8a60] create: write request
      1 [0x2da8b30] create: I/O buffer
      1 [0x2db8b40] create: write request
      1 [0x2db8c10] create: I/O buffer
      1 [0x2dc8c20] create: write request
      1 [0x2dc8cf0] create: I/O buffer
      1 [0x2dd8d00] create: write request
      1 [0x2dd8dd0] create: I/O buffer
      1 [0x2de8de0] create: write request
      1 [0x2de8eb0] create: I/O buffer
      1 [0x2df8ec0] create: write request
      1 [0x2df8f90] create: I/O buffer
      1 [0x2e08fa0] create: write request
      1 [0x2e09070] create: I/O buffer
      1 [0x2e19080] create: write request
      1 [0x2e19150] create: I/O buffer
      1 [0x2e29160] create: write request
      1 [0x2e29230] create: I/O buffer
      1 [0x2e39240] create: write request
      1 [0x2e39310] create: I/O buffer
      1 [0x2e49320] create: write request
      1 [0x2e493f0] create: I/O buffer
      1 [0x2e59400] create: write request
      1 [0x2e594d0] create: I/O buffer
      1 [0x2e694e0] create: write request
      1 [0x2e695b0] create: I/O buffer
      1 [0x2e795c0] create: write request
      1 [0x2e79690] create: I/O buffer
      1 [0x2e896a0] create: write request
      1 [0x2e89770] create: I/O buffer
      1 [0x2e99780] create: write request
      1 [0x2e99850] create: I/O buffer
      1 [0x2ea9860] create: write request
      1 [0x2ea9930] create: I/O buffer
      1 [0x2eb9940] create: write request
      1 [0x2eb9a10] create: I/O buffer
      1 [0x2ec9a20] create: write request
      1 [0x2ec9af0] create: I/O buffer
      1 [0x2ed9b00] create: write request
      1 [0x2ed9bd0] create: I/O buffer
      1 [0x2ee9be0] create: write request
      1 [0x2ee9cb0] create: I/O buffer
      1 [0x2ef9cc0] create: write request
      1 [0x2ef9d90] create: I/O buffer
      1 [0x2f09da0] create: write request
      1 [0x2f09e70] create: I/O buffer
      1 [0x2f19e80] create: write request
      1 [0x2f19f50] create: I/O buffer
      1 [0x2f29f60] create: write request
      1 [0x2f2a030] create: I/O buffer
      1 [0x2f3a040] create: write request
      1 [0x2f3a110] create: I/O buffer
      1 [0x2f4a120] create: write request
      1 [0x2f4a1f0] create: I/O buffer
      1 [0x2f5a200] create: write request
      1 [0x2f5a2d0] create: I/O buffer
      1 [0x2f6a2e0] create: write request
      1 [0x2f6a3b0] create: I/O buffer
      1 [0x2f7a3c0] create: write request
      1 [0x2f7a490] create: I/O buffer
      1 [0x2f8a4a0] create: write request
      1 [0x2f8a570] create: I/O buffer
      1 [0x2f9a580] create: write request
      1 [0x2f9a650] create: I/O buffer
      1 [0x2faa660] create: write request
      1 [0x2faa730] create: I/O buffer
      1 [0x2fba740] create: write request
      1 [0x2fba810] create: I/O buffer
      1 [0x2fca820] create: write request
      1 [0x2fca8f0] create: I/O buffer
      1 [0x2fda900] create: write request
      1 [0x2fda9d0] create: I/O buffer
      1 [0x2fea9e0] create: write request
      1 [0x2feaab0] create: I/O buffer
      1 [0x2ffaac0] create: write request
      1 [0x2ffab90] create: I/O buffer
      1 [0x300aba0] create: write request
      1 [0x300ac70] create: I/O buffer
      1 [0x301ac80] create: write request
      1 [0x301ad50] create: I/O buffer
      1 [0x302ad60] create: write request
      1 [0x302ae30] create: I/O buffer
      1 [0x303ae40] create: write request
      1 [0x303af10] create: I/O buffer
      1 [0x304af20] create: write request
      1 [0x304aff0] create: I/O buffer
      1 [0x305b000] create: write request
      1 [0x305b0d0] create: I/O buffer
      1 [0x306b0e0] create: write request
      1 [0x306b1b0] create: I/O buffer
      1 [0x307b1c0] create: write request
      1 [0x307b290] create: I/O buffer
      1 [0x308b2a0] create: write request
      1 [0x308b370] create: I/O buffer
      1 [0x309b380] create: write request
      1 [0x309b450] create: I/O buffer
      1 [0x30ab460] create: write request
      1 [0x30ab530] create: I/O buffer
      1 [0x30bb540] create: write request
      1 [0x30bb610] create: I/O buffer
      1 [0x30cb620] create: write request
      1 [0x30cb6f0] create: I/O buffer
      1 [0x30db700] create: write request
      1 [0x30db7d0] create: I/O buffer
      1 [0x30eb7e0] create: write request
      1 [0x30eb8b0] create: I/O buffer
      1 [0x30fb8c0] create: write request
      1 [0x30fb990] create: I/O buffer
      1 [0x310b9a0] create: write request
      1 [0x310ba70] create: I/O buffer
      1 [0x311ba80] create: write request
      1 [0x311bb50] create: I/O buffer
      1 [0x312bb60] create: write request
      1 [0x312bc30] create: I/O buffer
      1 [0x313bc40] create: write request
      1 [0x313bd10] create: I/O buffer
      1 [0x314bd20] create: write request
      1 [0x314bdf0] create: I/O buffer
      1 [0x315be00] create: write request
      1 [0x315bed0] create: I/O buffer
      1 [0x316bee0] create: write request
      1 [0x316bfb0] create: I/O buffer
      1 [0x317bfc0] create: write request
      1 [0x317c090] create: I/O buffer
      1 [0x318c0a0] create: write request
      1 [0x318c170] create: I/O buffer
      1 [0x319c180] create: write request
      1 [0x319c250] create: I/O buffer
      1 [0x31ac260] create: write request
      1 [0x31ac330] create: I/O buffer
      1 [0x31bc340] create: write request
      1 [0x31bc410] create: I/O buffer
      1 [0x31cc420] create: write request
      1 [0x31cc4f0] create: I/O buffer
      1 [0x31dc500] create: write request
      1 [0x31dc5d0] create: I/O buffer
      1 [0x31ec5e0] create: write request
      1 [0x31ec6b0] create: I/O buffer
      1 [0x31fc6c0] create: write request
      1 [0x31fc790] create: I/O buffer
      1 [0x320c7a0] create: write request
      1 [0x320c870] create: I/O buffer
      1 [0x321c880] create: write request
      1 [0x321c950] create: I/O buffer
      1 [0x322c960] create: write request
      1 [0x322ca30] create: I/O buffer
      1 [0x323ca40] create: write request
      1 [0x323cb10] create: I/O buffer
      1 [0x324cb20] create: write request
      1 [0x324cbf0] create: I/O buffer
      1 [0x325cc00] create: write request
      1 [0x325ccd0] create: I/O buffer
      1 [0x326cce0] create: write request
      1 [0x326cdb0] create: I/O buffer
      1 [0x327cdc0] create: write request
      1 [0x327ce90] create: I/O buffer
      1 [0x328cea0] create: write request
      1 [0x328cf70] create: I/O buffer
      1 [0x329cf80] create: write request
      1 [0x329d050] create: I/O buffer
      1 [0x32ad060] create: write request
      1 [0x32ad130] create: I/O buffer
      1 [0x32bd140] create: write request
      1 [0x32bd210] create: I/O buffer
      1 [0x32cd220] create: write request
      1 [0x32cd2f0] create: I/O buffer
      1 [0x32dd300] create: write request
      1 [0x32dd3d0] create: I/O buffer
      1 [0x32ed3e0] create: write request
      1 [0x32ed4b0] create: I/O buffer
      1 [0x32fd4c0] create: write request
      1 [0x32fd590] create: I/O buffer
      1 [0x330d5a0] create: write request
      1 [0x330d670] create: I/O buffer
      1 [0x331d680] create: write request
      1 [0x331d750] create: I/O buffer
      1 [0x332d760] create: write request
      1 [0x332d830] create: I/O buffer
      1 [0x333d840] create: write request
      1 [0x333d910] create: I/O buffer
      1 [0x334d920] create: write request
      1 [0x334d9f0] create: I/O buffer
      1 [0x335da00] create: write request
      1 [0x335dad0] create: I/O buffer
      1 [0x336dae0] create: write request
      1 [0x336dbb0] create: I/O buffer
      1 [0x337dbc0] create: write request
      1 [0x337dc90] create: I/O buffer
      1 [0x338dca0] create: write request
      1 [0x338dd70] create: I/O buffer
      1 [0x339dd80] create: write request
      1 [0x339de50] create: I/O buffer
      1 [0x33ade60] create: write request
      1 [0x33adf30] create: I/O buffer
      1 [0x33bdf40] create: write request
      1 [0x33be010] create: I/O buffer
      1 [0x33ce020] create: write request
      1 [0x33ce0f0] create: I/O buffer
      1 [0x33de100] create: write request
      1 [0x33de1d0] create: I/O buffer
      1 [0x33ee1e0] create: write request
      1 [0x33ee2b0] create: I/O buffer
      1 [0x33fe2c0] create: write request
      1 [0x33fe390] create: I/O buffer
      1 [0x340e3a0] create: write request
      1 [0x340e470] create: I/O buffer
      1 [0x341e480] create: write request
      1 [0x341e550] create: I/O buffer
      1 [0x342e560] create: write request
      1 [0x342e630] create: I/O buffer
      1 [0x343e640] create: write request
      1 [0x343e710] create: I/O buffer
      1 [0x344e720] create: write request
      1 [0x344e7f0] create: I/O buffer
      1 [0x345e800] create: write request
      1 [0x345e8d0] create: I/O buffer
      1 [0x346e8e0] create: write request
      1 [0x346e9b0] create: I/O buffer
      1 [0x347e9c0] create: write request
      1 [0x347ea90] create: I/O buffer
      1 [0x348eaa0] create: write request
      1 [0x348eb70] create: I/O buffer
      1 [0x349eb80] create: write request
      1 [0x349ec50] create: I/O buffer
      1 [0x34aec60] create: write request
      1 [0x34aed30] create: I/O buffer
      1 [0x34bed40] create: write request
      1 [0x34bee10] create: I/O buffer
      1 [0x34cee20] create: write request
      1 [0x34ceef0] create: I/O buffer
      1 [0x34def00] create: write request
      1 [0x34defd0] create: I/O buffer
      1 [0x34eefe0] create: write request
      1 [0x34ef0b0] create: I/O buffer
      1 [0x34ff0c0] create: write request
      1 [0x34ff190] create: I/O buffer
      1 [0x350f1a0] create: write request
      1 [0x350f270] create: I/O buffer
      1 [0x351f280] create: write request
      1 [0x351f350] create: I/O buffer
      1 [0x352f360] create: write request
      1 [0x352f430] create: I/O buffer
      1 [0x353f440] create: write request
      1 [0x353f510] create: I/O buffer
      1 [0x354f520] create: write request
      1 [0x354f5f0] create: I/O buffer
      1 [0x355f600] create: write request
      1 [0x355f6d0] create: I/O buffer
      1 [0x356f6e0] create: write request
      1 [0x356f7b0] create: I/O buffer
      1 [0x357f7c0] create: write request
      1 [0x357f890] create: I/O buffer
      1 [0x358f8a0] create: write request
      1 [0x358f970] create: I/O buffer
      1 [0x359f980] create: write request
      1 [0x359fa50] create: I/O buffer
      1 [0x35afa60] create: write request
      1 [0x35afb30] create: I/O buffer
      1 [0x35bfb40] create: write request
      1 [0x35bfc10] create: I/O buffer
      1 [0x35cfc20] create: write request
      1 [0x35cfcf0] create: I/O buffer
      1 [0x35dfd00] create: write request
      1 [0x35dfdd0] create: I/O buffer
      1 [0x35efde0] create: write request
      1 [0x35efeb0] create: I/O buffer
      1 [0x35ffec0] create: write request
      1 [0x35fff90] create: I/O buffer
      1 [0x360ffa0] create: write request
      1 [0x3610070] create: I/O buffer
      1 [0x3620080] create: write request
      1 [0x3620150] create: I/O buffer
      1 [0x3630160] create: write request
      1 [0x3630230] create: I/O buffer
      1 [0x3640240] create: write request
      1 [0x3640310] create: I/O buffer
      1 [0x3650320] create: write request
      1 [0x36503f0] create: I/O buffer
      1 [0x3660400] create: write request
      1 [0x36604d0] create: I/O buffer
      1 [0x36704e0] create: write request
      1 [0x36705b0] create: I/O buffer
      1 [0x36805c0] create: write request
      1 [0x3680690] create: I/O buffer
      1 [0x36906a0] create: write request
      1 [0x3690770] create: I/O buffer
      1 [0x36a0780] create: write request
      1 [0x36a0850] create: I/O buffer
      1 [0x36b0860] create: write request
      1 [0x36b0930] create: I/O buffer
      1 [0x36c0940] create: write request
      1 [0x36c0a10] create: I/O buffer
      1 [0x36d0a20] create: write request
      1 [0x36d0af0] create: I/O buffer
      1 [0x36e0b00] create: write request
      1 [0x36e0bd0] create: I/O buffer
      1 [0x36f0be0] create: write request
      1 [0x36f0cb0] create: I/O buffer
      1 [0x3700cc0] create: write request
      1 [0x3700d90] create: I/O buffer
      1 [0x3710da0] create: write request
      1 [0x3710e70] create: I/O buffer
      1 [0x3720e80] create: write request
      1 [0x3720f50] create: I/O buffer
      1 [0x3730f60] create: write request
      1 [0x3731030] create: I/O buffer
      1 [0x3741040] create: write request
      1 [0x3741110] create: I/O buffer
      1 [0x3751120] create: write request
      1 [0x37511f0] create: I/O buffer
      1 [0x3761200] create: write request
      1 [0x37612d0] create: I/O buffer
      1 [0x37712e0] create: write request
      1 [0x37713b0] create: I/O buffer
      1 [0x37813c0] create: write request
      1 [0x3781490] create: I/O buffer
      1 [0x37914a0] create: write request
      1 [0x3791570] create: I/O buffer
      1 [0x37a1580] create: write request
      1 [0x37a1650] create: I/O buffer
      1 [0x37b1660] create: write request
      1 [0x37b1730] create: I/O buffer
      1 [0x37c1740] create: write request
      1 [0x37c1810] create: I/O buffer
      1 [0x37d1820] create: write request
      1 [0x37d18f0] create: I/O buffer
      1 [0x37e1900] create: write request
      1 [0x37e19d0] create: I/O buffer
      1 [0x37f19e0] create: write request
      1 [0x37f1ab0] create: I/O buffer
      1 [0x3801ac0] create: write request
      1 [0x3801b90] create: I/O buffer
      1 [0x3811ba0] create: write request
      1 [0x3811c70] create: I/O buffer
      1 [0x3821c80] create: write request
      1 [0x3821d50] create: I/O buffer
      1 [0x3831d60] create: write request
      1 [0x3831e30] create: I/O buffer
      1 [0x3841e40] create: write request
      1 [0x3841f10] create: I/O buffer
      1 [0x3851f20] create: write request
      1 [0x3851ff0] create: I/O buffer
      1 [0x3862000] create: write request
      1 [0x38620d0] create: I/O buffer
      1 [0x38720e0] create: write request
      1 [0x38721b0] create: I/O buffer
      1 [0x38821c0] create: write request
      1 [0x3882290] create: I/O buffer
      1 [0x38922a0] create: write request
      1 [0x3892370] create: I/O buffer
      1 [0x38a2380] create: write request
      1 [0x38a2450] create: I/O buffer
      1 [0x38b2460] create: write request
      1 [0x38b2530] create: I/O buffer
      1 [0x38c2540] create: write request
      1 [0x38c2610] create: I/O buffer
      1 [0x38d2620] create: write request
      1 [0x38d26f0] create: I/O buffer
      1 [0x38e2700] create: write request
      1 [0x38e27d0] create: I/O buffer
      1 [0x38f27e0] create: write request
      1 [0x38f28b0] create: I/O buffer
      1 [0x39028c0] create: write request
      1 [0x3902990] create: I/O buffer
      1 [0x39129a0] create: write request
      1 [0x3912a70] create: I/O buffer
      1 [0x3922a80] create: write request
      1 [0x3922b50] create: I/O buffer
      1 [0x3932b60] create: write request
      1 [0x3932c30] create: I/O buffer
      1 [0x3942c40] create: write request
      1 [0x3942d10] create: I/O buffer
      1 [0x3952d20] create: write request
      1 [0x3952df0] create: I/O buffer
      1 [0x3962e00] create: write request
      1 [0x3962ed0] create: I/O buffer
      1 [0x3972ee0] create: write request
      1 [0x3972fb0] create: I/O buffer
      1 [0x3982fc0] create: write request
      1 [0x3983090] create: I/O buffer
      1 [0x39930a0] create: write request
      1 [0x3993170] create: I/O buffer
      1 [0x39a3180] create: write request
      1 [0x39a3250] create: I/O buffer
      1 [0x39b3260] create: write request
      1 [0x39b3330] create: I/O buffer
      1 [0x39c3340] create: write request
      1 [0x39c3410] create: I/O buffer
      1 [0x39d3420] create: write request
      1 [0x39d34f0] create: I/O buffer
      1 [0x39e3500] create: write request
      1 [0x39e35d0] create: I/O buffer
      1 [0x39f35e0] create: write request
      1 [0x39f36b0] create: I/O buffer
      1 [0x3a036c0] create: write request
      1 [0x3a03790] create: I/O buffer
      1 [0x3a137a0] create: write request
      1 [0x3a13870] create: I/O buffer
      1 [0x3a23880] create: write request
      1 [0x3a23950] create: I/O buffer
      1 [0x3a33960] create: write request
      1 [0x3a33a30] create: I/O buffer
      1 [0x3a43a40] create: write request
      1 [0x3a43b10] create: I/O buffer
      1 [0x3a53b20] create: write request
      1 [0x3a53bf0] create: I/O buffer
      1 [0x3a63c00] create: write request
      1 [0x3a63cd0] create: I/O buffer
      1 [0x3a73ce0] create: write request
      1 [0x3a73db0] create: I/O buffer
      1 [0x3a83dc0] create: write request
      1 [0x3a83e90] create: I/O buffer
      1 [0x3a93ea0] create: write request
      1 [0x3a93f70] create: I/O buffer
      1 [0x3aa3f80] create: write request
      1 [0x3aa4050] create: I/O buffer
      1 [0x3ab4060] create: write request
      1 [0x3ab4130] create: I/O buffer
      1 [0x3ac4140] create: write request
      1 [0x3ac4210] create: I/O buffer
      1 [0x3ad4220] create: write request
      1 [0x3ad42f0] create: I/O buffer
      1 [0x3ae4300] create: write request
      1 [0x3ae43d0] create: I/O buffer
      1 [0x3af43e0] create: write request
      1 [0x3af44b0] create: I/O buffer
      1 [0x3b044c0] create: write request
      1 1048576 bytes (1.0 MB) copied, 0.0883764 s, 11.9 MB/s
      1 1+0 records in
      1 1+0 records out
    353 write_queue_size@read_cb=[0]
     15 write_queue_size@read_cb=[6300112]
     16 write_queue_size@write_cb=[6300112]
      1 [0x9f90a0] create: I/O buffer
      1 [0x9f90a0] free: I/O buffer
      1 [0xa090b0] create: write request
      1 [0xa090b0] free: write request
      1 [0xa09180] create: I/O buffer
      1 [0xa09180] free: I/O buffer
      1 [0xa19190] create: write request
      1 [0xa19190] free: write request
      1 [0xa19260] create: I/O buffer
      1 [0xa19260] free: I/O buffer
      1 [0xa29270] create: write request
      1 [0xa29270] free: write request
      1 [0xa29340] create: I/O buffer
      1 [0xa29340] free: I/O buffer
      1 [0xa39350] create: write request
      1 [0xa39350] free: write request
      1 [0xa39420] create: I/O buffer
      1 [0xa39420] free: I/O buffer
      1 [0xa49430] create: write request
      1 [0xa49430] free: write request
      1 [0xa49500] create: I/O buffer
      1 [0xa49500] free: I/O buffer
      1 [0xa59510] create: write request
      1 [0xa59510] free: write request
      1 [0xa595e0] create: I/O buffer
      1 [0xa595e0] free: I/O buffer
      1 [0xa695f0] create: write request
      1 [0xa695f0] free: write request
      1 [0xa696c0] create: I/O buffer
      1 [0xa696c0] free: I/O buffer
      1 [0xa796d0] create: write request
      1 [0xa796d0] free: write request
      1 [0xa797a0] create: I/O buffer
      1 [0xa797a0] free: I/O buffer
      1 [0xa897b0] create: write request
      1 [0xa897b0] free: write request
      1 [0xa89880] create: I/O buffer
      1 [0xa89880] free: I/O buffer
      1 [0xa99890] create: write request
      1 [0xa99890] free: write request
      1 [0xa99960] create: I/O buffer
      1 [0xa99960] free: I/O buffer
      1 [0xaa9970] create: write request
      1 [0xaa9970] free: write request
      1 [0xaa9a40] create: I/O buffer
      1 [0xaa9a40] free: I/O buffer
      1 [0xab9a50] create: write request
      1 [0xab9a50] free: write request
      1 [0xab9b20] create: I/O buffer
      1 [0xab9b20] free: I/O buffer
      1 [0xac9b30] create: write request
      1 [0xac9b30] free: write request
      1 [0xac9c00] create: I/O buffer
      1 [0xac9c00] free: I/O buffer
      1 [0xad9c10] create: write request
      1 [0xad9c10] free: write request
      1 [0xad9ce0] create: I/O buffer
      1 [0xad9ce0] free: I/O buffer
      1 [0xae9cf0] create: write request
      1 [0xae9cf0] free: write request
      1 [0xae9dc0] create: I/O buffer
      1 [0xae9dc0] free: I/O buffer
      1 [0xaf9dd0] create: write request
      1 [0xaf9dd0] free: write request
      1 [0xaf9ea0] create: I/O buffer
      1 [0xaf9ea0] free: I/O buffer
      1 [0xb09eb0] create: write request
      1 [0xb09eb0] free: write request
      1 [0xb09f80] create: I/O buffer
      1 [0xb09f80] free: I/O buffer
      1 [0xb19f90] create: write request
      1 [0xb19f90] free: write request
      1 [0xb1a060] create: I/O buffer
      1 [0xb1a060] free: I/O buffer
      1 [0xb2a070] create: write request
      1 [0xb2a070] free: write request
      1 [0xb2a140] create: I/O buffer
      1 [0xb2a140] free: I/O buffer
      1 [0xb3a150] create: write request
      1 [0xb3a150] free: write request
      1 [0xb3a220] create: I/O buffer
      1 [0xb3a220] free: I/O buffer
      1 [0xb4a230] create: write request
      1 [0xb4a230] free: write request
      1 [0xb4a300] create: I/O buffer
      1 [0xb4a300] free: I/O buffer
      1 [0xb5a310] create: write request
      1 [0xb5a310] free: write request
      1 [0xb5a3e0] create: I/O buffer
      1 [0xb5a3e0] free: I/O buffer
      1 [0xb6a3f0] create: write request
      1 [0xb6a3f0] free: write request
      1 [0xb6a4c0] create: I/O buffer
      1 [0xb6a4c0] free: I/O buffer
      1 [0xb7a4d0] create: write request
      1 [0xb7a4d0] free: write request
      1 [0xb7a5a0] create: I/O buffer
      1 [0xb7a5a0] free: I/O buffer
      1 [0xb8a5b0] create: write request
      1 [0xb8a5b0] free: write request
      1 [0xb8a680] create: I/O buffer
      1 [0xb8a680] free: I/O buffer
      1 [0xb9a690] create: write request
      1 [0xb9a690] free: write request
      1 [0xb9a760] create: I/O buffer
      1 [0xb9a760] free: I/O buffer
      1 [0xbaa770] create: write request
      1 [0xbaa770] free: write request
      1 [0xbaa840] create: I/O buffer
      1 [0xbaa840] free: I/O buffer
      1 [0xbba850] create: write request
      1 [0xbba850] free: write request
      1 [0xbba920] create: I/O buffer
      1 [0xbba920] free: I/O buffer
      1 [0xbca930] create: write request
      1 [0xbca930] free: write request
      1 [0xbcaa00] create: I/O buffer
      1 [0xbcaa00] free: I/O buffer
      1 [0xbdaa10] create: write request
      1 [0xbdaa10] free: write request
      1 [0xbdaae0] create: I/O buffer
      1 [0xbdaae0] free: I/O buffer
      1 [0xbeaaf0] create: write request
      1 [0xbeaaf0] free: write request
      1 [0xbeabc0] create: I/O buffer
      1 [0xbeabc0] free: I/O buffer
      1 [0xbfabd0] create: write request
      1 [0xbfabd0] free: write request
      1 1048576 bytes (1.0 MB) copied, 0.00733264 s, 143 MB/s
      1 1+0 records in
      1 1+0 records out
     16 write: EPIPE (-32): broken pipe
     32 write_queue_size@read_cb=[0]
     32 write_queue_size@write_cb=[6300144]
#include <uv.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>


#define PRINT_UV_ERR(prefix, code)  do {\
    fflush(stdout);\
    fprintf(stderr, "%s: %s (%i): %s\n", prefix, uv_err_name(code), 
(int)(code), uv_strerror(code));\
    fflush(stderr);\
} while (0)


/* assuming that stdin and stdout can be handled with as pipes */
uv_pipe_t in, out;


void alloc_cb(uv_handle_t*, size_t, uv_buf_t*);
void read_cb(uv_stream_t*, ssize_t, const uv_buf_t*);
void write_cb(uv_write_t*, int);



int main(int _argc, char *_argv[])
{
  int ret = 0;

#ifdef BLOCK_SIGPIPE
  sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGPIPE);
  ret = sigprocmask(SIG_BLOCK, &set, NULL);
  if (ret != 0)
  {
    perror("sigprocmask");
    return ret;
  };
#endif

  uv_loop_t *loop = uv_default_loop();

  uv_pipe_init(loop, &in, 0);
  ret = uv_pipe_open(&in, fileno(stdin));
  if (ret < 0)
  {
    PRINT_UV_ERR("stdin open", ret);
    return ret;
  };

  uv_pipe_init(loop, &out, 0);
  ret = uv_pipe_open(&out, fileno(stdout));
  if (ret < 0)
  {
    PRINT_UV_ERR("stdout open", ret);
    return ret;
  };

  uv_read_start((uv_stream_t*)&in, alloc_cb, read_cb);

  return uv_run(loop, UV_RUN_DEFAULT);
}



void alloc_cb(uv_handle_t *_handle, size_t _suggested_size, uv_buf_t *_buf)
{
  /* allocate the memory for a new I/O buffer */
  *_buf = uv_buf_init((char*)malloc(_suggested_size), _suggested_size);
#ifndef NDEBUG
  fprintf(stderr, "[%p] create: I/O buffer\n", _buf->base);  fflush(stderr);
#endif
}


void read_cb(uv_stream_t *_stream, ssize_t _nread, const uv_buf_t *_buf)
{
  if (_nread < 0)
  {
    PRINT_UV_ERR("read", _nread);
    uv_read_stop(_stream);
  }
  else if (_nread > 0)
  {
    /* initialize a new buffer descriptor specifying the actual data length */
    uv_buf_t buf = uv_buf_init(_buf->base, _nread);

    /* create a write request descriptor */
    uv_write_t *wr = (uv_write_t*)malloc(sizeof(uv_write_t));
#ifndef NDEBUG
    fprintf(stderr, "[%p] create: write request\n", (void*)wr);  fflush(stderr);
    fprintf(stderr, "write_queue_size@read_cb=[%zu]\n", 
((uv_stream_t*)wr)->write_queue_size);  fflush(stderr);
#endif

    /* save a reference to the output buffer somehow along with the write 
request */
    wr->data = _buf->base;

    /* fire up the write request */
    uv_write(wr, (uv_stream_t*)&out, &buf, 1, write_cb);

    /* the I/O buffer being used up should be deleted somewhere */
  }
}


void write_cb(uv_write_t *_wr, int _status)
{
  if (_status < 0)
  {
    PRINT_UV_ERR("write", _status);
    uv_read_stop((uv_stream_t*)&in);
  };
#ifndef NDEBUG
    fprintf(stderr, "write_queue_size@write_cb=[%zu]\n", 
((uv_stream_t*)_wr)->write_queue_size);  fflush(stderr);
#endif

  /* when the write request has completed it's safe to free up the memory 
allocated for the I/O buffer */
  free(_wr->data);
#ifndef NDEBUG
  fprintf(stderr, "[%p] free: I/O buffer\n", _wr->data);  fflush(stderr);
#endif

  /* delete the write request descriptor */
  free(_wr);
#ifndef NDEBUG
  fprintf(stderr, "[%p] free: write request\n", (void*)_wr);  fflush(stderr);
#endif
}

Reply via email to