@@ -102,12 +102,22 @@ score() ->
102
102
gen_statem :call (? MODULE ,score ).
103
103
fetch () ->
104
104
gen_statem :call (? MODULE ,fetch ).
105
- clean () ->
106
- gen_statem :call (? MODULE ,clean ).
107
105
fetch (T ) ->
108
106
gen_statem :call (? MODULE ,{fetch ,T }).
107
+ clean () ->
108
+ gen_statem :call (? MODULE ,{clean ,async }).
109
+ clean (async ) ->
110
+ gen_statem :call (? MODULE ,{clean ,async });
111
+ clean (sync ) ->
112
+ gen_statem :call (? MODULE ,{clean ,sync });
109
113
clean (T ) ->
110
- gen_statem :call (? MODULE ,{clean ,T }).
114
+ gen_statem :call (? MODULE ,{clean ,{async ,T }}).
115
+ clean (async ,T ) ->
116
+ gen_statem :call (? MODULE ,{clean ,{async ,T }});
117
+ clean (sync ,T ) ->
118
+ gen_statem :call (? MODULE ,{clean ,{sync ,T }});
119
+ clean (R ,T ) ->
120
+ gen_statem :cast (? MODULE ,{{clean ,R },T }).
111
121
112
122
reset (D ) ->
113
123
gen_statem :cast (? MODULE ,{reset ,D }).
@@ -116,8 +126,6 @@ score(R,C) ->
116
126
gen_statem :cast (? MODULE ,{{score ,R },C }).
117
127
fetch (R ,C ) ->
118
128
gen_statem :cast (? MODULE ,{{fetch ,R },C }).
119
- clean (R ,T ) ->
120
- gen_statem :cast (? MODULE ,{{clean ,R },T }).
121
129
122
130
123
131
common (cast ,{point ,K },[O ,Q ]) ->
@@ -323,13 +331,18 @@ common({call,From},score,[O,Q]) ->
323
331
common ({call ,From },fetch ,[O ,Q ]) ->
324
332
T = lfu_utils :ets_create (),
325
333
{next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => internal , order => fetch }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
326
- common ({call ,From },clean ,[O ,Q ]) ->
327
- T = lfu_utils :ets_create (),
328
- {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => internal , order => clean }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
329
334
common ({call ,From },{fetch ,T },[O ,Q ]) ->
330
335
{next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => external , order => fetch }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
331
- common ({call ,From },{clean ,T },[O ,Q ]) ->
332
- {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => external , order => clean }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
336
+ common ({call ,From },{clean ,async },[O ,Q ]) ->
337
+ T = lfu_utils :ets_create (),
338
+ {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => internal , order => clean , mode => async }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
339
+ common ({call ,From },{clean ,sync },[O ,Q ]) ->
340
+ T = lfu_utils :ets_create (),
341
+ {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => internal , order => clean , mode => sync }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
342
+ common ({call ,From },{clean ,{async ,T }},[O ,Q ]) ->
343
+ {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => external , order => clean , mode => async }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
344
+ common ({call ,From },{clean ,{sync ,T }},[O ,Q ]) ->
345
+ {next_state ,offset ,[O ,Q ,#{from => From , tid => T , ets => external , order => clean , mode => sync }],[{next_event ,internal ,{score ,{previous ,{? SCORE_OFFSET ,O }}}}]};
333
346
common (cast ,{reset ,D },[O ,Q ]) ->
334
347
NQ = resetting (D ,Q ),
335
348
{keep_state ,[O ,NQ ]};
@@ -404,7 +417,7 @@ offset(internal,count,[O,Q,#{previous := P, current := C, following := F, from :
404
417
{next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => fetch }],[{next_event ,internal ,fetch }]};
405
418
Order =:= clean ->
406
419
% % idle iteration but necessary
407
- {next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => clean }],[{next_event ,internal ,fetch }]}
420
+ {next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => clean , mode => maps : get ( mode , MD ) }],[{next_event ,internal ,fetch }]}
408
421
end ;
409
422
C / Q * 100 < ? MIN_OFFSET andalso O * 10 =< ? MAX_ORDER andalso F / Q * 100 =< ? MAX_OFFSET ->
410
423
{keep_state ,[O * 10 ,Q ,MD #{previous => C , current => F , following => 0 }],[{next_event ,internal ,{score ,{following ,{O * 100 ,O * 1000 }}}}]};
@@ -417,7 +430,7 @@ offset(internal,count,[O,Q,#{previous := P, current := C, following := F, from :
417
430
Order =:= fetch ->
418
431
{next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => fetch }],[{next_event ,internal ,fetch }]};
419
432
Order =:= clean ->
420
- {next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => clean }],[{next_event ,internal ,fetch }]}
433
+ {next_state ,select ,[O ,Q ,#{from => From , tid => maps :get (tid ,MD ), ets => maps :get (ets ,MD ), order => clean , mode => maps : get ( mode , MD ) }],[{next_event ,internal ,fetch }]}
421
434
end
422
435
end ;
423
436
offset (cast ,{{score ,_ },_S },_StateData ) ->
@@ -440,11 +453,9 @@ offset({call,_From},score,_StateData) ->
440
453
{keep_state_and_data ,[postpone ]};
441
454
offset ({call ,_From },fetch ,_StateData ) ->
442
455
{keep_state_and_data ,[postpone ]};
443
- offset ({call ,_From },clean ,_StateData ) ->
444
- {keep_state_and_data ,[postpone ]};
445
456
offset ({call ,_From },{fetch ,_T },_StateData ) ->
446
457
{keep_state_and_data ,[postpone ]};
447
- offset ({call ,_From },{clean ,_T },_StateData ) ->
458
+ offset ({call ,_From },{clean ,_D },_StateData ) -> % % _D = {async,tid()} || {sync,tid()} || async || sync
448
459
{keep_state_and_data ,[postpone ]};
449
460
offset (cast ,{reset ,_T },_StateData ) ->
450
461
{keep_state_and_data ,[postpone ]};
@@ -465,24 +476,34 @@ select(internal,fetch,[O,Q,#{tid := T} = MD]) ->
465
476
true ->
466
477
{keep_state ,[O ,Q ,MD #{number => N , ref => R }],[{state_timeout ,0 ,T }]}
467
478
end ;
468
- select (state_timeout ,T ,[O ,Q ,#{tid := T , from := From , order := Order , ets := internal } = _MD ]) ->
479
+ select (state_timeout ,T ,[O ,Q ,#{tid := T , from := From , order := Order , ets := internal } = MD ]) ->
469
480
% io:format("TimeoutState:~p~nMD:~p~nO:~p~nQ~p~n~n",[select,MD,O,Q]),
470
481
NT = lfu_utils :ets_re_create (),
471
482
if
472
483
Order =:= fetch ->
473
484
{next_state ,common ,[O ,Q ],[{reply ,From ,NT }]};
474
485
Order =:= clean ->
475
- R1 = make_ref (),
476
- {next_state ,delete ,[O ,Q ,#{tid => NT , ref => R1 }],[{reply ,From ,{NT ,R1 }},{state_timeout ,? TIMEOUT_STATE_DELETE ,NT }]}
486
+ case maps :get (mode ,MD ) of
487
+ async ->
488
+ {next_state ,delete ,[O ,Q ,#{tid => NT , from => From }],[{next_event ,internal ,clean }]};
489
+ sync ->
490
+ R = make_ref (),
491
+ {next_state ,delete ,[O ,Q ,#{tid => NT , ref => R }],[{reply ,From ,{NT ,R }},{state_timeout ,? TIMEOUT_STATE_DELETE ,NT }]}
492
+ end
477
493
end ;
478
- select (state_timeout ,T ,[O ,Q ,#{tid := T , from := From , order := Order , ets := external } = _MD ]) ->
494
+ select (state_timeout ,T ,[O ,Q ,#{tid := T , from := From , order := Order , ets := external } = MD ]) ->
479
495
% io:format("TimeoutState:~p~nMD:~p~nO:~p~nQ~p~n~n",[select,MD,O,Q]),
480
496
if
481
497
Order =:= fetch ->
482
498
{next_state ,common ,[O ,Q ],[{reply ,From ,T }]};
483
499
Order =:= clean ->
484
- R1 = make_ref (),
485
- {next_state ,delete ,[O ,Q ,#{tid => T , ref => R1 }],[{reply ,From ,{T ,R1 }},{state_timeout ,? TIMEOUT_STATE_DELETE ,T }]}
500
+ case maps :get (mode ,MD ) of
501
+ async ->
502
+ {next_state ,delete ,[O ,Q ,#{tid => T , from => From }],[{next_event ,internal ,clean }]};
503
+ sync ->
504
+ R = make_ref (),
505
+ {next_state ,delete ,[O ,Q ,#{tid => T , ref => R }],[{reply ,From ,{T ,R }},{state_timeout ,? TIMEOUT_STATE_DELETE ,T }]}
506
+ end
486
507
end ;
487
508
select (cast ,{{fetch ,R },ready },[O ,Q ,#{number := N , tid := T , from := From , order := Order , ref := R } = MD ]) ->
488
509
if
@@ -493,8 +514,13 @@ select(cast,{{fetch,R},ready},[O,Q,#{number := N, tid := T, from := From, order
493
514
Order =:= fetch ->
494
515
{next_state ,common ,[O ,Q ],[{reply ,From ,T }]};
495
516
Order =:= clean ->
496
- R1 = make_ref (),
497
- {next_state ,delete ,[O ,Q ,#{tid => T , ref => R1 }],[{reply ,From ,{T ,R1 }},{state_timeout ,? TIMEOUT_STATE_DELETE ,T }]}
517
+ case maps :get (mode ,MD ) of
518
+ async ->
519
+ {next_state ,delete ,[O ,Q ,#{tid => T , from => From }],[{next_event ,internal ,clean }]};
520
+ sync ->
521
+ R1 = make_ref (),
522
+ {next_state ,delete ,[O ,Q ,#{tid => T , ref => R1 }],[{reply ,From ,{T ,R1 }},{state_timeout ,? TIMEOUT_STATE_DELETE ,T }]}
523
+ end
498
524
end
499
525
end ;
500
526
select (cast ,{{fetch ,_R },ready },_StateData ) ->
@@ -517,11 +543,9 @@ select({call,_From},score,_StateData) ->
517
543
{keep_state_and_data ,[postpone ]};
518
544
select ({call ,_From },fetch ,_StateData ) ->
519
545
{keep_state_and_data ,[postpone ]};
520
- select ({call ,_From },clean ,_StateData ) ->
521
- {keep_state_and_data ,[postpone ]};
522
546
select ({call ,_From },{fetch ,_T },_StateData ) ->
523
547
{keep_state_and_data ,[postpone ]};
524
- select ({call ,_From },{clean ,_T },_StateData ) ->
548
+ select ({call ,_From },{clean ,_D },_StateData ) -> % % _D = {async,tid()} || {sync,tid()} || async || sync
525
549
{keep_state_and_data ,[postpone ]};
526
550
select (cast ,{reset ,_T },_StateData ) ->
527
551
{keep_state_and_data ,[postpone ]};
@@ -532,6 +556,10 @@ select({call,_From},_EventContent,_StateData) ->
532
556
select (info ,_EventContent ,_StateData ) ->
533
557
keep_state_and_data .
534
558
559
+ delete (internal ,clean ,[O ,Q ,#{tid := T , from := From }]) ->
560
+ NQ = resetting (T ,Q ),
561
+ ? SUPPORT andalso erlang :apply (? AUXILIARY ,reset ,[T ]),
562
+ {next_state ,common ,[O ,NQ ],[{reply ,From ,T }]};
535
563
delete (state_timeout ,T ,[O ,Q ,#{tid := T , ref := _R }]) ->
536
564
% io:format("TimeoutState:~p~nT:~p~nO:~p~nQ~p~n~n",[delete,T,O,Q]),
537
565
{next_state ,common ,[O ,Q ]};
@@ -559,11 +587,9 @@ delete({call,_From},score,_StateData) ->
559
587
{keep_state_and_data ,[postpone ]};
560
588
delete ({call ,_From },fetch ,_StateData ) ->
561
589
{keep_state_and_data ,[postpone ]};
562
- delete ({call ,_From },clean ,_StateData ) ->
563
- {keep_state_and_data ,[postpone ]};
564
590
delete ({call ,_From },{fetch ,_T },_StateData ) ->
565
591
{keep_state_and_data ,[postpone ]};
566
- delete ({call ,_From },{clean ,_T },_StateData ) ->
592
+ delete ({call ,_From },{clean ,_D },_StateData ) -> % % _D = {async,tid()} || {sync,tid()} || async || sync
567
593
{keep_state_and_data ,[postpone ]};
568
594
delete (cast ,{reset ,_T },_StateData ) ->
569
595
{keep_state_and_data ,[postpone ]};
0 commit comments