@@ -39,6 +39,8 @@ static const uv_buf_t uv_null_buf_ = { 0, NULL };
3939/* when the local ends wants to shut it down. */
4040static const int64_t eof_timeout = 50 ; /* ms */
4141
42+ static const int default_pending_pipe_instances = 4 ;
43+
4244/* IPC protocol flags. */
4345#define UV_IPC_RAW_DATA 0x0001
4446#define UV_IPC_UV_STREAM 0x0002
@@ -293,6 +295,12 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
293295 }
294296 }
295297
298+ if (handle -> flags & UV_HANDLE_PIPESERVER ) {
299+ assert (handle -> accept_reqs );
300+ free (handle -> accept_reqs );
301+ handle -> accept_reqs = NULL ;
302+ }
303+
296304 /* Remember the state of this flag because the close callback is */
297305 /* allowed to clobber or free the handle's memory */
298306 uv_alloced = handle -> flags & UV_HANDLE_UV_ALLOCED ;
@@ -310,6 +318,12 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
310318}
311319
312320
321+ void uv_pipe_pending_instances (uv_pipe_t * handle , int count ) {
322+ handle -> pending_instances = count ;
323+ handle -> flags |= UV_HANDLE_PIPESERVER ;
324+ }
325+
326+
313327/* Creates a pipe server. */
314328int uv_pipe_bind (uv_pipe_t * handle , const char * name ) {
315329 uv_loop_t * loop = handle -> loop ;
@@ -326,7 +340,17 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
326340 return -1 ;
327341 }
328342
329- for (i = 0 ; i < COUNTOF (handle -> accept_reqs ); i ++ ) {
343+ if (!(handle -> flags & UV_HANDLE_PIPESERVER )) {
344+ handle -> pending_instances = default_pending_pipe_instances ;
345+ }
346+
347+ handle -> accept_reqs = (uv_pipe_accept_t * )
348+ malloc (sizeof (uv_pipe_accept_t ) * handle -> pending_instances );
349+ if (!handle -> accept_reqs ) {
350+ uv_fatal_error (ERROR_OUTOFMEMORY , "malloc" );
351+ }
352+
353+ for (i = 0 ; i < handle -> pending_instances ; i ++ ) {
330354 req = & handle -> accept_reqs [i ];
331355 uv_req_init (loop , (uv_req_t * ) req );
332356 req -> type = UV_ACCEPT ;
@@ -537,14 +561,13 @@ void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err) {
537561 }
538562
539563 if (handle -> flags & UV_HANDLE_PIPESERVER ) {
540- for (i = 0 ; i < COUNTOF ( handle -> accept_reqs ) ; i ++ ) {
564+ for (i = 0 ; i < handle -> pending_instances ; i ++ ) {
541565 pipeHandle = handle -> accept_reqs [i ].pipeHandle ;
542566 if (pipeHandle != INVALID_HANDLE_VALUE ) {
543567 CloseHandle (pipeHandle );
544568 handle -> accept_reqs [i ].pipeHandle = INVALID_HANDLE_VALUE ;
545569 }
546570 }
547-
548571 }
549572
550573 if (handle -> flags & UV_HANDLE_CONNECTION ) {
@@ -686,7 +709,7 @@ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
686709 /* First pipe handle should have already been created in uv_pipe_bind */
687710 assert (handle -> accept_reqs [0 ].pipeHandle != INVALID_HANDLE_VALUE );
688711
689- for (i = 0 ; i < COUNTOF ( handle -> accept_reqs ) ; i ++ ) {
712+ for (i = 0 ; i < handle -> pending_instances ; i ++ ) {
690713 uv_pipe_queue_accept (loop , handle , & handle -> accept_reqs [i ], i == 0 );
691714 }
692715
0 commit comments