Skip to content

Commit 18f1806

Browse files
committed
Merge pull request erlang-lager#37 from basho/adt-fix-atom-leak
Fix atom leak
2 parents d81e377 + 2f9b793 commit 18f1806

File tree

2 files changed

+47
-79
lines changed

2 files changed

+47
-79
lines changed

src/lager.erl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
clear_all_traces/0, stop_trace/1, status/0,
2828
get_loglevel/1, set_loglevel/2, set_loglevel/3, get_loglevels/0,
2929
minimum_loglevel/1, posix_error/1,
30-
safe_format/3, safe_format_chop/3]).
30+
safe_format/3, safe_format_chop/3,dispatch_log/8]).
3131

3232
-type log_level() :: debug | info | notice | warning | error | critical | alert | emergency.
3333
-type log_level_number() :: 0..7.
@@ -51,6 +51,32 @@ start_ok(App, {error, {not_started, Dep}}) ->
5151
start_ok(App, {error, Reason}) ->
5252
erlang:error({app_start_failed, App, Reason}).
5353

54+
55+
-spec dispatch_log(log_level(), atom(), atom(), pos_integer(), pid(), list(), string(), list()) ->
56+
ok | {error, lager_not_running}.
57+
58+
dispatch_log(Severity, Module, Function, Line, Pid, Traces, Format, Args) ->
59+
{LevelThreshold,TraceFilters} = lager_mochiglobal:get(loglevel,{?LOG_NONE,[]}),
60+
Result=
61+
case LevelThreshold >= lager_util:level_to_num(Severity) of
62+
true -> lager:log(Severity,Module,Function,Line,Pid,
63+
lager_util:maybe_utc(lager_util:localtime_ms()),
64+
Format,Args);
65+
_ -> ok
66+
end,
67+
case TraceFilters of
68+
[] -> Result;
69+
Match when is_list(Match) ->
70+
lager:log_dest(Severity,Module,Function,Line,Pid,
71+
lager_util:maybe_utc(lager_util:localtime_ms()),
72+
lager_util:check_traces(Traces,
73+
lager_util:level_to_num(Severity),
74+
TraceFilters,
75+
[]),
76+
Format,Args);
77+
_ -> ok
78+
end.
79+
5480
%% @private
5581
-spec log(log_level(), atom(), atom(), pos_integer(), pid(), tuple(), string(), list()) ->
5682
ok | {error, lager_not_running}.

src/lager_transform.erl

