Skip to content

Commit

Permalink
modified: include/bael.hrl
Browse files Browse the repository at this point in the history
	modified:   src/bael.erl
	modified:   src/bael_fsm.erl
	modified:   src/bael_fsm_sup.erl
	modified:   src/bael_msg_manager.erl
	modified:   src/bael_server_sup.erl
	modified:   src/bael_struct.erl
	modified:   src/bael_views.erl
	modified:   src/bael_xml.erl
  • Loading branch information
solomonwzs committed Apr 21, 2012
1 parent 016588f commit bdc596d
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 48 deletions.
4 changes: 3 additions & 1 deletion include/bael.hrl
Expand Up @@ -3,6 +3,8 @@
-define(MAX_FSMS_POOL_SIZE, 10). -define(MAX_FSMS_POOL_SIZE, 10).
-define(MAX_MSG_POOL_SIZE, 100). -define(MAX_MSG_POOL_SIZE, 100).
-define(FSM_BUSY_TIMEOUT, 1000). -define(FSM_BUSY_TIMEOUT, 1000).
-define(MSG_MANAGER_RETRY_TIME, 1000).
-define(MSG_START_WORK_TIME, 100).
-define(URLS, [ -define(URLS, [
{"^hello/?$", hello}, {"^hello/?$", hello},
{"^hello/(.+?)/?$", hello}, {"^hello/(.+?)/?$", hello},
Expand Down Expand Up @@ -31,7 +33,7 @@
fsm_sup_ref, fsm_sup_ref,
msg_num=0, msg_num=0,
get_msgs,%{M, F} get_msgs,%{M, F}
get_msgs_args, get_msgs_args=null,
msg_list=[] msg_list=[]
}). }).


Expand Down
2 changes: 1 addition & 1 deletion src/bael.erl
Expand Up @@ -44,4 +44,4 @@ stop() ->


init_db_conn()-> init_db_conn()->
emysql:add_pool(db_test, ?DB_CONN_NUM, ?DB_USER_NAME, ?DB_PASSWORD, emysql:add_pool(db_test, ?DB_CONN_NUM, ?DB_USER_NAME, ?DB_PASSWORD,
?DB_HOSTNAME, ?DB_PORT, ?DB_DEFAULT_DB, utf8). ?DB_HOSTNAME, ?DB_PORT, ?DB_DEFAULT_DB, utf8).
2 changes: 1 addition & 1 deletion src/bael_fsm.erl
Expand Up @@ -25,7 +25,7 @@ handle_event(_Event, _StateName, StateData)->


handle_sync_event(just_test, From, StateName, StateData)-> handle_sync_event(just_test, From, StateName, StateData)->
io:format("handle sync_send_all_state_event(from: ~p): ~p~n", io:format("handle sync_send_all_state_event(from: ~p): ~p~n",
[From, just_test]), [From, just_test]),
io:format("fsm(~p) state: ~p~n", [self(), StateName]), io:format("fsm(~p) state: ~p~n", [self(), StateName]),
{reply, {self(), reply}, StateName, StateData, hibernate}; {reply, {self(), reply}, StateName, StateData, hibernate};
handle_sync_event(test_timeout, _From, StateName, StateData)-> handle_sync_event(test_timeout, _From, StateName, StateData)->
Expand Down
8 changes: 5 additions & 3 deletions src/bael_fsm_sup.erl
Expand Up @@ -13,7 +13,9 @@ upgrade()->


init([])-> init([])->
Strategy={one_for_one, 10, 10}, Strategy={one_for_one, 10, 10},
SpecsList=[{lists:concat(["fsm_", ID]), {bael_fsm, start_link, []}, SpecsList=[{
permanent, 5000, worker, dynamic}|| lists:concat(["fsm_", ID]),
ID<-lists:seq(0, ?MAX_FSMS_POOL_SIZE-1)], {bael_fsm, start_link, []},
permanent, 5000, worker, dynamic
}||ID<-lists:seq(0, ?MAX_FSMS_POOL_SIZE-1)],
{ok, {Strategy, lists:flatten(SpecsList)}}. {ok, {Strategy, lists:flatten(SpecsList)}}.
66 changes: 47 additions & 19 deletions src/bael_msg_manager.erl
@@ -1,49 +1,77 @@
-module(bael_msg_manager). -module(bael_msg_manager).
-behaviour(gen_fsm). -behaviour(gen_fsm).
-include("bael.hrl"). -include("bael.hrl").
-export([start_link/3]). -export([start_link/2]).
-export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, -export([init/1, handle_event/3, handle_sync_event/4, handle_info/3,
terminate/3, code_change/4]). terminate/3, code_change/4]).
-export([idle/2]). -export([idle/2, work/2]).


