A Guide To The Erlang Source
From Erlang Community
| Revision as of 20:19, 19 August 2009 (edit) Zghst (Talk | contribs) ← Previous diff |
Revision as of 20:40, 19 January 2011 (edit) (undo) Zghst (Talk | contribs) Next diff → |
||
| Line 12: | Line 12: | ||
| == Types == | == Types == | ||
| - | + | See sys.h for the basic datatypes: | |
| - | + | ** Data types: | |
| + | ** | ||
| + | ** Eterm: A tagged erlang term (possibly 64 bits) | ||
| + | ** BeamInstr: A beam code instruction unit, possibly larger than Eterm, not smaller. | ||
| + | ** UInt: An unsigned integer exactly as large as an Eterm. | ||
| + | ** SInt: A signed integer exactly as large as an eterm and therefor large | ||
| + | ** enough to hold the return value of the signed_val() macro. | ||
| + | ** UWord: An unsigned integer at least as large as a void * and also as large | ||
| + | ** or larger than an Eterm | ||
| + | ** SWord: A signed integer at least as large as a void * and also as large | ||
| + | ** or larger than an Eterm | ||
| + | ** Uint32: An unsigned integer of 32 bits exactly | ||
| + | ** Sint32: A signed integer of 32 bits exactly | ||
| + | ** Uint16: An unsigned integer of 16 bits exactly | ||
| + | ** Sint16: A signed integer of 16 bits exactly. | ||
| + | |||
| + | See erts/emulator/beam/big.c for the conversion between types. For example uint_to_big(Uint x, Eterm *y). term_to_Uint(Eterm term, Uint *up). | ||
| + | An Eterm can contain any erlang term like atoms, integers, etc. | ||
| + | |||
| + | == BIFs == | ||
| + | |||
| + | The bifs are summed up in the bif.tab file. For example: | ||
| + | bif 'erl.lang':exit/1 ebif_exit_1 | ||
| + | bif erlang:exit/2 | ||
| + | |||
| + | This means the exit bif is mapped to the exit_1 method in the bif.c file. | ||
| + | The bif.c file holds the bif implementations like: | ||
| + | |||
| + | BIF_RETTYPE spawn_3(BIF_ALIST_3) | ||
| + | {... | ||
| + | BIF_ALIST_3 means you have BIF_P, BIF_ARG1 to 3 and | ||
| + | The arguments BIF_ARG1 are Eterms, so you have to check them with is_number(BIF_ARG_1), is_atom, is_tuple, etc | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| == Scheduler == | == Scheduler == | ||
Revision as of 20:40, 19 January 2011
A guide to the erlang source.
Contents |
Download
The source can be downloaded from: http://erlang.org/download.html or http://github.com/mfoemmel/erlang-otp/tree/master
Tree
Most of the interesting code is in: erts/emulator/beam
Atoms
The atoms used in erlang are listed in erts/emulator/beam/atom.names and are referenced in the code as am_foo. So the 'EXIT' atom is am_EXIT in the code.
Types
See sys.h for the basic datatypes:
- Data types:
- Eterm: A tagged erlang term (possibly 64 bits)
- BeamInstr: A beam code instruction unit, possibly larger than Eterm, not smaller.
- UInt: An unsigned integer exactly as large as an Eterm.
- SInt: A signed integer exactly as large as an eterm and therefor large
- enough to hold the return value of the signed_val() macro.
- UWord: An unsigned integer at least as large as a void * and also as large
- or larger than an Eterm
- SWord: A signed integer at least as large as a void * and also as large
- or larger than an Eterm
- Uint32: An unsigned integer of 32 bits exactly
- Sint32: A signed integer of 32 bits exactly
- Uint16: An unsigned integer of 16 bits exactly
- Sint16: A signed integer of 16 bits exactly.
See erts/emulator/beam/big.c for the conversion between types. For example uint_to_big(Uint x, Eterm *y). term_to_Uint(Eterm term, Uint *up). An Eterm can contain any erlang term like atoms, integers, etc.
BIFs
The bifs are summed up in the bif.tab file. For example: bif 'erl.lang':exit/1 ebif_exit_1 bif erlang:exit/2
This means the exit bif is mapped to the exit_1 method in the bif.c file. The bif.c file holds the bif implementations like:
BIF_RETTYPE spawn_3(BIF_ALIST_3) {... BIF_ALIST_3 means you have BIF_P, BIF_ARG1 to 3 and The arguments BIF_ARG1 are Eterms, so you have to check them with is_number(BIF_ARG_1), is_atom, is_tuple, etc
Scheduler
The process struct is defined in erts/emulator/beam/process.h. The important function is Process *schedule(Process *p, int calls) in process.c . The next process is picked in "pick_next_process" of that method.
Process
Process statuses are:
- define P_FREE 0
- define P_RUNABLE 1
- define P_WAITING 2
- define P_RUNNING 3
- define P_EXITING 4
- define P_GARBING 5
- define P_SUSPENDED 6
Monitors and links
See erl_monitor.c and .h. The main structs are ErtsLinks and ErtsMonitor. Each process has a *ErtLinks and *ErtsMonitor (herein all its links/monitors are kept as an AVL tree). Actions are done with erts_sweep_links(ErtsLink *root, ...) and erts_sweep_monitors(ErtsMonitor *root, ...).

Digg It
Del.icio.us
Reddit
Facebook
Stumble Upon
Technorati