Lines changed: 20 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ transform_statement({call, Line, {remote, Line1, {atom, Line2, lager},
7373
{call, Line, {atom, Line, pid_to_list}, [
7474
{call, Line, {atom, Line ,self}, []}]}]},
7575
{nil, Line}}}}},
76-
{Traces, Arguments} = case Arguments0 of
76+
{Traces, Message, Arguments} = case Arguments0 of
7777
[Format] ->
78-
{DefaultAttrs, [Format, {nil, Line}]};
78+
{DefaultAttrs, Format, {nil, Line}};
7979
[Arg1, Arg2] ->
8080
%% some ambiguity here, figure out if these arguments are
8181
%% [Format, Args] or [Attr, Format].
@@ -84,86 +84,28 @@ transform_statement({call, Line, {remote, Line1, {atom, Line2, lager},
8484
case Arg1 of
8585
{cons, _, {tuple, _, _}, _} ->
8686
{concat_lists(Arg1, DefaultAttrs),
87-
[Arg2, {nil,Line}]};
87+
Arg2, {nil,Line}};
8888
_ ->
89-
{DefaultAttrs, [Arg1, Arg2]}
89+
{DefaultAttrs, Arg1, Arg2}
9090
end;
9191
[Attrs, Format, Args] ->
92-
{concat_lists(Attrs, DefaultAttrs), [Format, Args]}
92+
{concat_lists(Attrs, DefaultAttrs), Format, Args}
9393
end,
94-
%% a case to check the mochiglobal 'loglevel' key against the
95-
%% message we're trying to log
96-
LevelVar = list_to_atom("Level" ++ atom_to_list(get(module)) ++
97-
integer_to_list(Line)),
98-
TraceVar = list_to_atom("Traces" ++atom_to_list(get(module)) ++
99-
integer_to_list(Line)),
100-
MatchVar = list_to_atom("X" ++ atom_to_list(get(module)) ++
101-
integer_to_list(Line)),
102-
ResultVar = list_to_atom("Res" ++ atom_to_list(get(module)) ++
103-
integer_to_list(Line)),
104-
{block, Line, [
105-
{match,Line, {tuple,Line,[{var,Line,LevelVar},{var,Line,TraceVar}]},
106-
{call,Line, {remote,Line,{atom,Line,lager_mochiglobal},{atom,Line,get}},
107-
[{atom,Line,loglevel},
108-
{tuple,Line,
109-
[{integer,Line,?LOG_NONE}, {nil,Line}]}]}},
110-
{match, Line,
111-
{var, Line, ResultVar},
112-
{'case',Line,
113-
{op,Line,'>=',
114-
{var, Line, LevelVar},
115-
{integer, Line, lager_util:level_to_num(Severity)}},
116-
[{clause,Line,
117-
[{atom,Line,true}], %% yes, we log!
118-
[],
119-
[{call, Line, {remote, Line1, {atom, Line2, lager},
120-
{atom, Line3, log}}, [
121-
{atom, Line3, Severity},
122-
{atom, Line3, get(module)},
123-
{atom, Line3, get(function)},
124-
{integer, Line3, Line},
125-
{call, Line3, {atom, Line3 ,self}, []},
126-
{call, Line3, {remote, Line3,
127-
{atom, Line3 ,lager_util},
128-
{atom,Line3,maybe_utc}},
129-
[{call,Line3,{remote,Line3,
130-
{atom,Line3,lager_util},
131-
{atom,Line3,localtime_ms}},[]}]}
132-
| Arguments
133-
]}]},
134-
%% No, don't log
135-
{clause,Line3,[{var,Line3,'_'}],[],[{atom,Line3,ok}]}]}},
136-
{'case', Line, {var, Line3, TraceVar},
137-
[{clause, Line3, [{nil, Line3}], [], [{var, Line3, ResultVar}]},
138-
{clause, Line3, [{var, Line3, MatchVar}],
139-
[[{call,1,{atom,1,is_list},[{var,1,MatchVar}]}]],
140-
[{call, Line, {remote, Line1, {atom, Line2, lager},
141-
{atom, Line3, log_dest}}, [
142-
{atom, Line3, Severity},
143-
{atom, Line3, get(module)},
144-
{atom, Line3, get(function)},
145-
{integer, Line3, Line},
146-
{call, Line3, {atom, Line3 ,self}, []},
147-
{call, Line3, {remote, Line3,
148-
{atom, Line3 ,lager_util},
149-
{atom,Line3,maybe_utc}},
150-
[{call,Line3,{remote,Line3,
151-
{atom,Line3,lager_util},
152-
{atom,Line3,localtime_ms}},[]}]},
153-
{call, Line3, {remote, Line3,
154-
{atom, Line3, lager_util},
155-
{atom, Line3, check_traces}},
156-
[Traces,
157-
{integer, Line3,
158-
lager_util:level_to_num(Severity)},
159-
{var, Line3, TraceVar},
160-
{nil, Line3}]}
161-
| Arguments
162-
]}]},
163-
{clause, Line3, [{var, Line3, '_'}], [], [{var,
164-
Line3, ResultVar}]}
165-
]}
166-
]};
94+
{block, Line,
95+
[
96+
{call, Line, {remote, Line, {atom,Line1,lager},{atom,Line2,dispatch_log}},
97+
[
98+
{atom, Line3, Severity},
99+
{atom, Line3, get(module)},
100+
{atom, Line3, get(function)},
101+
{integer, Line3, Line},
102+
{call, Line3, {atom, Line3 ,self}, []},
103+
Traces,
104+
Message,
105+
Arguments
106+
]
107+
}
108+
]}; % block contents
167109
false ->
168110
Stmt
169111
end;

0 commit comments

Comments
 (0)