context.c

Include dependency graph for context.c:

digraph { graph [bgcolor="#00000000"] node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2] edge [color="#1414CE"] "8" [label="stdbool.h" tooltip="stdbool.h"] "32" [label="erl_nif_priv.h" tooltip="erl_nif_priv.h"] "25" [label="refc_binary.h" tooltip="refc_binary.h"] "30" [label="defaultatoms.h" tooltip="defaultatoms.h"] "5" [label="atom.h" tooltip="atom.h"] "11" [label="assert.h" tooltip="assert.h"] "31" [label="dictionary.h" tooltip="dictionary.h"] "16" [label="utils.h" tooltip="utils.h"] "20" [label="synclist.h" tooltip="synclist.h"] "28" [label="fenv.h" tooltip="fenv.h"] "14" [label="list.h" tooltip="list.h"] "4" [label="stdint.h" tooltip="stdint.h"] "1" [label="/__w/AtomVM/AtomVM/src/libAtomVM/context.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/context.c" fillcolor="#BFBFBF"] "6" [label="stdlib.h" tooltip="stdlib.h"] "2" [label="context.h" tooltip="context.h"] "24" [label="memory.h" tooltip="memory.h"] "33" [label="sys.h" tooltip="sys.h"] "34" [label="module.h" tooltip="module.h"] "37" [label="valueshashtable.h" tooltip="valueshashtable.h"] "26" [label="resources.h" tooltip="resources.h"] "21" [label="term.h" tooltip="term.h"] "17" [label="stddef.h" tooltip="stddef.h"] "9" [label="erl_nif.h" tooltip="erl_nif.h"] "36" [label="exportedfunction.h" tooltip="exportedfunction.h"] "12" [label="limits.h" tooltip="limits.h"] "7" [label="atom_table.h" tooltip="atom_table.h"] "22" [label="sys/types.h" tooltip="sys/types.h"] "23" [label="string.h" tooltip="string.h"] "10" [label="term_typedef.h" tooltip="term_typedef.h"] "3" [label="globalcontext.h" tooltip="globalcontext.h"] "19" [label="smp.h" tooltip="smp.h"] "39" [label="opcodesswitch.h" tooltip="opcodesswitch.h"] "35" [label="atomshashtable.h" tooltip="atomshashtable.h"] "38" [label="time.h" tooltip="time.h"] "29" [label="math.h" tooltip="math.h"] "27" [label="timer_list.h" tooltip="timer_list.h"] "15" [label="mailbox.h" tooltip="mailbox.h"] "18" [label="stdio.h" tooltip="stdio.h"] "13" [label="inttypes.h" tooltip="inttypes.h"] "32" -> "2" [dir=forward tooltip="include"] "32" -> "24" [dir=forward tooltip="include"] "32" -> "26" [dir=forward tooltip="include"] "25" -> "8" [dir=forward tooltip="include"] "25" -> "6" [dir=forward tooltip="include"] "25" -> "14" [dir=forward tooltip="include"] "25" -> "26" [dir=forward tooltip="include"] "30" -> "3" [dir=forward tooltip="include"] "5" -> "4" [dir=forward tooltip="include"] "5" -> "6" [dir=forward tooltip="include"] "31" -> "14" [dir=forward tooltip="include"] "31" -> "21" [dir=forward tooltip="include"] "16" -> "17" [dir=forward tooltip="include"] "16" -> "18" [dir=forward tooltip="include"] "16" -> "6" [dir=forward tooltip="include"] "20" -> "18" [dir=forward tooltip="include"] "20" -> "14" [dir=forward tooltip="include"] "20" -> "19" [dir=forward tooltip="include"] "1" -> "2" [dir=forward tooltip="include"] "1" -> "28" [dir=forward tooltip="include"] "1" -> "29" [dir=forward tooltip="include"] "1" -> "30" [dir=forward tooltip="include"] "1" -> "31" [dir=forward tooltip="include"] "1" -> "9" [dir=forward tooltip="include"] "1" -> "32" [dir=forward tooltip="include"] "1" -> "3" [dir=forward tooltip="include"] "1" -> "14" [dir=forward tooltip="include"] "1" -> "15" [dir=forward tooltip="include"] "1" -> "19" [dir=forward tooltip="include"] "1" -> "20" [dir=forward tooltip="include"] "1" -> "33" [dir=forward tooltip="include"] "1" -> "21" [dir=forward tooltip="include"] "1" -> "16" [dir=forward tooltip="include"] "1" -> "39" [dir=forward tooltip="include"] "2" -> "3" [dir=forward tooltip="include"] "2" -> "14" [dir=forward tooltip="include"] "2" -> "15" [dir=forward tooltip="include"] "2" -> "19" [dir=forward tooltip="include"] "2" -> "21" [dir=forward tooltip="include"] "2" -> "27" [dir=forward tooltip="include"] "24" -> "4" [dir=forward tooltip="include"] "24" -> "6" [dir=forward tooltip="include"] "24" -> "9" [dir=forward tooltip="include"] "24" -> "10" [dir=forward tooltip="include"] "24" -> "16" [dir=forward tooltip="include"] "33" -> "3" [dir=forward tooltip="include"] "33" -> "34" [dir=forward tooltip="include"] "33" -> "4" [dir=forward tooltip="include"] "33" -> "38" [dir=forward tooltip="include"] "34" -> "8" [dir=forward tooltip="include"] "34" -> "4" [dir=forward tooltip="include"] "34" -> "5" [dir=forward tooltip="include"] "34" -> "7" [dir=forward tooltip="include"] "34" -> "35" [dir=forward tooltip="include"] "34" -> "2" [dir=forward tooltip="include"] "34" -> "36" [dir=forward tooltip="include"] "34" -> "3" [dir=forward tooltip="include"] "34" -> "21" [dir=forward tooltip="include"] "34" -> "37" [dir=forward tooltip="include"] "26" -> "6" [dir=forward tooltip="include"] "26" -> "9" [dir=forward tooltip="include"] "26" -> "14" [dir=forward tooltip="include"] "26" -> "24" [dir=forward tooltip="include"] "26" -> "20" [dir=forward tooltip="include"] "21" -> "22" [dir=forward tooltip="include"] "21" -> "8" [dir=forward tooltip="include"] "21" -> "4" [dir=forward tooltip="include"] "21" -> "18" [dir=forward tooltip="include"] "21" -> "6" [dir=forward tooltip="include"] "21" -> "23" [dir=forward tooltip="include"] "21" -> "24" [dir=forward tooltip="include"] "21" -> "25" [dir=forward tooltip="include"] "21" -> "16" [dir=forward tooltip="include"] "21" -> "10" [dir=forward tooltip="include"] "9" -> "10" [dir=forward tooltip="include"] "36" -> "21" [dir=forward tooltip="include"] "7" -> "8" [dir=forward tooltip="include"] "7" -> "5" [dir=forward tooltip="include"] "10" -> "11" [dir=forward tooltip="include"] "10" -> "12" [dir=forward tooltip="include"] "10" -> "13" [dir=forward tooltip="include"] "10" -> "4" [dir=forward tooltip="include"] "3" -> "4" [dir=forward tooltip="include"] "3" -> "5" [dir=forward tooltip="include"] "3" -> "7" [dir=forward tooltip="include"] "3" -> "9" [dir=forward tooltip="include"] "3" -> "14" [dir=forward tooltip="include"] "3" -> "15" [dir=forward tooltip="include"] "3" -> "19" [dir=forward tooltip="include"] "3" -> "20" [dir=forward tooltip="include"] "3" -> "21" [dir=forward tooltip="include"] "3" -> "27" [dir=forward tooltip="include"] "19" -> "8" [dir=forward tooltip="include"] "35" -> "5" [dir=forward tooltip="include"] "27" -> "8" [dir=forward tooltip="include"] "27" -> "4" [dir=forward tooltip="include"] "27" -> "14" [dir=forward tooltip="include"] "15" -> "8" [dir=forward tooltip="include"] "15" -> "14" [dir=forward tooltip="include"] "15" -> "10" [dir=forward tooltip="include"] "15" -> "16" [dir=forward tooltip="include"] }

