Packages
electric
1.0.0-beta.22
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/debug/process.ex
defmodule Debug.Process do
def top_memory_by_type(count \\ 5) do
Process.list()
|> Enum.map(&type_and_memory/1)
|> Enum.reject(&is_nil/1)
|> Enum.group_by(& &1.type, & &1.memory)
|> Enum.map(fn {type, memory} -> %{type: type, memory: Enum.sum(memory)} end)
|> Enum.sort_by(&(-&1.memory))
|> Enum.take(count)
end
defp type_and_memory(pid) do
with [memory: memory] <- Process.info(pid, [:memory]),
type when type != :dead <- type(pid) do
%{type: type, memory: memory}
end
end
def type(pid) do
with :error <- process_type_if_dead(pid),
:error <- process_label(pid),
:error <- initial_module(pid) do
:unknown
end
end
defp process_type_if_dead(pid) do
if Process.alive?(pid) do
:error
else
:dead
end
end
defp process_label(pid) do
case :proc_lib.get_label(pid) do
:undefined -> :error
{name, _} -> name
{name, _, _} -> name
name when is_atom(name) -> name
name when is_binary(name) -> name
_ -> :error
end
end
defp initial_module(pid) do
[dictionary: dictionary] = Process.info(pid, [:dictionary])
dictionary
|> Map.new()
|> Map.get(:"$initial_call")
|> case do
{module, _function, _arg_count} ->
module
_ ->
initial_module_from_info(pid)
end
end
defp initial_module_from_info(pid) do
case Process.info(pid, [:initial_call]) do
[initial_call: {module, _function, _arg_count}] -> module
nil -> :error
end
end
end