@@ -5,15 +5,16 @@ use std::error::Error;
5
5
use common:: rpc:: new_rpc_system;
6
6
use capnp_rpc:: rpc_twoparty_capnp;
7
7
use futures:: Future ;
8
- use std:: cell:: Ref ;
9
8
10
9
use super :: task:: Task ;
11
10
use common:: id:: { DataObjectId , TaskId } ;
12
11
use common:: convert:: { FromCapnp , ToCapnp } ;
13
12
use client:: dataobject:: DataObject ;
13
+ use std:: cell:: RefCell ;
14
+ use std:: cell:: RefMut ;
14
15
15
16
pub struct Communicator {
16
- core : Core ,
17
+ core : RefCell < Core > ,
17
18
service : :: client_capnp:: client_service:: Client ,
18
19
}
19
20
@@ -36,19 +37,22 @@ impl Communicator {
36
37
37
38
let service = core. run ( request. send ( ) . promise ) ?. get ( ) ?. get_service ( ) ?;
38
39
39
- Ok ( Self { core, service } )
40
+ Ok ( Self {
41
+ core : RefCell :: new ( core) ,
42
+ service,
43
+ } )
40
44
}
41
45
42
- pub fn new_session ( & mut self ) -> Result < i32 , Box < Error > > {
43
- let id: i32 = self . core
46
+ pub fn new_session ( & self ) -> Result < i32 , Box < Error > > {
47
+ let id: i32 = self . comm ( )
44
48
. run ( self . service . new_session_request ( ) . send ( ) . promise ) ?
45
49
. get ( ) ?
46
50
. get_session_id ( ) ;
47
51
48
52
Ok ( id)
49
53
}
50
- pub fn close_session ( & mut self , id : i32 ) -> Result < ( ) , Box < Error > > {
51
- self . core . run ( {
54
+ pub fn close_session ( & self , id : i32 ) -> Result < ( ) , Box < Error > > {
55
+ self . comm ( ) . run ( {
52
56
let mut req = self . service . close_session_request ( ) ;
53
57
req. get ( ) . set_session_id ( id) ;
54
58
req. send ( ) . promise
@@ -57,13 +61,18 @@ impl Communicator {
57
61
Ok ( ( ) )
58
62
}
59
63
60
- pub fn submit < D > ( & mut self , tasks : & [ Ref < Task > ] , data_objects : & [ D ] ) -> Result < ( ) , Box < Error > >
64
+ pub fn submit < T , D > ( & self , tasks : & [ T ] , data_objects : & [ D ] ) -> Result < ( ) , Box < Error > >
61
65
where
66
+ T : AsRef < Task > ,
62
67
D : AsRef < DataObject > ,
63
68
{
64
69
let mut req = self . service . submit_request ( ) ;
65
70
66
- to_capnp_list ! ( req. get( ) , tasks, init_tasks) ;
71
+ to_capnp_list ! (
72
+ req. get( ) ,
73
+ tasks. iter( ) . map( |t| t. as_ref( ) ) . collect:: <Vec <& Task >>( ) ,
74
+ init_tasks
75
+ ) ;
67
76
to_capnp_list ! (
68
77
req. get( ) ,
69
78
data_objects
@@ -72,47 +81,47 @@ impl Communicator {
72
81
. collect:: <Vec <& DataObject >>( ) ,
73
82
init_objects
74
83
) ;
75
- self . core . run ( req. send ( ) . promise ) ?;
84
+ self . comm ( ) . run ( req. send ( ) . promise ) ?;
76
85
77
86
Ok ( ( ) )
78
87
}
79
88
80
- pub fn unkeep ( & mut self , objects : & [ DataObjectId ] ) -> Result < ( ) , Box < Error > > {
89
+ pub fn unkeep ( & self , objects : & [ DataObjectId ] ) -> Result < ( ) , Box < Error > > {
81
90
let mut req = self . service . unkeep_request ( ) ;
82
91
to_capnp_list ! ( req. get( ) , objects, init_object_ids) ;
83
- self . core . run ( req. send ( ) . promise ) ?;
92
+ self . comm ( ) . run ( req. send ( ) . promise ) ?;
84
93
Ok ( ( ) )
85
94
}
86
95
87
- pub fn wait ( & mut self , tasks : & [ TaskId ] , objects : & [ DataObjectId ] ) -> Result < ( ) , Box < Error > > {
96
+ pub fn wait ( & self , tasks : & [ TaskId ] , objects : & [ DataObjectId ] ) -> Result < ( ) , Box < Error > > {
88
97
let mut req = self . service . wait_request ( ) ;
89
98
to_capnp_list ! ( req. get( ) , tasks, init_task_ids) ;
90
99
to_capnp_list ! ( req. get( ) , objects, init_object_ids) ;
91
- self . core . run ( req. send ( ) . promise ) ?;
100
+ self . comm ( ) . run ( req. send ( ) . promise ) ?;
92
101
Ok ( ( ) )
93
102
}
94
103
pub fn wait_some (
95
- & mut self ,
104
+ & self ,
96
105
tasks : & [ TaskId ] ,
97
106
objects : & [ DataObjectId ] ,
98
107
) -> Result < ( Vec < TaskId > , Vec < DataObjectId > ) , Box < Error > > {
99
108
let mut req = self . service . wait_some_request ( ) ;
100
109
to_capnp_list ! ( req. get( ) , tasks, init_task_ids) ;
101
110
to_capnp_list ! ( req. get( ) , objects, init_object_ids) ;
102
- let res = self . core . run ( req. send ( ) . promise ) ?;
111
+ let res = self . comm ( ) . run ( req. send ( ) . promise ) ?;
103
112
104
113
Ok ( (
105
114
from_capnp_list ! ( res. get( ) ?, get_finished_tasks, TaskId ) ,
106
115
from_capnp_list ! ( res. get( ) ?, get_finished_objects, DataObjectId ) ,
107
116
) )
108
117
}
109
118
110
- pub fn fetch ( & mut self , object_id : DataObjectId ) -> Result < Vec < u8 > , Box < Error > > {
119
+ pub fn fetch ( & self , object_id : DataObjectId ) -> Result < Vec < u8 > , Box < Error > > {
111
120
let mut req = self . service . fetch_request ( ) ;
112
121
object_id. to_capnp ( & mut req. get ( ) . get_id ( ) . unwrap ( ) ) ;
113
122
req. get ( ) . set_size ( 1024 ) ;
114
123
115
- let response = self . core . run ( req. send ( ) . promise ) ?;
124
+ let response = self . comm ( ) . run ( req. send ( ) . promise ) ?;
116
125
117
126
let reader = response. get ( ) ?;
118
127
match reader. get_status ( ) . which ( ) ? {
@@ -124,9 +133,13 @@ impl Communicator {
124
133
}
125
134
}
126
135
127
- pub fn terminate_server ( & mut self ) -> Result < ( ) , Box < Error > > {
128
- self . core
136
+ pub fn terminate_server ( & self ) -> Result < ( ) , Box < Error > > {
137
+ self . comm ( )
129
138
. run ( self . service . terminate_server_request ( ) . send ( ) . promise ) ?;
130
139
Ok ( ( ) )
131
140
}
141
+
142
+ fn comm ( & self ) -> RefMut < Core > {
143
+ self . core . borrow_mut ( )
144
+ }
132
145
}
0 commit comments