@@ -231,7 +231,7 @@ extern "C" LEAN_EXPORT lean_obj_res lean_uv_tcp_send(b_obj_arg socket, obj_arg d
231231        lean_dec (socket);
232232        lean_dec (data_array);
233233        free (bufs);
234-          
234+ 
235235        free (write_uv->data );
236236        free (write_uv);
237237
@@ -524,6 +524,37 @@ extern "C" LEAN_EXPORT lean_obj_res lean_uv_tcp_accept(b_obj_arg socket, obj_arg
524524    return  lean_io_result_mk_ok (promise);
525525}
526526
527+ /*  Std.Internal.UV.TCP.Socket.tryAccept (socket : @& Socket) : IO (Except IO.Error (Option Socket)) */ 
528+ extern  " C" lean_uv_tcp_try_accept (b_obj_arg socket, obj_arg /*  w */ 
529+     lean_uv_tcp_socket_object* tcp_socket = lean_to_uv_tcp_socket (socket);
530+ 
531+     //  Locking early prevents potential parallelism issues setting m_promise_accept.
532+     event_loop_lock (&global_ev);
533+ 
534+     if  (tcp_socket->m_promise_accept  != nullptr ) {
535+         return  lean_io_result_mk_error (lean_decode_uv_error (UV_EALREADY, mk_string (" parallel accept is not allowed! consider binding multiple sockets to the same address and accepting on them instead" 
536+     }
537+ 
538+     lean_object* client = lean_io_result_take_value (lean_uv_tcp_new (lean_box (0 )));
539+     lean_uv_tcp_socket_object* client_socket = lean_to_uv_tcp_socket (client);
540+ 
541+     int  result = uv_accept ((uv_stream_t *)tcp_socket->m_uv_tcp , (uv_stream_t *)client_socket->m_uv_tcp );
542+ 
543+     if  (result < 0  && result != UV_EAGAIN) {
544+         event_loop_unlock (&global_ev);
545+         lean_dec (client);
546+         return  lean_io_result_mk_error (lean_decode_uv_error (result, NULL ));
547+     } else  if  (result >= 0 ) {
548+         event_loop_unlock (&global_ev);
549+         return  lean_io_result_mk_ok (mk_except_ok (lean::mk_option_some (client)));
550+     } else  {
551+         event_loop_unlock (&global_ev);
552+         lean_dec (client);
553+         return  lean_io_result_mk_ok (mk_except_ok (lean::mk_option_none ()));
554+     }
555+ }
556+ 
557+ 
527558
528559/*  Std.Internal.UV.TCP.Socket.cancelAccept (socket : @& Socket) : IO Unit */ 
529560extern  " C" lean_uv_tcp_cancel_accept (b_obj_arg socket, obj_arg /*  w */ 
@@ -718,6 +749,12 @@ extern "C" LEAN_EXPORT lean_obj_res lean_uv_tcp_listen(b_obj_arg socket, int32_t
718749    );
719750}
720751
752+ extern  " C" lean_uv_tcp_cancel_accept (b_obj_arg socket, obj_arg /*  w */ 
753+     lean_always_assert (
754+         false  && (" Please build a version of Lean4 with libuv to invoke this." 
755+     );
756+ }
757+ 
721758extern  " C" lean_uv_tcp_accept (b_obj_arg socket, obj_arg /*  w */ 
722759    lean_always_assert (
723760        false  && (" Please build a version of Lean4 with libuv to invoke this." 
0 commit comments