start_link(FsmSupRef, GetMsgs, InitArgs)-> start_link(FsmSupRef, GetMsgs)->
gen_server:start_link({local, ?MODULE}, ?MODULE, gen_server:start_link({local, ?MODULE}, ?MODULE,
[FsmSupRef, GetMsgs, InitArgs], []). [FsmSupRef, GetMsgs], []).


init([FsmSupRef, {M, F}, InitArgs])-> init([FsmSupRef, {M, F}])->
{Msgs, NextArgs}=M:F(InitArgs),
{ok, idle, #msg_manager_state{ {ok, idle, #msg_manager_state{
fsm_sup_ref=FsmSupRef, fsm_sup_ref=FsmSupRef,
get_msgs={M, F}, get_msgs={M, F}
get_msgs_args=NextArgs,
msg_list=Msgs
}}. }}.


handle_event(_Event, _StateName, StateData)-> handle_event(_Event, StateName, StateData)->
{next_state, idle, StateData}. {next_state, StateName, StateData}.


handle_sync_event(_Event, _From, _StateName, StateData)-> handle_sync_event(_Event, _From, StateName, StateData)->
%{next_state, idle, StateData}. %{next_state, idle, StateData}.
{reply, null, idle, StateData}. {reply, null, StateName, StateData}.


handle_info(_Info, _StateName, StateData)-> handle_info(_Info, StateName, StateData)->
{next_state, idle, StateData}. {next_state, StateName, StateData}.


terminate(_Reason, _StateName, _StateData)-> terminate(_Reason, _StateName, _StateData)->
ok. ok.


code_change(_OldVsn, _StateName, StateData, _Extra)-> code_change(_OldVsn, _StateName, StateData, _Extra)->
{ok, idle, StateData}. {ok, idle, StateData}.


idle(start, StateData)-> idle({start, Args}, StateData)->
{next_state, idle, StateData}. {next_state, work, StateData#msg_manager_state{
get_msgs_args=Args
}, 1}.

work(timeout, StateData)->
{MsgList, NextArgs}=check_msg_list(StateData),
case MsgList of
[]->
{next_state, idle, StateData#msg_manager_state{
msg_list=[],
get_msgs_args=null
}};
[Msg|Tail]->
Pid=find_idle_fsm(StateData#msg_manager_state.fsm_sup_ref),
gen_fsm:send_all_state_event(Pid, Msg),
{next_state, work, StateData#msg_manager_state{
msg_list=Tail,
get_msgs_args=NextArgs
}, 1}
end.

check_msg_list(#msg_manager_state{
msg_list=List,
get_msgs={M, F},
get_msgs_args=Args
})->
case List of
[]->
M:F(Args);
_->
{List, Args}
end.


find_idle_fsm(FsmSupRef)-> find_idle_fsm(FsmSupRef)->
Func=fun(X)-> Func=fun(X)->
{_, Pid, _, _}=X, {_, Pid, _, _}=X,
try try
State=gen_fsm:sync_send_all_event(Pid, get_state, State=gen_fsm:sync_send_all_event(Pid, get_state,
?FSM_BUSY_TIMEOUT), ?FSM_BUSY_TIMEOUT),
{State, Pid} {State, Pid}
catch catch
_:_->{busy, Pid} _:_->{busy, Pid}
Expand All @@ -52,7 +80,7 @@ find_idle_fsm(FsmSupRef)->
List=lists:foreach(Func, supervisor:which_children(FsmSupRef)), List=lists:foreach(Func, supervisor:which_children(FsmSupRef)),
case proplists:get_all_values(idle, List) of case proplists:get_all_values(idle, List) of
[]-> []->
timer:sleep(1000), timer:sleep(?MSG_MANAGER_RETRY_TIME),
find_idle_fsm(FsmSupRef); find_idle_fsm(FsmSupRef);
Res-> Res->
hd(Res) hd(Res)
Expand Down
8 changes: 5 additions & 3 deletions src/bael_server_sup.erl
Expand Up @@ -13,7 +13,9 @@ upgrade()->