Defines

IMPL_EXECUTE_LOOP
DEFAULT_STACK_SIZE 8
BYTES_PER_TERM (TERM_BITS / 8)

Functions

static struct ResourceContextMonitor *context_monitors_handle_terminate(Context *ctx)
static void destroy_extended_registers(Context *ctx, unsigned int live)
Context *context_new(GlobalContext *glb)

Creates a new context.

Allocates a new Context struct and initialize it. The newly created context is also inserted into the processes table, however it is not scheduled, allowing for further initialization.

Parameters:
  • glb – The global context of this virtual machine instance.

Returns:

created context.

void context_destroy(Context *ctx)

Destroys a context.

Frees context resources and memory and removes it from the processes table. This should be called from the scheduler only. To actually delete a context that was created with context_new, use scheduler_terminate.

Parameters:
  • c – the context that will be destroyed.

void context_process_kill_signal(Context *ctx, struct TermSignal *signal)

Process a kill signal, setting the exit reason and changing the killed flag.

Parameters:
  • ctx – the context being executed

  • signal – the kill message

void context_process_process_info_request_signal(Context *ctx, struct BuiltInAtomRequestSignal *signal, bool process_table_locked)

Process a process info request signal.

Parameters:
  • ctx – the context being executed

  • signal – the process info signal

  • process_table_locked – whether process table is already locked

