I think I solved the deadlock of nested gen_server:call()s
This commit is contained in:
@@ -100,7 +100,10 @@ handle_call({wipe, Tab}, _, State) ->
|
|||||||
Result= ezic_db_ets:wipe(Tab),
|
Result= ezic_db_ets:wipe(Tab),
|
||||||
{reply, Result, State};
|
{reply, Result, State};
|
||||||
handle_call({flatten}, _, State) ->
|
handle_call({flatten}, _, State) ->
|
||||||
Result= ezic_flatten:flatten(),
|
Zones= ezic_db_ets:get_all(zone),
|
||||||
|
Rules= ezic_db_ets:get_all(rule),
|
||||||
|
FlatZone= ezic_flatten:flatten(Zones, Rules),
|
||||||
|
Result= ezic_db_ets:insert_all(FlatZone),
|
||||||
{reply, Result, State};
|
{reply, Result, State};
|
||||||
handle_call(_, _, State) ->
|
handle_call(_, _, State) ->
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ create_tables(Filename) ->
|
|||||||
|
|
||||||
ets:new(flatzone, [duplicate_bag, named_table]),
|
ets:new(flatzone, [duplicate_bag, named_table]),
|
||||||
io:format("~p~n", [Rules]),
|
io:format("~p~n", [Rules]),
|
||||||
ezic_flatten:flatten(),
|
FlatZones = ezic_flatten:flatten(Zones, Rules),
|
||||||
|
true = ets:insert(flatzone, FlatZones),
|
||||||
|
|
||||||
% combine into one ets
|
% combine into one ets
|
||||||
Ets= ets:new(ezic_db_ets, [duplicate_bag]),
|
Ets= ets:new(ezic_db_ets, [duplicate_bag]),
|
||||||
|
|||||||
@@ -126,7 +126,8 @@ create_tabs(ok) ->
|
|||||||
{ok, Zones, Rules, _, _} = ezic_record:separate(ezic_loader:load()),
|
{ok, Zones, Rules, _, _} = ezic_record:separate(ezic_loader:load()),
|
||||||
insert_all(Zones),
|
insert_all(Zones),
|
||||||
insert_all(Rules),
|
insert_all(Rules),
|
||||||
ezic_flatten:flatten(),
|
FlatZones = ezic_flatten:flatten(Zones, Rules),
|
||||||
|
insert_all(FlatZones),
|
||||||
|
|
||||||
ok;
|
ok;
|
||||||
create_tabs({error, {_, {already_exists,_}}}) ->
|
create_tabs({error, {_, {already_exists,_}}}) ->
|
||||||
|
|||||||
@@ -14,16 +14,14 @@
|
|||||||
|
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
flatten/0
|
flatten/2
|
||||||
, contains_date/2
|
, contains_date/2
|
||||||
, ms/2
|
, ms/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
|
||||||
flatten() ->
|
flatten(Zones, AllRules) ->
|
||||||
AllZones= ezic_db:get_all(zone),
|
flatten_all_zones(Zones, AllRules).
|
||||||
flatten_all_zones(AllZones),
|
|
||||||
done.
|
|
||||||
|
|
||||||
|
|
||||||
contains_date(FlatZone, Date) ->
|
contains_date(FlatZone, Date) ->
|
||||||
@@ -71,19 +69,21 @@ ms(Date, Name) ->
|
|||||||
% PRIVATE
|
% PRIVATE
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
flatten_all_zones(AllZones, AllRules) ->
|
||||||
|
flatten_all_zones(AllZones, AllRules, []).
|
||||||
|
|
||||||
% recursively processes sets of similar zones until they're all done,
|
% recursively processes sets of similar zones until they're all done,
|
||||||
% passing zone sets to flatten_zone_set/1
|
% passing zone sets to flatten_zone_set/1
|
||||||
flatten_all_zones([]) ->
|
flatten_all_zones([], _AllRules, FlatZones) ->
|
||||||
done;
|
FlatZones;
|
||||||
flatten_all_zones([Z1|_]= AllZones) ->
|
flatten_all_zones([Z1|_]= AllZones, AllRules, FlatZones) ->
|
||||||
io:format("Flattening zones: ~s~n", [Z1#zone.name]),
|
io:format("Flattening zones: ~s~n", [Z1#zone.name]),
|
||||||
{CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones),
|
{CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones),
|
||||||
|
|
||||||
Flats= flatten_zone_set(CurrentZones),
|
Flats= flatten_zone_set(CurrentZones, AllRules),
|
||||||
ezic_db:insert_all(Flats),
|
%ezic_db:insert_all(Flats),
|
||||||
|
|
||||||
flatten_all_zones(RestZones).
|
flatten_all_zones(RestZones, AllRules, Flats ++ FlatZones).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -108,18 +108,20 @@ contains_date2(#flatzone{wall_from=From, wall_to=To}, {Dt,#tztime{time=T, flag=F
|
|||||||
%% gathers relevant rules and creates flat periods of the same gmt
|
%% gathers relevant rules and creates flat periods of the same gmt
|
||||||
%% offset (#flatzone). This is a recursive solution, eliminating Zones
|
%% offset (#flatzone). This is a recursive solution, eliminating Zones
|
||||||
%% from the list until it's been exhausted
|
%% from the list until it's been exhausted
|
||||||
flatten_zone_set(Zones) ->
|
flatten_zone_set(Zones, AllRules) ->
|
||||||
flatten_zone_set(?MINFLAT, Zones, [], none).
|
flatten_zone_set(?MINFLAT, Zones, AllRules, [], none).
|
||||||
|
|
||||||
|
|
||||||
% flatten_zone_set(FromTime, Zones, Flats) -> [#flatzone{}]
|
% flatten_zone_set(FromTime, Zones, AllRules, Flats) -> [#flatzone{}]
|
||||||
% FromTime= #flatzone{*_from =/= undefined}
|
% FromTime= #flatzone{*_from =/= undefined}
|
||||||
|
% AllRules= [#rule{}]
|
||||||
% Zones= [#zone{}]
|
% Zones= [#zone{}]
|
||||||
% Flats= [#flatzone{}]
|
% Flats= [#flatzone{}]
|
||||||
%
|
%
|
||||||
% assumes a new zone every time it is called
|
% assumes a new zone every time it is called
|
||||||
flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
|
flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
|
||||||
, Zones %[Z1=#zone{rule=RuleName, until=UntilTime, gmtoff=Offset} | _RestZones],
|
, Zones %[Z1=#zone{rule=RuleName, until=UntilTime, gmtoff=Offset} | _RestZones],
|
||||||
|
, AllRules
|
||||||
, Flats
|
, Flats
|
||||||
, CurrentRule) ->
|
, CurrentRule) ->
|
||||||
|
|
||||||
@@ -140,8 +142,8 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
|
|||||||
|
|
||||||
|
|
||||||
%% we gather all rules that _may_ apply
|
%% we gather all rules that _may_ apply
|
||||||
Rules= ezic_db:rules(RuleName),
|
%Rules= ezic_db:rules(RuleName),
|
||||||
|
Rules= [R || R <- AllRules, R = #rule{name = RuleName}],
|
||||||
|
|
||||||
?debugVal(FromTime),
|
?debugVal(FromTime),
|
||||||
?debugVal(Rules),
|
?debugVal(Rules),
|
||||||
@@ -164,7 +166,7 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
|
|||||||
?debugMsg("maxyear reached from flatten_zone_set"),
|
?debugMsg("maxyear reached from flatten_zone_set"),
|
||||||
FinalFlats;
|
FinalFlats;
|
||||||
false ->
|
false ->
|
||||||
flatten_zone_set(NextFlat, RestZones, FinalFlats, EndingRule)
|
flatten_zone_set(NextFlat, RestZones, AllRules, FinalFlats, EndingRule)
|
||||||
catch
|
catch
|
||||||
exit:Reason ->
|
exit:Reason ->
|
||||||
?debugMsg("bad year for nextflat:"),
|
?debugMsg("bad year for nextflat:"),
|
||||||
|
|||||||
Reference in New Issue
Block a user