diff options
Diffstat (limited to 'apps/couch/src/couch_stats_collector.erl')
-rw-r--r-- | apps/couch/src/couch_stats_collector.erl | 25 |
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}. |