2
2
3
3
use std:: collections:: HashMap ;
4
4
use std:: str:: FromStr ;
5
- use std:: sync:: { Arc , Mutex } ;
6
5
7
6
use quil_rs:: Program ;
8
7
use rmp_serde:: Serializer ;
@@ -19,7 +18,6 @@ pub(crate) const DEFAULT_CLIENT_TIMEOUT: f64 = 30.0;
19
18
#[ derive( Clone ) ]
20
19
pub struct Client {
21
20
pub ( crate ) endpoint : String ,
22
- socket : Arc < Mutex < Socket > > ,
23
21
}
24
22
25
23
impl std:: fmt:: Debug for Client {
@@ -31,12 +29,7 @@ impl std::fmt::Debug for Client {
31
29
impl Client {
32
30
/// Construct a new [`Client`] with no authentication configured.
33
31
pub fn new ( endpoint : & str ) -> Result < Self , Error > {
34
- let socket = Context :: new ( )
35
- . socket ( SocketType :: DEALER )
36
- . map_err ( Error :: SocketCreation ) ?;
37
- socket. connect ( endpoint) . map_err ( Error :: Communication ) ?;
38
32
Ok ( Self {
39
- socket : Arc :: new ( Mutex :: new ( socket) ) ,
40
33
endpoint : endpoint. to_owned ( ) ,
41
34
} )
42
35
}
@@ -50,37 +43,55 @@ impl Client {
50
43
& self ,
51
44
request : & RPCRequest < ' _ , Request > ,
52
45
) -> Result < Response , Error > {
53
- self . send ( request) ?;
54
- self . receive :: < Response > ( & request. id )
46
+ let socket = self . create_socket ( ) ?;
47
+ Self :: send ( request, & socket) ?;
48
+ Self :: receive :: < Response > ( & request. id , & socket)
55
49
}
56
50
57
51
/// Send an RPC request.
58
52
///
59
53
/// # Arguments
60
54
///
61
55
/// * `request`: An [`RPCRequest`] containing some params.
62
- pub ( crate ) fn send < Request : Serialize > (
63
- & self ,
56
+ /// * `socket`: The ZMQ socket to send the request on.
57
+ fn send < Request : Serialize > (
64
58
request : & RPCRequest < ' _ , Request > ,
59
+ socket : & Socket ,
65
60
) -> Result < ( ) , Error > {
66
61
let mut data = vec ! [ ] ;
67
62
request
68
63
. serialize ( & mut Serializer :: new ( & mut data) . with_struct_map ( ) )
69
64
. map_err ( Error :: Serialization ) ?;
70
65
71
- self . socket
72
- . lock ( )
73
- . map_err ( |e| Error :: ZmqSocketLock ( e. to_string ( ) ) ) ?
74
- . send ( data, 0 )
75
- . map_err ( Error :: Communication )
66
+ socket. send ( data, 0 ) . map_err ( Error :: Communication )
67
+ }
68
+
69
+ /// Creates a new ZMQ socket and connects it to the endpoint.
70
+ ///
71
+ /// [`SocketType::DEALER`] for compatiblity with the quilc servers
72
+ /// [`SocketType::ROUTER`]. These sockets are _not_ thread safe, even
73
+ /// with a mutex, so a new socket should be created for each request,
74
+ /// and the socket should not be shared between threads.
75
+ fn create_socket ( & self ) -> Result < Socket , Error > {
76
+ let socket = Context :: new ( )
77
+ . socket ( SocketType :: DEALER )
78
+ . map_err ( Error :: SocketCreation ) ?;
79
+ socket
80
+ . connect ( & self . endpoint . clone ( ) )
81
+ . map_err ( Error :: Communication ) ?;
82
+ socket. set_linger ( 0 ) . map_err ( Error :: Communication ) ?;
83
+ Ok ( socket)
76
84
}
77
85
78
86
/// Retrieve and decode a response
79
87
///
80
88
/// returns: Result<Response, Error> where Response is a generic type that implements
81
89
/// [`DeserializeOwned`] (meaning [`Deserialize`] with no lifetimes).
82
- fn receive < Response : DeserializeOwned > ( & self , request_id : & str ) -> Result < Response , Error > {
83
- let data = self . receive_raw ( ) ?;
90
+ fn receive < Response : DeserializeOwned > (
91
+ request_id : & str ,
92
+ socket : & Socket ,
93
+ ) -> Result < Response , Error > {
94
+ let data = Self :: receive_raw ( socket) ?;
84
95
85
96
let reply: RPCResponse < Response > =
86
97
rmp_serde:: from_read ( data. as_slice ( ) ) . map_err ( Error :: Deserialization ) ?;
@@ -97,12 +108,8 @@ impl Client {
97
108
}
98
109
99
110
/// Retrieve the raw bytes of a response
100
- pub ( crate ) fn receive_raw ( & self ) -> Result < Vec < u8 > , Error > {
101
- self . socket
102
- . lock ( )
103
- . map_err ( |e| Error :: ZmqSocketLock ( e. to_string ( ) ) ) ?
104
- . recv_bytes ( 0 )
105
- . map_err ( Error :: Communication )
111
+ fn receive_raw ( socket : & Socket ) -> Result < Vec < u8 > , Error > {
112
+ socket. recv_bytes ( 0 ) . map_err ( Error :: Communication )
106
113
}
107
114
}
108
115
0 commit comments