@@ -30,11 +30,11 @@ type answer struct {
30
30
// entry is a placeholder until the remote vat cancels the call.
31
31
ret rpccp.Return
32
32
33
- // sendMsg sends the return message. The caller MUST NOT hold ans.c.mu .
33
+ // sendMsg sends the return message. The caller MUST NOT hold ans.c.lk .
34
34
sendMsg func ()
35
35
36
36
// msgReleaser releases the return message when its refcount hits zero.
37
- // The caller MUST NOT hold ans.c.mu .
37
+ // The caller MUST NOT hold ans.c.lk .
38
38
msgReleaser * rc.Releaser
39
39
40
40
// results is the memoized answer to ret.Results().
@@ -99,27 +99,27 @@ func errorAnswer(c *Conn, id answerID, err error) *answer {
99
99
// all references to it are dropped; the caller is responsible for one reference. This will not
100
100
// happen before the message is sent, as the returned send function retains a reference.
101
101
func (c * Conn ) newReturn (ctx context.Context ) (_ rpccp.Return , sendMsg func (), _ * rc.Releaser , _ error ) {
102
- msg , send , releaseMsg , err := c .transport .NewMessage ()
102
+ outMsg , err := c .transport .NewMessage ()
103
103
if err != nil {
104
104
return rpccp.Return {}, nil , nil , rpcerr .Failedf ("create return: %w" , err )
105
105
}
106
- ret , err := msg .NewReturn ()
106
+ ret , err := outMsg . Message .NewReturn ()
107
107
if err != nil {
108
- releaseMsg ()
108
+ outMsg . Release ()
109
109
return rpccp.Return {}, nil , nil , rpcerr .Failedf ("create return: %w" , err )
110
110
}
111
111
112
112
// Before releasing the message, we need to wait both until it is sent and
113
113
// until the local vat is done with it. We therefore implement a simple
114
114
// ref-counting mechanism such that 'release' must be called twice before
115
115
// 'releaseMsg' is called.
116
- releaser := rc .NewReleaser (2 , releaseMsg )
116
+ releaser := rc .NewReleaser (2 , outMsg . Release )
117
117
118
118
return ret , func () {
119
119
c .sender .Send (asyncSend {
120
- send : send ,
120
+ send : outMsg . Send ,
121
121
release : releaser .Decr ,
122
- callback : func (err error ) {
122
+ onSent : func (err error ) {
123
123
if err != nil {
124
124
c .er .ReportError (fmt .Errorf ("send return: %w" , err ))
125
125
}
@@ -129,11 +129,11 @@ func (c *Conn) newReturn(ctx context.Context) (_ rpccp.Return, sendMsg func(), _
129
129
}
130
130
131
131
// setPipelineCaller sets ans.pcall to pcall if the answer has not
132
- // already returned. The caller MUST NOT hold ans.c.mu .
132
+ // already returned. The caller MUST NOT hold ans.c.lk .
133
133
//
134
134
// This also sets ans.promise to a new promise, wrapping pcall.
135
135
func (ans * answer ) setPipelineCaller (m capnp.Method , pcall capnp.PipelineCaller ) {
136
- syncutil .With (& ans .c .mu , func () {
136
+ syncutil .With (& ans .c .lk , func () {
137
137
if ! ans .flags .Contains (resultsReady ) {
138
138
ans .pcall = pcall
139
139
ans .promise = capnp .NewPromise (m , pcall )
@@ -181,12 +181,12 @@ func (ans *answer) setBootstrap(c capnp.Client) error {
181
181
182
182
// Return sends the return message.
183
183
//
184
- // The caller MUST NOT hold ans.c.mu .
184
+ // The caller MUST NOT hold ans.c.lk .
185
185
func (ans * answer ) Return (e error ) {
186
- ans .c .mu .Lock ()
186
+ ans .c .lk .Lock ()
187
187
if e != nil {
188
188
rl := ans .sendException (e )
189
- ans .c .mu .Unlock ()
189
+ ans .c .lk .Unlock ()
190
190
rl .release ()
191
191
ans .pcalls .Wait ()
192
192
ans .c .tasks .Done () // added by handleCall
@@ -202,13 +202,13 @@ func (ans *answer) Return(e error) {
202
202
ans .c .er .ReportError (err )
203
203
}
204
204
205
- ans .c .mu .Unlock ()
205
+ ans .c .lk .Unlock ()
206
206
rl .release ()
207
207
ans .pcalls .Wait ()
208
208
return
209
209
}
210
210
}
211
- ans .c .mu .Unlock ()
211
+ ans .c .lk .Unlock ()
212
212
rl .release ()
213
213
ans .pcalls .Wait ()
214
214
ans .c .tasks .Done () // added by handleCall
@@ -219,7 +219,7 @@ func (ans *answer) Return(e error) {
219
219
// Finish with releaseResultCaps set to true, then sendReturn returns
220
220
// the number of references to be subtracted from each export.
221
221
//
222
- // The caller MUST be holding onto ans.c.mu . sendReturn MUST NOT be
222
+ // The caller MUST be holding onto ans.c.lk . sendReturn MUST NOT be
223
223
// called if sendException was previously called.
224
224
func (ans * answer ) sendReturn () (releaseList , error ) {
225
225
ans .pcall = nil
@@ -252,13 +252,13 @@ func (ans *answer) sendReturn() (releaseList, error) {
252
252
}
253
253
ans .promise = nil
254
254
}
255
- ans .c .mu .Unlock ()
255
+ ans .c .lk .Unlock ()
256
256
ans .sendMsg ()
257
257
if fin {
258
- ans .c .mu .Lock ()
258
+ ans .c .lk .Lock ()
259
259
return ans .destroy ()
260
260
}
261
- ans .c .mu .Lock ()
261
+ ans .c .lk .Lock ()
262
262
}
263
263
ans .flags |= returnSent
264
264
if ! ans .flags .Contains (finishReceived ) {
@@ -269,7 +269,7 @@ func (ans *answer) sendReturn() (releaseList, error) {
269
269
270
270
// sendException sends an exception on the answer's return message.
271
271
//
272
- // The caller MUST be holding onto ans.c.mu . sendException MUST NOT
272
+ // The caller MUST be holding onto ans.c.lk . sendException MUST NOT
273
273
// be called if sendReturn was previously called.
274
274
func (ans * answer ) sendException (ex error ) releaseList {
275
275
ans .err = ex
@@ -286,7 +286,7 @@ func (ans *answer) sendException(ex error) releaseList {
286
286
default :
287
287
// Send exception.
288
288
fin := ans .flags .Contains (finishReceived )
289
- ans .c .mu .Unlock ()
289
+ ans .c .lk .Unlock ()
290
290
if e , err := ans .ret .NewException (); err != nil {
291
291
ans .c .er .ReportError (fmt .Errorf ("send exception: %w" , err ))
292
292
} else {
@@ -298,11 +298,11 @@ func (ans *answer) sendException(ex error) releaseList {
298
298
}
299
299
}
300
300
if fin {
301
- ans .c .mu .Lock ()
301
+ ans .c .lk .Lock ()
302
302
rl , _ := ans .destroy ()
303
303
return rl
304
304
}
305
- ans .c .mu .Lock ()
305
+ ans .c .lk .Lock ()
306
306
}
307
307
ans .flags |= returnSent
308
308
if ! ans .flags .Contains (finishReceived ) {
@@ -314,17 +314,19 @@ func (ans *answer) sendException(ex error) releaseList {
314
314
return rl
315
315
}
316
316
317
- // destroy removes the answer from the table and returns the clients to
318
- // release. The answer must have sent a return and received a finish.
319
- // The caller must be holding onto ans.c.mu .
317
+ // destroy removes the answer from the table and returns ReleaseFuncs to
318
+ // run. The answer must have sent a return and received a finish.
319
+ // The caller must be holding onto ans.c.lk .
320
320
//
321
321
// shutdown has its own strategy for cleaning up an answer.
322
322
func (ans * answer ) destroy () (releaseList , error ) {
323
- defer syncutil . Without ( & ans . c . mu , ans .msgReleaser .Decr )
324
- delete (ans .c .answers , ans .id )
323
+ rl := releaseList { ans .msgReleaser .Decr }
324
+ delete (ans .c .lk . answers , ans .id )
325
325
if ! ans .flags .Contains (releaseResultCapsFlag ) || len (ans .exportRefs ) == 0 {
326
- return nil , nil
326
+ return rl , nil
327
327
328
328
}
329
- return ans .c .releaseExportRefs (ans .exportRefs )
329
+ ret , err := ans .c .releaseExportRefs (ans .exportRefs )
330
+ ret = append (ret , rl ... )
331
+ return ret , err
330
332
}
0 commit comments