1- use std:: { cell :: RefCell , os:: windows:: io:: AsRawHandle , path:: Path , time:: Duration } ;
1+ use std:: { os:: windows:: io:: AsRawHandle , path:: Path , time:: Duration } ;
22
33use tokio:: {
44 io:: { AsyncBufReadExt , AsyncWriteExt , BufStream } ,
@@ -45,20 +45,20 @@ impl Socket for BufStream<NamedPipeServer> {
4545
4646/// A server for the `askpass` protocol using Tokio.
4747pub struct TokioAskpassServer {
48- server : Mutex < RefCell < NamedPipeServer > > ,
48+ server : Mutex < NamedPipeServer > ,
4949 connection_string : String ,
5050}
5151
5252impl TokioAskpassServer {
5353 pub ( crate ) fn new ( ) -> Result < Self , std:: io:: Error > {
5454 let connection_string = format ! ( "{ASKPASS_PIPE_PREFIX}{}" , rand:: random:: <u64 >( ) ) ;
5555
56- let server = Mutex :: new ( RefCell :: new (
56+ let server = Mutex :: new (
5757 ServerOptions :: new ( )
5858 . first_pipe_instance ( true )
5959 . max_instances ( 2 )
6060 . create ( & connection_string) ?,
61- ) ) ;
61+ ) ;
6262
6363 Ok ( TokioAskpassServer {
6464 server,
@@ -71,21 +71,22 @@ impl AskpassServer for TokioAskpassServer {
7171 type Error = std:: io:: Error ;
7272 type SocketHandle = BufStream < NamedPipeServer > ;
7373
74- // We can ignore clippy here since we locked the mutex.
75- #[ expect( clippy:: await_holding_refcell_ref) ]
7674 async fn accept ( & self , timeout : Option < Duration > ) -> Result < Self :: SocketHandle , Self :: Error > {
77- let server = self . server . lock ( ) . await ;
75+ let mut server = self . server . lock ( ) . await ;
7876
7977 if let Some ( timeout) = timeout {
80- tokio:: time:: timeout ( timeout, server. borrow ( ) . connect ( ) ) . await ??;
78+ tokio:: time:: timeout ( timeout, server. connect ( ) ) . await ??;
8179 } else {
82- server. borrow ( ) . connect ( ) . await ?;
80+ server. connect ( ) . await ?;
8381 }
8482
8583 // Windows is weird. The server becomes the peer connection,
8684 // and before we use the new connection, we first create
8785 // a new server to listen for the next connection.
88- let client = server. replace ( ServerOptions :: new ( ) . create ( & self . connection_string ) ?) ;
86+ let client = std:: mem:: replace (
87+ & mut * server,
88+ ServerOptions :: new ( ) . create ( & self . connection_string ) ?,
89+ ) ;
8990
9091 Ok ( tokio:: io:: BufStream :: new ( client) )
9192 }
@@ -101,7 +102,7 @@ impl core::fmt::Display for TokioAskpassServer {
101102impl Drop for TokioAskpassServer {
102103 fn drop ( & mut self ) {
103104 // Best effort
104- let _ = self . server . get_mut ( ) . get_mut ( ) . disconnect ( ) ;
105+ let _ = self . server . get_mut ( ) . disconnect ( ) ;
105106 }
106107}
107108
0 commit comments