On Wed, May 18, 2016 at 8:54 PM, 'Mikeus' via libuv
<[email protected]> wrote:
> Hello, everyone.
>
> I've written the following simple test program that copies its stdin to 
> stdout:
>
> ------- 8< ------- 8< ------- 8< --------
> #include <uv.h>
> #include <stdlib.h>
> #include <stdio.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;
>
>   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);
> }
>
>
> void read_cb(uv_stream_t *_stream, ssize_t _nread, const uv_buf_t *_buf)
> {
>   if (_nread < 0)
>   {
>     uv_read_stop(_stream);
>     if (_nread != UV_EOF)  PRINT_UV_ERR("read", _nread);
>   }
>   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));
>
>     /* 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);
>   };
>
>   /* when the write request has completed it's safe to free up the memory 
> allocated for the I/O buffer */
>   free(_wr->data);
>
>   /* delete the write request descriptor */
>   free(_wr);
> }
> ------- >8 ------- >8 ------- >8 --------
>
>
>
> And when I am running it with the following command line on Linux:
> $ cat /dev/zero | ./cpio-uv | dd of=/dev/null iflag=fullblock bs=1M count=100
>
> I observe that the memory used by the program is constantly growing during 
> the program run until the program ends
> and it is seen like if free() functions in write_cb() is not ever called.
> And if the amount of data being pumping would be increased in dd count 
> parameter up to the 500
> then the available physical memory of 8G becomes exhausted and the swapping 
> process begins slowing down the system response.
>
> The build command is:
> $ c++ -std=c++1y -Wall -Wpedantic -O2  ./example/cpio-uv.c  -luv -o cpio-uv
>
> or
>
> $ gcc -std=c99  -Wall -Wpedantic -O2 -D _DEFAULT_SOURCE  ./example/cpio-uv.c  
> -luv -o cpio-uv
>
> $ gcc --version
> gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
>
>
> Have anyone come across with this issue?
>
>
> The problem does not appear on Windows where I use Mingw-64 with Cygwin shell.
>
> $ x86_64-w64-mingw32-c++ -std=c++1y -Wall -Wpedantic -O2 \
>                          -I 
> /cygdrive/d/wroot/libuv/uvcc/uvcc.git/libuv-x64-v1.9.0.build9/include \
>                          -D _WIN32_WINNT=0x0601 -static-libgcc 
> -static-libstdc++    ./example/cpio-uv.c \
>                          -L 
> /cygdrive/d/wroot/libuv/uvcc/uvcc.git/libuv-x64-v1.9.0.build9 -luv -lWs2_32 \
>                          -o cpio-uv
>
> $ x86_64-w64-mingw32-c++ --version
> x86_64-w64-mingw32-c++ (GCC) 4.9.2
>
>
> Thanks.
>
> --
> Mike

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?

-- 
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.

Reply via email to