init([])-> init([])->
Strategy={one_for_one, 10, 10}, Strategy={one_for_one, 10, 10},
SpecsList=[{lists:concat(["server_", ID]), {bael_server, start_link, []}, SpecsList=[{
permanent, 5000, worker, dynamic}|| lists:concat(["server_", ID]),
ID<-lists:seq(0, ?MAX_SERVERS_POOL_SIZE-1)], {bael_server, start_link, []},
permanent, 5000, worker, dynamic
}||ID<-lists:seq(0, ?MAX_SERVERS_POOL_SIZE-1)],
{ok, {Strategy, lists:flatten(SpecsList)}}. {ok, {Strategy, lists:flatten(SpecsList)}}.
34 changes: 21 additions & 13 deletions src/bael_struct.erl
Expand Up @@ -29,22 +29,30 @@ set_value([Head|Tail], NewValue, Struct)->
Value=proplists:get_value(Key, ValueList), Value=proplists:get_value(Key, ValueList),
if if
Value=:=undefined->throw("invalid_key"); Value=:=undefined->throw("invalid_key");
Tail=:=[]-> Tail=:=[]->{
{struct, lists:append(proplists:delete(Key, ValueList), struct,
[{Key, bael_common_func:thing_to_binary(NewValue)}])}; lists:append(proplists:delete(Key, ValueList),
length(Tail)>0-> [{Key, bael_common_func:thing_to_binary(NewValue)}]
{struct, lists:append(proplists:delete(Key, ValueList), )};
[{Key, set_value(Tail, length(Tail)>0->{
bael_common_func:thing_to_binary(NewValue), Value)}])} struct,
lists:append(proplists:delete(Key, ValueList), [{
Key,
set_value(
Tail,
bael_common_func:thing_to_binary(NewValue),
Value
)}])}
end end
catch catch
Type:What-> Type:What->
Report=["set struct value failed", Report=[
{key, Head}, "set struct value failed",
{value, NewValue}, {key, Head},
{type, Type}, {value, NewValue},
{what, What}, {type, Type},
{trace, erlang:get_stacktrace()}], {what, What},
{trace, erlang:get_stacktrace()}],
error_logger:error_report(Report), error_logger:error_report(Report),
Type(set_struct_value_failed) Type(set_struct_value_failed)
end. end.
8 changes: 5 additions & 3 deletions src/bael_views.erl
Expand Up @@ -33,9 +33,11 @@ hello('POST', Req)->
handle_data_table(Req, DataTable)-> handle_data_table(Req, DataTable)->
{_ResultPacket, _, FieldList, TableData, _}=DataTable, {_ResultPacket, _, FieldList, TableData, _}=DataTable,
FieldNames=get_fields(FieldList), FieldNames=get_fields(FieldList),
bael_shortcuts:render_ok(Req, bael_table_dtl, [ bael_shortcuts:render_ok(
{field_names, FieldNames}, Req,
{table_data, TableData}]). bael_table_dtl,
[{field_names, FieldNames}, {table_data, TableData}]
).
get_fields([])-> get_fields([])->
[]; [];
get_fields([Head|Tail])-> get_fields([Head|Tail])->
Expand Down
13 changes: 9 additions & 4 deletions src/bael_xml.erl
Expand Up @@ -54,8 +54,11 @@ save_elements_to_dict({Tags, Depth, XmlElement})->
Length=length(ParentsList)+1, Length=length(ParentsList)+1,
if if
Depth=:=null orelse Depth>=Length-> Depth=:=null orelse Depth>=Length->
{TextList, ElementList}= {TextList, ElementList}=lists:foldl(
lists:foldl(fun filter_xml_content/2, {[], []}, Content), fun filter_xml_content/2,
{[], []},
Content
),
Element=#xml_element{ Element=#xml_element{
tag_name=Tag, tag_name=Tag,
parents=ParentsList, parents=ParentsList,
Expand All @@ -67,8 +70,10 @@ save_elements_to_dict({Tags, Depth, XmlElement})->
MathElementsList=erlang:get(?MATH_XML_ELEMENTS_LIST), MathElementsList=erlang:get(?MATH_XML_ELEMENTS_LIST),
if if
Head=:=Tag andalso Math=:=true-> Head=:=Tag andalso Math=:=true->
erlang:put(?MATH_XML_ELEMENTS_LIST, erlang:put(
lists:append(MathElementsList, [Element])); ?MATH_XML_ELEMENTS_LIST,
lists:append(MathElementsList, [Element])
);
true->not_math true->not_math
end, end,
lists:foreach(fun save_elements_to_dict/1, lists:foreach(fun save_elements_to_dict/1,
Expand Down

0 comments on commit bdc596d

Please sign in to comment.