@@ -11,7 +11,7 @@ use std::{
1111 ops:: Deref ,
1212 panic:: RefUnwindSafe ,
1313 str:: { FromStr , from_utf8} ,
14- sync:: Arc ,
14+ sync:: { Arc , Mutex } ,
1515 time:: Duration ,
1616} ;
1717
@@ -20,7 +20,7 @@ use biome_service::{
2020 TransportError ,
2121 workspace:: { TransportRequest , WorkspaceTransport } ,
2222} ;
23- use dashmap :: DashMap ;
23+ use papaya :: HashMap ;
2424use serde:: { Deserialize , Serialize , de:: DeserializeOwned } ;
2525use serde_json:: {
2626 Value , from_slice, from_str, to_vec,
@@ -65,6 +65,7 @@ pub fn open_transport(runtime: Runtime) -> io::Result<Option<impl WorkspaceTrans
6565}
6666
6767type JsonRpcResult = Result < Box < RawValue > , TransportError > ;
68+ type PendingChannel = Mutex < Option < oneshot:: Sender < JsonRpcResult > > > ;
6869
6970/// Implementation of [WorkspaceTransport] for types implementing [AsyncRead]
7071/// and [AsyncWrite]
@@ -110,11 +111,11 @@ pub struct SocketTransport {
110111/// automatically when the handle is dropped
111112#[ derive( Clone , Default ) ]
112113struct PendingRequests {
113- inner : Arc < DashMap < u64 , oneshot :: Sender < JsonRpcResult > > > ,
114+ inner : Arc < HashMap < u64 , PendingChannel > > ,
114115}
115116
116117impl Deref for PendingRequests {
117- type Target = DashMap < u64 , oneshot :: Sender < JsonRpcResult > > ;
118+ type Target = HashMap < u64 , PendingChannel > ;
118119
119120 fn deref ( & self ) -> & Self :: Target {
120121 self . inner . as_ref ( )
@@ -131,7 +132,7 @@ impl Deref for PendingRequests {
131132/// are cancelled immediately instead of timing out.
132133impl Drop for PendingRequests {
133134 fn drop ( & mut self ) {
134- self . inner . clear ( ) ;
135+ self . inner . pin ( ) . clear ( ) ;
135136 }
136137}
137138
@@ -192,7 +193,9 @@ impl WorkspaceTransport for SocketTransport {
192193 {
193194 let ( send, recv) = oneshot:: channel ( ) ;
194195
195- self . pending_requests . insert ( request. id , send) ;
196+ self . pending_requests
197+ . pin ( )
198+ . insert ( request. id , Mutex :: new ( Some ( send) ) ) ;
196199
197200 let is_shutdown = request. method == "biome/shutdown" ;
198201
@@ -273,8 +276,12 @@ where
273276 break ;
274277 }
275278 } ;
279+ let channel = pending_requests
280+ . pin ( )
281+ . remove ( & response. id )
282+ . and_then ( |ch| ch. lock ( ) . ok ( ) ?. take ( ) ) ;
276283
277- if let Some ( ( _ , channel) ) = pending_requests . remove ( & response . id ) {
284+ if let Some ( channel) = channel {
278285 let response = match ( response. result , response. error ) {
279286 ( Some ( result) , None ) => Ok ( result) ,
280287 ( None , Some ( err) ) => Err ( TransportError :: RPCError ( err. message ) ) ,
0 commit comments