mirror https://github.com/uwiger/gproc

Ulf Wiger 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
doc 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
include 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
patches d0bc9d2409 restructuring 16 years ago
priv 42a9f405be minor directory cleanup 16 years ago
reference 98ba2d9bfa added rebar support 14 years ago
src 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
test 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
.gitignore 9c8845370b 'git' tag in .app.src; addressed warnings 13 years ago
Makefile fb54e3054d removed local rebar; find installed rebar instead 13 years ago
README.md 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
rebar 1740e41069 Fix dist update_counter() bug, add gproc_ps module, add update_counters/1 13 years ago
rebar.config a486aab01c ws cleanup & unmatched returns 14 years ago

README.md

#The gproc application#

Authors: Ulf Wiger (ulf.wiger@erlang-solutions.com), Joseph Wayne Norton (norton@geminimobile.com).

Extended process dictionary

##Introduction##

Gproc is a process dictionary for Erlang, which provides a number of useful features beyond what the built-in dictionary has:

  • Use any term as a process alias

  • Register a process under several aliases

  • Non-unique properties can be registered simultaneously by many processes

  • QLC and match specification interface for efficient queries on the dictionary

  • Await registration, let's you wait until a process registers itself

  • Atomically give away registered names and properties to another process

  • Counters, and aggregated counters, which automatically maintain the total of all counters with a given name

  • Global registry, with all the above functions applied to a network of nodes

###Use case: System inspection##

Gproc was designed to work as a central index for "process metadata", i.e. properties that describe the role and characteristics of each process. Having a single registry that is flexible enough to hold important types of property makes it easier to (a) find processes of a certain type, and (b) query and browse key data in a running system.

###Use case: Pub/Sub patterns##

An interesting application of gproc is building publish/subscribe patterns. Example:

subscribe(EventType) ->
    %% Gproc notation: {p, l, Name} means {(p)roperty, (l)ocal, Name}
    gproc:reg({p, l, {?MODULE, EventType}}).

notify(EventType, Msg) ->
    Key = {?MODULE, EventType},
    gproc:send({p, l, Key}, {self(), Key, Msg}).

###Use case: Environment handling##

Gproc provides a set of functions to read environment variables, possibly from alternative sources, and cache them for efficient lookup. Caching also provides a way to see which processes rely on certain configuration values, as well as which values they actually ended up using.

See gproc:get_env/4, gproc:get_set_env/4 and gproc:set_env/5 for details.

##Testing##

Gproc has a QuickCheck test suite, covering a fairly large part of the local gproc functionality, although none of the global registry. It requires a commercial EQC license, but rebar is smart enough to detect whether EQC is available, and if it isn't, the code in gproc_eqc.erl will be "defined away".

There is also an eunit suite, covering the basic operations for local and global gproc.

##Building Edoc##

By default, ./rebar doc generates Github-flavored Markdown files.If you want to change this, remove the edoc_opts line from rebar.config.

Gproc was first introduced at the ACM SIGPLAN Erlang Workshop in Freiburg 2007 (Paper available here).

##Modules##

gproc
gproc_app
gproc_dist
gproc_info
gproc_init
gproc_lib
gproc_monitor
gproc_ps
gproc_sup