summaryrefslogtreecommitdiff
path: root/apps/couch/src/couch_stats_collector.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/couch/src/couch_stats_collector.erl')
-rw-r--r--apps/couch/src/couch_stats_collector.erl25
1 files changed, 10 insertions, 15 deletions
diff --git a/apps/couch/src/couch_stats_collector.erl b/apps/couch/src/couch_stats_collector.erl
index f7b9bb48..74238fc8 100644
--- a/apps/couch/src/couch_stats_collector.erl
+++ b/apps/couch/src/couch_stats_collector.erl
@@ -85,21 +85,12 @@ track_process_count(Stat) ->
track_process_count(self(), Stat).
track_process_count(Pid, Stat) ->
- MonitorFun = fun() ->
- Ref = erlang:monitor(process, Pid),
- receive {'DOWN', Ref, _, _, _} -> ok end,
- couch_stats_collector:decrement(Stat)
- end,
- case (catch couch_stats_collector:increment(Stat)) of
- ok -> spawn(MonitorFun);
- _ -> ok
- end.
-
+ gen_server:cast(?MODULE, {track_process_count, Stat, Pid}).
init(_) ->
ets:new(?HIT_TABLE, [named_table, set, public]),
ets:new(?ABS_TABLE, [named_table, duplicate_bag, public]),
- {ok, nil}.
+ {ok, []}.
terminate(_Reason, _State) ->
ok.
@@ -107,11 +98,15 @@ terminate(_Reason, _State) ->
handle_call(stop, _, State) ->
{stop, normal, stopped, State}.
-handle_cast(foo, State) ->
- {noreply, State}.
+handle_cast({track_process_count, Stat, Pid}, State) ->
+ ok = couch_stats_collector:increment(Stat),
+ Ref = erlang:monitor(process, Pid),
+ {noreply, [{Ref,Stat} | State]}.
-handle_info(_Info, State) ->
- {noreply, State}.
+handle_info({'DOWN', Ref, _, _, _}, State) ->
+ {Ref, Stat} = lists:keyfind(Ref, 1, State),
+ ok = couch_stats_collector:decrement(Stat),
+ {noreply, lists:keydelete(Ref, 1, State)}.
code_change(_OldVersion, State, _Extra) ->
{ok, State}.