1
- use std:: cell:: RefCell ;
2
1
use std:: fmt:: Debug ;
3
2
use std:: io:: Write ;
4
3
use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
4
+ use std:: sync:: { Arc , Mutex } ;
5
5
6
6
use byteorder:: { BigEndian , WriteBytesExt } ;
7
7
use log:: { debug, error, info} ;
@@ -40,7 +40,7 @@ pub struct Client {
40
40
41
41
managed_accounts : String ,
42
42
client_id : i32 , // ID of client.
43
- pub ( crate ) message_bus : RefCell < Box < dyn MessageBus > > ,
43
+ pub ( crate ) message_bus : Arc < Mutex < dyn MessageBus > > ,
44
44
next_request_id : AtomicI32 , // Next available request_id.
45
45
order_id : AtomicI32 , // Next available order_id. Starts with value returned on connection.
46
46
}
@@ -67,11 +67,11 @@ impl Client {
67
67
/// println!("next_order_id: {}", client.next_order_id());
68
68
/// ```
69
69
pub fn connect ( address : & str , client_id : i32 ) -> Result < Client , Error > {
70
- let message_bus = RefCell :: new ( Box :: new ( TcpMessageBus :: connect ( address) ?) ) ;
70
+ let message_bus = Arc :: new ( Mutex :: new ( TcpMessageBus :: connect ( address) ?) ) ;
71
71
Client :: do_connect ( client_id, message_bus)
72
72
}
73
73
74
- fn do_connect ( client_id : i32 , message_bus : RefCell < Box < dyn MessageBus > > ) -> Result < Client , Error > {
74
+ fn do_connect ( client_id : i32 , message_bus : Arc < Mutex < dyn MessageBus > > ) -> Result < Client , Error > {
75
75
let mut client = Client {
76
76
server_version : 0 ,
77
77
connection_time : None ,
@@ -87,7 +87,11 @@ impl Client {
87
87
client. start_api ( ) ?;
88
88
client. receive_account_info ( ) ?;
89
89
90
- client. message_bus . borrow_mut ( ) . process_messages ( client. server_version ) ?;
90
+ client
91
+ . message_bus
92
+ . lock ( )
93
+ . expect ( "MessageBus is poisoned" )
94
+ . process_messages ( client. server_version ) ?;
91
95
92
96
Ok ( client)
93
97
}
@@ -98,9 +102,9 @@ impl Client {
98
102
let version = format ! ( "v{MIN_SERVER_VERSION}..{MAX_SERVER_VERSION}" ) ;
99
103
100
104
let packet = prefix. to_owned ( ) + & encode_packet ( & version) ;
101
- self . message_bus . borrow_mut ( ) . write ( & packet) ?;
105
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . write ( & packet) ?;
102
106
103
- let ack = self . message_bus . borrow_mut ( ) . read_message ( ) ;
107
+ let ack = self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . read_message ( ) ;
104
108
105
109
match ack {
106
110
Ok ( mut response_message) => {
@@ -133,7 +137,7 @@ impl Client {
133
137
prelude. push_field ( & "" ) ;
134
138
}
135
139
136
- self . message_bus . borrow_mut ( ) . write_message ( prelude) ?;
140
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . write_message ( prelude) ?;
137
141
138
142
Ok ( ( ) )
139
143
}
@@ -146,7 +150,7 @@ impl Client {
146
150
let mut attempts = 0 ;
147
151
const MAX_ATTEMPTS : i32 = 100 ;
148
152
loop {
149
- let mut message = self . message_bus . borrow_mut ( ) . read_message ( ) ?;
153
+ let mut message = self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . read_message ( ) ?;
150
154
151
155
match message. message_type ( ) {
152
156
IncomingMessages :: NextValidId => {
@@ -886,7 +890,7 @@ impl Client {
886
890
// == Internal Use ==
887
891
888
892
#[ cfg( test) ]
889
- pub ( crate ) fn stubbed ( message_bus : RefCell < Box < dyn MessageBus > > , server_version : i32 ) -> Client {
893
+ pub ( crate ) fn stubbed ( message_bus : Arc < Mutex < dyn MessageBus > > , server_version : i32 ) -> Client {
890
894
Client {
891
895
server_version : server_version,
892
896
connection_time : None ,
@@ -900,47 +904,56 @@ impl Client {
900
904
}
901
905
902
906
pub ( crate ) fn send_message ( & self , packet : RequestMessage ) -> Result < ( ) , Error > {
903
- self . message_bus . borrow_mut ( ) . write_message ( & packet)
907
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . write_message ( & packet)
904
908
}
905
909
906
910
pub ( crate ) fn send_request ( & self , request_id : i32 , message : RequestMessage ) -> Result < ResponseIterator , Error > {
907
911
debug ! ( "send_message({:?}, {:?})" , request_id, message) ;
908
- self . message_bus . borrow_mut ( ) . send_generic_message ( request_id, & message)
912
+ self . message_bus
913
+ . lock ( )
914
+ . expect ( "MessageBus is poisoned" )
915
+ . send_generic_message ( request_id, & message)
909
916
}
910
917
911
918
pub ( crate ) fn send_durable_request ( & self , request_id : i32 , message : RequestMessage ) -> Result < ResponseIterator , Error > {
912
919
debug ! ( "send_durable_request({:?}, {:?})" , request_id, message) ;
913
- self . message_bus . borrow_mut ( ) . send_durable_message ( request_id, & message)
920
+ self . message_bus
921
+ . lock ( )
922
+ . expect ( "MessageBus is poisoned" )
923
+ . send_durable_message ( request_id, & message)
914
924
}
915
925
916
926
pub ( crate ) fn send_order ( & self , order_id : i32 , message : RequestMessage ) -> Result < ResponseIterator , Error > {
917
927
debug ! ( "send_order({:?}, {:?})" , order_id, message) ;
918
- self . message_bus . borrow_mut ( ) . send_order_message ( order_id, & message)
928
+ self . message_bus
929
+ . lock ( )
930
+ . expect ( "MessageBus is poisoned" )
931
+ . send_order_message ( order_id, & message)
919
932
}
920
933
921
934
/// Sends request for the next valid order id.
922
935
pub ( crate ) fn request_next_order_id ( & self , message : RequestMessage ) -> Result < GlobalResponseIterator , Error > {
923
- self . message_bus . borrow_mut ( ) . request_next_order_id ( & message)
936
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . request_next_order_id ( & message)
924
937
}
925
938
926
939
/// Sends request for open orders.
927
940
pub ( crate ) fn request_order_data ( & self , message : RequestMessage ) -> Result < GlobalResponseIterator , Error > {
928
- self . message_bus . borrow_mut ( ) . request_open_orders ( & message)
941
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . request_open_orders ( & message)
929
942
}
930
943
931
944
/// Sends request for market rule.
932
945
pub ( crate ) fn request_market_rule ( & self , message : RequestMessage ) -> Result < GlobalResponseIterator , Error > {
933
- self . message_bus . borrow_mut ( ) . request_market_rule ( & message)
946
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . request_market_rule ( & message)
934
947
}
935
948
936
949
/// Sends request for positions.
937
950
pub ( crate ) fn request_positions ( & self , message : RequestMessage ) -> Result < GlobalResponseIterator , Error > {
938
- self . message_bus . borrow_mut ( ) . request_positions ( & message)
951
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . request_positions ( & message)
939
952
}
940
953
941
954
/// Sends request for family codes.
942
955
pub ( crate ) fn request_family_codes ( & self , message : RequestMessage ) -> Result < GlobalResponseIterator , Error > {
943
- self . message_bus . borrow_mut ( ) . request_family_codes ( & message)
956
+ self . message_bus . lock ( ) . expect ( "MessageBus is poisoned" ) . request_family_codes ( & message)
944
957
}
945
958
946
959
pub ( crate ) fn check_server_version ( & self , version : i32 , message : & str ) -> Result < ( ) , Error > {
0 commit comments