@@ -198,7 +198,7 @@ transfer(Session, Amqp10Msg, Timeout) ->
198
198
gen_statem :call (Session , {transfer , Transfer , Records }, Timeout ).
199
199
200
200
flow (Session , Handle , Flow , RenewAfter ) ->
201
- gen_statem :cast (Session , {flow , Handle , Flow , RenewAfter }).
201
+ gen_statem :cast (Session , {flow_link , Handle , Flow , RenewAfter }).
202
202
203
203
-spec disposition (pid (), link_role (), delivery_number (), delivery_number (), boolean (),
204
204
amqp10_client_types :delivery_state ()) -> ok .
@@ -272,9 +272,18 @@ mapped(cast, 'end', State) ->
272
272
% % We send the first end frame and wait for the reply.
273
273
send_end (State ),
274
274
{next_state , end_sent , State };
275
- mapped (cast , {flow , OutHandle , Flow0 , RenewAfter }, State0 ) ->
276
- State = send_flow (fun send /2 , OutHandle , Flow0 , RenewAfter , State0 ),
277
- {next_state , mapped , State };
275
+ mapped (cast , {flow_link , OutHandle , Flow0 , RenewAfter }, State0 ) ->
276
+ State = send_flow_link (fun send /2 , OutHandle , Flow0 , RenewAfter , State0 ),
277
+ {keep_state , State };
278
+ mapped (cast , {flow_session , Flow0 = # 'v1_0.flow' {incoming_window = {uint , IncomingWindow }}},
279
+ # state {next_incoming_id = NII ,
280
+ next_outgoing_id = NOI } = State ) ->
281
+ Flow = Flow0 # 'v1_0.flow' {
282
+ next_incoming_id = maybe_uint (NII ),
283
+ next_outgoing_id = uint (NOI ),
284
+ outgoing_window = ? UINT_OUTGOING_WINDOW },
285
+ ok = send (Flow , State ),
286
+ {keep_state , State # state {incoming_window = IncomingWindow }};
278
287
mapped (cast , # 'v1_0.end' {error = Err }, State ) ->
279
288
% % We receive the first end frame, reply and terminate.
280
289
_ = send_end (State ),
@@ -313,21 +322,21 @@ mapped(cast, #'v1_0.attach'{name = {utf8, Name},
313
322
State = State0 # state {links = Links #{OutHandle => Link },
314
323
link_index = maps :remove (Name , LinkIndex ),
315
324
link_handle_index = LHI #{InHandle => OutHandle }},
316
- {next_state , mapped , State };
325
+ {keep_state , State };
317
326
mapped (cast , # 'v1_0.detach' {handle = {uint , InHandle },
318
327
error = Err },
319
328
# state {links = Links , link_handle_index = LHI } = State0 ) ->
320
329
with_link (InHandle , State0 ,
321
330
fun (# link {output_handle = OutHandle } = Link , State ) ->
322
331
Reason = reason (Err ),
323
332
ok = notify_link_detached (Link , Reason ),
324
- {next_state , mapped ,
333
+ {keep_state ,
325
334
State # state {links = maps :remove (OutHandle , Links ),
326
335
link_handle_index = maps :remove (InHandle , LHI )}}
327
336
end );
328
337
mapped (cast , # 'v1_0.flow' {handle = undefined } = Flow , State0 ) ->
329
338
State = handle_session_flow (Flow , State0 ),
330
- {next_state , mapped , State };
339
+ {keep_state , State };
331
340
mapped (cast , # 'v1_0.flow' {handle = {uint , InHandle }} = Flow ,
332
341
# state {links = Links } = State0 ) ->
333
342
@@ -341,7 +350,7 @@ mapped(cast, #'v1_0.flow'{handle = {uint, InHandle}} = Flow,
341
350
ok = maybe_notify_link_credit (Link0 , Link ),
342
351
Links1 = Links #{OutHandle => Link },
343
352
State1 = State # state {links = Links1 },
344
- {next_state , mapped , State1 };
353
+ {keep_state , State1 };
345
354
mapped (cast , {# 'v1_0.transfer' {handle = {uint , InHandle },
346
355
more = true } = Transfer , Payload },
347
356
# state {links = Links } = State0 ) ->
@@ -353,7 +362,7 @@ mapped(cast, {#'v1_0.transfer'{handle = {uint, InHandle},
353
362
354
363
State = book_partial_transfer_received (
355
364
State0 # state {links = Links #{OutHandle => Link1 }}),
356
- {next_state , mapped , State };
365
+ {keep_state , State };
357
366
mapped (cast , {# 'v1_0.transfer' {handle = {uint , InHandle },
358
367
delivery_id = MaybeDeliveryId ,
359
368
settled = Settled } = Transfer0 , Payload0 },
@@ -385,16 +394,16 @@ mapped(cast, {#'v1_0.transfer'{handle = {uint, InHandle},
385
394
% deliver
386
395
TargetPid ! {amqp10_msg , LinkRef , Msg },
387
396
State1 = auto_flow (Link2 , State ),
388
- {next_state , mapped , State1 };
397
+ {keep_state , State1 };
389
398
{credit_exhausted , Link2 , State } ->
390
399
TargetPid ! {amqp10_msg , LinkRef , Msg },
391
400
notify_credit_exhausted (Link2 ),
392
- {next_state , mapped , State };
401
+ {keep_state , State };
393
402
{transfer_limit_exceeded , Link2 , State } ->
394
403
logger :warning (" transfer_limit_exceeded for link ~tp " , [Link2 ]),
395
404
Link = detach_with_error_cond (Link2 , State ,
396
405
? V_1_0_LINK_ERROR_TRANSFER_LIMIT_EXCEEDED ),
397
- {next_state , mapped , update_link (Link , State )}
406
+ {keep_state , update_link (Link , State )}
398
407
end ;
399
408
400
409
@@ -427,11 +436,11 @@ mapped(cast, #'v1_0.disposition'{role = true,
427
436
end
428
437
end , Unsettled0 , First , Last ),
429
438
430
- {next_state , mapped , State # state {outgoing_unsettled = Unsettled }};
439
+ {keep_state , State # state {outgoing_unsettled = Unsettled }};
431
440
mapped (cast , Frame , State ) ->
432
441
logger :warning (" Unhandled session frame ~tp in state ~tp " ,
433
442
[Frame , State ]),
434
- {next_state , mapped , State };
443
+ {keep_state , State };
435
444
mapped ({call , From },
436
445
{transfer , _Transfer , _Parts },
437
446
# state {remote_incoming_window = Window })
@@ -518,9 +527,9 @@ end_sent(_EvtType, #'v1_0.end'{error = Err}, State) ->
518
527
Reason = reason (Err ),
519
528
ok = notify_session_ended (State , Reason ),
520
529
{stop , normal , State };
521
- end_sent (_EvtType , _Frame , State ) ->
530
+ end_sent (_EvtType , _Frame , _State ) ->
522
531
% just drop frames here
523
- { next_state , end_sent , State } .
532
+ keep_state_and_data .
524
533
525
534
terminate (Reason , _StateName , # state {channel = Channel ,
526
535
remote_channel = RemoteChannel ,
@@ -586,12 +595,12 @@ send_transfer(Transfer0, Parts0, MaxMessageSize, #state{socket = Socket,
586
595
{ok , length (Frames )}
587
596
end .
588
597
589
- send_flow (Send , OutHandle ,
590
- # 'v1_0.flow' {link_credit = {uint , Credit }} = Flow0 , RenewAfter ,
591
- # state {links = Links ,
592
- next_incoming_id = NII ,
593
- next_outgoing_id = NOI ,
594
- incoming_window = InWin } = State ) ->
598
+ send_flow_link (Send , OutHandle ,
599
+ # 'v1_0.flow' {link_credit = {uint , Credit }} = Flow0 , RenewAfter ,
600
+ # state {links = Links ,
601
+ next_incoming_id = NII ,
602
+ next_outgoing_id = NOI ,
603
+ incoming_window = InWin } = State ) ->
595
604
AutoFlow = case RenewAfter of
596
605
never -> never ;
597
606
Limit -> {auto , Limit , Credit }
@@ -602,7 +611,6 @@ send_flow(Send, OutHandle,
602
611
available = Available } = Link } = Links ,
603
612
Flow = Flow0 # 'v1_0.flow' {
604
613
handle = uint (H ),
605
- link_credit = uint (Credit ),
606
614
% % "This value MUST be set if the peer has received the begin
607
615
% % frame for the session, and MUST NOT be set if it has not." [2.7.4]
608
616
next_incoming_id = maybe_uint (NII ),
@@ -978,9 +986,9 @@ auto_flow(#link{link_credit = LC,
978
986
auto_flow = {auto , Limit , Credit },
979
987
output_handle = OutHandle }, State )
980
988
when LC < Limit ->
981
- send_flow (fun send /2 , OutHandle ,
982
- # 'v1_0.flow' {link_credit = {uint , Credit }},
983
- Limit , State );
989
+ send_flow_link (fun send /2 , OutHandle ,
990
+ # 'v1_0.flow' {link_credit = {uint , Credit }},
991
+ Limit , State );
984
992
auto_flow (_ , State ) ->
985
993
State .
986
994
0 commit comments