erl_nif.h

Include dependency graph for erl_nif.h:

digraph {
    graph [bgcolor="#00000000"]
    node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
    edge [color="#1414CE"]
    "3" [label="assert.h" tooltip="assert.h"]
    "6" [label="stdint.h" tooltip="stdint.h"]
    "1" [label="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif.h" fillcolor="#BFBFBF"]
    "4" [label="limits.h" tooltip="limits.h"]
    "2" [label="term_typedef.h" tooltip="term_typedef.h"]
    "5" [label="inttypes.h" tooltip="inttypes.h"]
    "1" -> "2" [dir=forward tooltip="include"]
    "2" -> "3" [dir=forward tooltip="include"]
    "2" -> "4" [dir=forward tooltip="include"]
    "2" -> "5" [dir=forward tooltip="include"]
    "2" -> "6" [dir=forward tooltip="include"]
}

This graph shows which files directly or indirectly include erl_nif.h:

digraph {
    graph [bgcolor="#00000000"]
    node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
    edge [color="#1414CE"]
    "26" [label="/__w/AtomVM/AtomVM/src/libAtomVM/interop.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/interop.c"]
    "19" [label="/__w/AtomVM/AtomVM/src/libAtomVM/refc_binary.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/refc_binary.c"]
    "22" [label="/__w/AtomVM/AtomVM/src/libAtomVM/interop.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/interop.h"]
    "15" [label="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif_priv.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif_priv.h"]
    "7" [label="/__w/AtomVM/AtomVM/src/libAtomVM/nifs.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/nifs.c"]
    "48" [label="/__w/AtomVM/AtomVM/src/libAtomVM/refc_binary.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/refc_binary.h"]
    "34" [label="/__w/AtomVM/AtomVM/src/libAtomVM/nifs.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/nifs.h"]
    "43" [label="/__w/AtomVM/AtomVM/src/libAtomVM/defaultatoms.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/defaultatoms.h"]
    "44" [label="/__w/AtomVM/AtomVM/src/libAtomVM/dictionary.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/dictionary.c"]
    "52" [label="/__w/AtomVM/AtomVM/src/libAtomVM/dictionary.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/dictionary.h"]
    "2" [label="/__w/AtomVM/AtomVM/src/libAtomVM/context.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/context.c"]
    "10" [label="/__w/AtomVM/AtomVM/src/libAtomVM/bif.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/bif.c"]
    "8" [label="/__w/AtomVM/AtomVM/src/libAtomVM/context.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/context.h"]
    "9" [label="/__w/AtomVM/AtomVM/src/libAtomVM/bif.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/bif.h"]
    "27" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_crypto.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_crypto.c"]
    "35" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_crypto.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_crypto.h"]
    "14" [label="/__w/AtomVM/AtomVM/src/libAtomVM/memory.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/memory.c"]
    "46" [label="/__w/AtomVM/AtomVM/src/libAtomVM/memory.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/memory.h"]
    "33" [label="/__w/AtomVM/AtomVM/src/libAtomVM/sys.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/sys.h"]
    "11" [label="/__w/AtomVM/AtomVM/src/libAtomVM/module.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/module.c"]
    "29" [label="/__w/AtomVM/AtomVM/src/libAtomVM/module.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/module.h"]
    "25" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_net.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_net.c"]
    "36" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_net.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_net.h"]
    "20" [label="/__w/AtomVM/AtomVM/src/libAtomVM/resources.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/resources.c"]
    "47" [label="/__w/AtomVM/AtomVM/src/libAtomVM/resources.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/resources.h"]
    "24" [label="/__w/AtomVM/AtomVM/src/libAtomVM/inet.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/inet.c"]
    "28" [label="/__w/AtomVM/AtomVM/src/libAtomVM/term.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/term.c"]
    "23" [label="/__w/AtomVM/AtomVM/src/libAtomVM/inet.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/inet.h"]
    "49" [label="/__w/AtomVM/AtomVM/src/libAtomVM/term.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/term.h"]
    "1" [label="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/erl_nif.h" fillcolor="#BFBFBF"]
    "53" [label="/__w/AtomVM/AtomVM/src/libAtomVM/exportedfunction.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/exportedfunction.h"]
    "13" [label="/__w/AtomVM/AtomVM/src/libAtomVM/debug.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/debug.c"]
    "12" [label="/__w/AtomVM/AtomVM/src/libAtomVM/debug.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/debug.h"]
    "21" [label="/__w/AtomVM/AtomVM/src/libAtomVM/externalterm.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/externalterm.c"]
    "54" [label="/__w/AtomVM/AtomVM/src/libAtomVM/externalterm.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/externalterm.h"]
    "5" [label="/__w/AtomVM/AtomVM/src/libAtomVM/avmpack.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/avmpack.c"]
    "4" [label="/__w/AtomVM/AtomVM/src/libAtomVM/avmpack.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/avmpack.h"]
    "6" [label="/__w/AtomVM/AtomVM/src/libAtomVM/globalcontext.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/globalcontext.c"]
    "3" [label="/__w/AtomVM/AtomVM/src/libAtomVM/globalcontext.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/globalcontext.h"]
    "30" [label="/__w/AtomVM/AtomVM/src/libAtomVM/platform_nifs.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/platform_nifs.h"]
    "51" [label="/__w/AtomVM/AtomVM/src/libAtomVM/bitstring.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/bitstring.c"]
    "50" [label="/__w/AtomVM/AtomVM/src/libAtomVM/bitstring.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/bitstring.h"]
    "55" [label="/__w/AtomVM/AtomVM/src/libAtomVM/overflow_helpers.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/overflow_helpers.h"]
    "41" [label="/__w/AtomVM/AtomVM/src/libAtomVM/scheduler.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/scheduler.h"]
    "16" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_socket.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_socket.c"]
    "37" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_socket.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_socket.h"]
    "32" [label="/__w/AtomVM/AtomVM/src/libAtomVM/stacktrace.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/stacktrace.c"]
    "31" [label="/__w/AtomVM/AtomVM/src/libAtomVM/stacktrace.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/stacktrace.h"]
    "17" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_ssl.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_ssl.c"]
    "38" [label="/__w/AtomVM/AtomVM/src/libAtomVM/otp_ssl.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/otp_ssl.h"]
    "18" [label="/__w/AtomVM/AtomVM/src/libAtomVM/posix_nifs.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/posix_nifs.c"]
    "45" [label="/__w/AtomVM/AtomVM/src/libAtomVM/posix_nifs.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/posix_nifs.h"]
    "42" [label="/__w/AtomVM/AtomVM/src/libAtomVM/mailbox.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/mailbox.c"]
    "39" [label="/__w/AtomVM/AtomVM/src/libAtomVM/port.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/port.c"]
    "40" [label="/__w/AtomVM/AtomVM/src/libAtomVM/port.h" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/port.h"]
    "22" -> "23" [dir=back tooltip="include"]
    "22" -> "26" [dir=back tooltip="include"]
    "22" -> "7" [dir=back tooltip="include"]
    "22" -> "27" [dir=back tooltip="include"]
    "22" -> "25" [dir=back tooltip="include"]
    "22" -> "16" [dir=back tooltip="include"]
    "22" -> "17" [dir=back tooltip="include"]
    "22" -> "18" [dir=back tooltip="include"]
    "22" -> "28" [dir=back tooltip="include"]
    "15" -> "2" [dir=back tooltip="include"]
    "15" -> "6" [dir=back tooltip="include"]
    "15" -> "14" [dir=back tooltip="include"]
    "15" -> "16" [dir=back tooltip="include"]
    "15" -> "17" [dir=back tooltip="include"]
    "15" -> "18" [dir=back tooltip="include"]
    "15" -> "19" [dir=back tooltip="include"]
    "15" -> "20" [dir=back tooltip="include"]
    "48" -> "6" [dir=back tooltip="include"]
    "48" -> "14" [dir=back tooltip="include"]
    "48" -> "17" [dir=back tooltip="include"]
    "48" -> "19" [dir=back tooltip="include"]
    "48" -> "20" [dir=back tooltip="include"]
    "48" -> "49" [dir=back tooltip="include"]
    "34" -> "11" [dir=back tooltip="include"]
    "34" -> "7" [dir=back tooltip="include"]
    "34" -> "27" [dir=back tooltip="include"]
    "34" -> "35" [dir=back tooltip="include"]
    "34" -> "25" [dir=back tooltip="include"]
    "34" -> "36" [dir=back tooltip="include"]
    "34" -> "16" [dir=back tooltip="include"]
    "34" -> "37" [dir=back tooltip="include"]
    "34" -> "17" [dir=back tooltip="include"]
    "34" -> "38" [dir=back tooltip="include"]
    "34" -> "18" [dir=back tooltip="include"]
    "43" -> "10" [dir=back tooltip="include"]
    "43" -> "44" [dir=back tooltip="include"]
    "43" -> "6" [dir=back tooltip="include"]
    "43" -> "26" [dir=back tooltip="include"]
    "43" -> "7" [dir=back tooltip="include"]
    "43" -> "27" [dir=back tooltip="include"]
    "43" -> "25" [dir=back tooltip="include"]
    "43" -> "16" [dir=back tooltip="include"]
    "43" -> "17" [dir=back tooltip="include"]
    "43" -> "39" [dir=back tooltip="include"]
    "43" -> "40" [dir=back tooltip="include"]
    "43" -> "18" [dir=back tooltip="include"]
    "43" -> "20" [dir=back tooltip="include"]
    "43" -> "32" [dir=back tooltip="include"]
    "52" -> "10" [dir=back tooltip="include"]
    "52" -> "2" [dir=back tooltip="include"]
    "52" -> "44" [dir=back tooltip="include"]
    "52" -> "14" [dir=back tooltip="include"]
    "52" -> "7" [dir=back tooltip="include"]
    "52" -> "16" [dir=back tooltip="include"]
    "52" -> "19" [dir=back tooltip="include"]
    "8" -> "9" [dir=back tooltip="include"]
    "8" -> "2" [dir=back tooltip="include"]
    "8" -> "12" [dir=back tooltip="include"]
    "8" -> "15" [dir=back tooltip="include"]
    "8" -> "21" [dir=back tooltip="include"]
    "8" -> "6" [dir=back tooltip="include"]
    "8" -> "22" [dir=back tooltip="include"]
    "8" -> "14" [dir=back tooltip="include"]
    "8" -> "11" [dir=back tooltip="include"]
    "8" -> "29" [dir=back tooltip="include"]
    "8" -> "7" [dir=back tooltip="include"]
    "8" -> "34" [dir=back tooltip="include"]
    "8" -> "27" [dir=back tooltip="include"]
    "8" -> "25" [dir=back tooltip="include"]
    "8" -> "16" [dir=back tooltip="include"]
    "8" -> "17" [dir=back tooltip="include"]
    "8" -> "39" [dir=back tooltip="include"]
    "8" -> "40" [dir=back tooltip="include"]
    "8" -> "19" [dir=back tooltip="include"]
    "8" -> "20" [dir=back tooltip="include"]
    "8" -> "41" [dir=back tooltip="include"]
    "8" -> "31" [dir=back tooltip="include"]
    "8" -> "28" [dir=back tooltip="include"]
    "9" -> "10" [dir=back tooltip="include"]
    "9" -> "11" [dir=back tooltip="include"]
    "9" -> "7" [dir=back tooltip="include"]
    "35" -> "27" [dir=back tooltip="include"]
    "46" -> "15" [dir=back tooltip="include"]
    "46" -> "23" [dir=back tooltip="include"]
    "46" -> "42" [dir=back tooltip="include"]
    "46" -> "14" [dir=back tooltip="include"]
    "46" -> "7" [dir=back tooltip="include"]
    "46" -> "16" [dir=back tooltip="include"]
    "46" -> "40" [dir=back tooltip="include"]
    "46" -> "19" [dir=back tooltip="include"]
    "46" -> "47" [dir=back tooltip="include"]
    "46" -> "32" [dir=back tooltip="include"]
    "46" -> "49" [dir=back tooltip="include"]
    "33" -> "2" [dir=back tooltip="include"]
    "33" -> "6" [dir=back tooltip="include"]
    "33" -> "11" [dir=back tooltip="include"]
    "33" -> "7" [dir=back tooltip="include"]
    "33" -> "16" [dir=back tooltip="include"]
    "33" -> "20" [dir=back tooltip="include"]
    "29" -> "9" [dir=back tooltip="include"]
    "29" -> "11" [dir=back tooltip="include"]
    "29" -> "7" [dir=back tooltip="include"]
    "29" -> "30" [dir=back tooltip="include"]
    "29" -> "31" [dir=back tooltip="include"]
    "29" -> "33" [dir=back tooltip="include"]
    "29" -> "28" [dir=back tooltip="include"]
    "36" -> "25" [dir=back tooltip="include"]
    "47" -> "6" [dir=back tooltip="include"]
    "47" -> "48" [dir=back tooltip="include"]
    "47" -> "20" [dir=back tooltip="include"]
    "23" -> "24" [dir=back tooltip="include"]
    "23" -> "25" [dir=back tooltip="include"]
    "23" -> "16" [dir=back tooltip="include"]
    "23" -> "17" [dir=back tooltip="include"]
    "49" -> "10" [dir=back tooltip="include"]
    "49" -> "50" [dir=back tooltip="include"]
    "49" -> "2" [dir=back tooltip="include"]
    "49" -> "8" [dir=back tooltip="include"]
    "49" -> "44" [dir=back tooltip="include"]
    "49" -> "52" [dir=back tooltip="include"]
    "49" -> "53" [dir=back tooltip="include"]
    "49" -> "54" [dir=back tooltip="include"]
    "49" -> "3" [dir=back tooltip="include"]
    "49" -> "24" [dir=back tooltip="include"]
    "49" -> "26" [dir=back tooltip="include"]
    "49" -> "22" [dir=back tooltip="include"]
    "49" -> "14" [dir=back tooltip="include"]
    "49" -> "11" [dir=back tooltip="include"]
    "49" -> "29" [dir=back tooltip="include"]
    "49" -> "7" [dir=back tooltip="include"]
    "49" -> "27" [dir=back tooltip="include"]
    "49" -> "25" [dir=back tooltip="include"]
    "49" -> "16" [dir=back tooltip="include"]
    "49" -> "17" [dir=back tooltip="include"]
    "49" -> "55" [dir=back tooltip="include"]
    "49" -> "40" [dir=back tooltip="include"]
    "49" -> "45" [dir=back tooltip="include"]
    "49" -> "31" [dir=back tooltip="include"]
    "49" -> "28" [dir=back tooltip="include"]
    "1" -> "2" [dir=back tooltip="include"]
    "1" -> "3" [dir=back tooltip="include"]
    "1" -> "46" [dir=back tooltip="include"]
    "1" -> "17" [dir=back tooltip="include"]
    "1" -> "20" [dir=back tooltip="include"]
    "1" -> "47" [dir=back tooltip="include"]
    "53" -> "9" [dir=back tooltip="include"]
    "53" -> "29" [dir=back tooltip="include"]
    "53" -> "34" [dir=back tooltip="include"]
    "53" -> "30" [dir=back tooltip="include"]
    "53" -> "45" [dir=back tooltip="include"]
    "12" -> "13" [dir=back tooltip="include"]
    "12" -> "14" [dir=back tooltip="include"]
    "54" -> "21" [dir=back tooltip="include"]
    "54" -> "11" [dir=back tooltip="include"]
    "54" -> "7" [dir=back tooltip="include"]
    "4" -> "5" [dir=back tooltip="include"]
    "4" -> "6" [dir=back tooltip="include"]
    "4" -> "7" [dir=back tooltip="include"]
    "3" -> "4" [dir=back tooltip="include"]
    "3" -> "2" [dir=back tooltip="include"]
    "3" -> "8" [dir=back tooltip="include"]
    "3" -> "43" [dir=back tooltip="include"]
    "3" -> "6" [dir=back tooltip="include"]
    "3" -> "14" [dir=back tooltip="include"]
    "3" -> "11" [dir=back tooltip="include"]
    "3" -> "29" [dir=back tooltip="include"]
    "3" -> "7" [dir=back tooltip="include"]
    "3" -> "27" [dir=back tooltip="include"]
    "3" -> "25" [dir=back tooltip="include"]
    "3" -> "36" [dir=back tooltip="include"]
    "3" -> "16" [dir=back tooltip="include"]
    "3" -> "37" [dir=back tooltip="include"]
    "3" -> "17" [dir=back tooltip="include"]
    "3" -> "38" [dir=back tooltip="include"]
    "3" -> "39" [dir=back tooltip="include"]
    "3" -> "40" [dir=back tooltip="include"]
    "3" -> "18" [dir=back tooltip="include"]
    "3" -> "45" [dir=back tooltip="include"]
    "3" -> "41" [dir=back tooltip="include"]
    "3" -> "32" [dir=back tooltip="include"]
    "3" -> "33" [dir=back tooltip="include"]
    "30" -> "7" [dir=back tooltip="include"]
    "50" -> "51" [dir=back tooltip="include"]
    "50" -> "21" [dir=back tooltip="include"]
    "50" -> "26" [dir=back tooltip="include"]
    "50" -> "7" [dir=back tooltip="include"]
    "55" -> "10" [dir=back tooltip="include"]
    "41" -> "6" [dir=back tooltip="include"]
    "41" -> "42" [dir=back tooltip="include"]
    "41" -> "7" [dir=back tooltip="include"]
    "41" -> "16" [dir=back tooltip="include"]
    "37" -> "16" [dir=back tooltip="include"]
    "37" -> "17" [dir=back tooltip="include"]
    "31" -> "32" [dir=back tooltip="include"]
    "38" -> "17" [dir=back tooltip="include"]
    "45" -> "6" [dir=back tooltip="include"]
    "45" -> "7" [dir=back tooltip="include"]
    "45" -> "16" [dir=back tooltip="include"]
    "45" -> "18" [dir=back tooltip="include"]
    "40" -> "24" [dir=back tooltip="include"]
    "40" -> "7" [dir=back tooltip="include"]
    "40" -> "25" [dir=back tooltip="include"]
    "40" -> "16" [dir=back tooltip="include"]
    "40" -> "17" [dir=back tooltip="include"]
    "40" -> "39" [dir=back tooltip="include"]
}

Public API for nifs, compatible with Erlang/OTP API.

Typedefs

typedef struct ErlNifEnv ErlNifEnv

Opaque environment, passed to nifs.

typedef term ERL_NIF_TERM

A term.

typedef int32_t ErlNifPid

a pid

We currently only handle local pids.

typedef struct ResourceType ErlNifResourceType

Opaque resource type.

typedef uint64_t ErlNifMonitor

Opaque monitor type.

typedef int ErlNifEvent

Selectable event.

typedef void ErlNifResourceDtor(ErlNifEnv *caller_env, void *obj)

Destructor callback.

typedef void ErlNifResourceStop(ErlNifEnv *caller_env, void *obj, ErlNifEvent event, int is_direct_call)

Select stop callback.

typedef void ErlNifResourceDown(ErlNifEnv *caller_env, void *obj, ErlNifPid *pid, ErlNifMonitor *mon)

Resource monitor callback.

Enums

enum ErlNifResourceFlags

resource flags

Values:

enumerator ERL_NIF_RT_CREATE = 1
enum ErlNifSelectFlags

enif_select mode flags

ERL_NIF_SELECT_CANCEL which was introduced with OTP-22, is unimplemented.

Values:

enumerator ERL_NIF_SELECT_READ = 1
enumerator ERL_NIF_SELECT_WRITE = 2
enumerator ERL_NIF_SELECT_STOP = 4
enum [anonymous]

enif_select result flags

ERL_NIF_SELECT_CANCEL which was introduced with OTP-22, is unimplemented.

Values:

enumerator ERL_NIF_SELECT_STOP_CALLED = 1
enumerator ERL_NIF_SELECT_STOP_SCHEDULED = 2
enumerator ERL_NIF_SELECT_INVALID_EVENT = -1
enumerator ERL_NIF_SELECT_FAILED = -2
enumerator ERL_NIF_SELECT_BADARG = -3

Functions

ErlNifResourceType *enif_init_resource_type(ErlNifEnv *env, const char *name, const ErlNifResourceTypeInit *init, ErlNifResourceFlags flags, ErlNifResourceFlags *tried)

Create or take over (code upgrade) a resource type.

Parameters:
  • env – the current environment

  • init – a structure describing the callbacks. Callbacks can be NULL if not used.

  • name – name of the resource (copied)

  • flagsERL_NIF_RT_CREATE or ERL_NIF_RT_TAKEOVER to create or take over.

  • tried – on output, updated to ERL_NIF_RT_CREATE or ERL_NIF_RT_TAKEOVER depending on what has been done. On failure, updated to flags. Can be NULL.

Returns:

the resource type or NULL on failure.

void *enif_alloc_resource(ErlNifResourceType *type, unsigned size)

Allocate a resource for given type for size bytes.

Parameters:
  • type – a trype created by enif_init_resource_type.

  • size – the size in bytes.

Returns:

a pointer or NULL on failure.

int enif_get_resource(ErlNifEnv *env, ERL_NIF_TERM t, ErlNifResourceType *type, void **objp)

Get a pointer to a resource from a term representing it.

Parameters:
  • env – the current environment

  • t – the term

  • type – the resource type

  • objp – on output the pointer to the resource

Returns:

true on success, false on failure, if term is not a resource of type type

int enif_keep_resource(void *resource)

Increment reference count of a resource.

Parameters:
  • resource – the resource to keep

Returns:

true.

int enif_release_resource(void *resource)

Decrement reference count of a resource.

Parameters:
  • resource – the resource to release

Returns:

true.

ERL_NIF_TERM enif_make_resource(ErlNifEnv *env, void *obj)

create a term from a resource

the term can be later passed to enif_get_resource. The resource is typically released (by calling enif_release_resource) just after calling this function to “transfer ownership” to Erlang code so that it will be destroyed when garbage collected.

Parameters:
  • env – current environment

  • obj – resource

Returns:

a new term representing the resource

int enif_select(ErlNifEnv *env, ErlNifEvent event, enum ErlNifSelectFlags mode, void *obj, const ErlNifPid *pid, ERL_NIF_TERM ref)

Run a POSIX-like select on a given object (event) and send a message when the object is readable or writable.

Actual implementation is platform dependent and platforms may not implement this feature.

On generic_unix, this is currently implemented using what sys_poll_events uses, namely kqueue(2) (if available) or poll(2). Please note that kqueue(2) and poll(2) behave differently for some objects, for example for vnodes and EOF.

On esp32, this is currently implemented using poll(2).

Parameters:
  • env – current environment

  • event – event object (typically a file descriptor)

  • mode – select mode (ERL_NIF_SELECT_READ and/or ERL_NIF_SELECT_WRITE) optionally with ERL_NIF_SELECT_CANCEL to cancel, or ERL_NIF_SELECT_STOP to stop.

  • obj – resource object working as a container of the event object.

  • pid – process id to send a message to or NULL to use the current process (from env)

  • ref – reference object used in sent messages or undefined atom.

Returns:

a negative value on failure, 0 or flags on success.

int enif_monitor_process(ErlNifEnv *env, void *obj, const ErlNifPid *target_pid, ErlNifMonitor *mon)

Monitor a process by using a resource object.

The monitor is automatically removed after being triggered or if the associated resource is deallocated.

Parameters:
  • env – current environment

  • obj – resource to use for monitor

  • target_pid – process to monitor

  • mon – on output, monitor object (can be NULL)

Returns:

0 on success, <0 if no down callback is provided with resource (badarg), >0 if the process is no longer alive

int enif_demonitor_process(ErlNifEnv *caller_env, void *obj, const ErlNifMonitor *mon)

Unmonitor a process.

Parameters:
  • caller_env – current environment

  • obj – resource used by monitor

  • mon – monitor

Returns:

0 on success

int enif_compare_monitors(const ErlNifMonitor *monitor1, const ErlNifMonitor *monitor2)

compare two monitors

Parameters:
  • monitor1 – first monitor

  • monitor2 – second monitor

Returns:

0 if equals, < 0 if monitor1 < monitor2, > 0 if monitor1 > monitor2.

struct ErlNifResourceTypeInit
#include <erl_nif.h>

Resource callbacks.

Members should be set to 0, 1 or 2 depending on provided callbacks. Callbacks can also be NULL if not used.

Public Members

int members
ErlNifResourceDtor *dtor
ErlNifResourceStop *stop
ErlNifResourceDown *down