bool context_process_signal_trap_answer(Context *ctx, struct TermSignal *signal)

Process a trap answer signal.

Parameters:
  • ctx – the context being executed

  • signal – the answer message

Returns:

true if successful, false in case of memory error

void context_process_flush_monitor_signal(Context *ctx, uint64_t ref_ticks, bool info)

Process a flush monitor signal.

Parameters:
  • ctx – the context being executed

  • ref_ticks – the monitor reference

  • info – whether to return FALSE_ATOM if no message was flushed.

Process a link exit signal.

Parameters:
  • ctx – the context being executed

  • signal – the signal with the exit info tuple

Returns:

true if the process is trapping exit and info tuple was enqueued as a message;

void context_process_monitor_down_signal(Context *ctx, struct TermSignal *signal)

Process a monitor down signal.

Parameters:
  • ctx – the context being executed

  • signal – the signal with the down info tuple

void context_update_flags(Context *ctx, int mask, int value)

Set or clear a flag on another context.

atomically update flags <- (flags & mask) | value

Parameters:
  • ctx – the context to set/clear flag on.

  • mask – the mask to apply on flags

  • value – the value to set

size_t context_message_queue_len(Context *ctx)

Returns number of messages in the process’s mailbox.

Parameters:
  • ctx – a valid context.

Returns:

the number of messages in the process’s mailbox

size_t context_size(Context *ctx)

Returns total amount of size (in byes) occupied by the process.

Parameters:
  • ctx – a valid context.

Returns:

total amount of size (in byes) occupied by the process

bool context_get_process_info(Context *ctx, term *out, size_t *term_size, term atom_key, Heap *heap)

Get process information.

Parameters:
  • ctx – the context being executed

  • out – the answer term. Can be NULL if only the size matters.

  • term_size – the size of the answer term, in words.

  • atom_key – the key representing the info to get

  • heap – the heap to allocate the answer to

Returns:

true if successful, false in case of an error in which case *out is filled with an exception atom if it was not NULL

Half-link process to another process.

Parameters:
  • monitor_pid – process to link to

Returns:

the allocated monitor or NULL if allocation failed

struct Monitor *monitor_new(term monitor_pid, uint64_t ref_ticks, bool is_monitoring)

Create a monitor on a process.

Parameters:
  • monitor_pid – monitoring process

  • ref_ticks – reference of the monitor

  • is_monitoring – if ctx is the monitoring process

Returns:

the allocated monitor or NULL if allocation failed

struct Monitor *monitor_resource_monitor_new(void *resource, uint64_t ref_ticks)

Create a resource monitor.

Parameters:
  • resource – resource object

  • ref_ticks – reference associated with the monitor

Returns:

the allocated resource monitor or NULL if allocation failed

bool context_add_monitor(Context *ctx, struct Monitor *new_monitor)

Add a monitor on a process.

Called within the process only. This function is called from MonitorSignal. Monitor is not added if it already exists. Monitors are identified by a reference, but links have no reference and a link can only exist once.

Parameters:
  • ctx – the context being executed

  • new_monitor – monitor object to add (ownership belongs to context afterwards)

Returns:

true if the monitor was added, false if it already existed and new_monitor waw freed.

Half-unlink process to another process.

If process is found, an unlink id is generated and the link is deactivated.

Parameters:
  • ctx – the context being executed

  • link_pid – process to unlink from

  • unlink_id – on output, unlink id to send to the target process

Returns:

true if process was found

Half-unlink process to another process.

Called within the process only when an UnlinkID signal is received. If link is found, remove it and sends an UnlinkIDAck signal to the linked process.

Parameters:
  • ctx – the context being executed

  • link_pid – process to unlink from

  • unlink_id – unlink id from the signal

  • process_table_locked – whether process table is already locked

Half-unlink process to another process.

Called within the process only when an UnlinkIDAck signal is received. If link is found and matches, remove it.

Parameters:
  • ctx – the context being executed

  • link_pid – process to unlink from

  • unlink_id – unlink id from the signal

void context_demonitor(Context *ctx, uint64_t ref_ticks)

Destroy a monitor on a process (monitoring, monitored or resource)

Called within the process only. This function is called from DemonitorSignal as well as demonitor nif on monitoring process.

Parameters:
  • ctx – the context being executed (monitoring or monitored)

  • ref_ticks – reference of the monitor to remove

term context_get_monitor_pid(Context *ctx, uint64_t ref_ticks, bool *is_monitoring)

Get target of a monitor.

Parameters:
  • ctx – the context being executed

  • ref_ticks – reference of the monitor to remove

  • is_monitoring – whether ctx is the monitoring process.

Returns:

pid of monitoring process, self() if process is monitoring (and not monitored) or term_invalid() if no monitor could be found.