From 933304e3dcce052eff6d36c37b708949e53597c3 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson
Binaries are sequences of whole bytes. Bitstrings with an arbitrary bit length have no support yet.
@@ -660,6 +662,16 @@ typedef enum {Create an integer term from a
Allocate a binary of size
Return a pointer to the raw binary data and set
+
Create a reference like
This is an example of how to solve the
A NIF (Native Implemented Function) is a function that is + implemented in C instead of Erlang. NIFs appear as any other functions to + the callers. They belong to a module and are called like any other Erlang + functions. The NIFs of a module are compiled and linked into a dynamic + loadable shared library (SO in Unix, DLL in Windows). The NIF library must + be loaded in runtime by the Erlang code of the module.
+Since a NIF library is dynamically linked into the emulator + process, this is the fastest way of calling C-code from Erlang (alongside + port drivers). Calling NIFs requires no context switches. But it is also + the least safe, because a crash in a NIF will bring the emulator down + too.
+Even if all functions of a module will be NIFs, you still need an Erlang + module for two reasons. First, the NIF library must be explicitly loaded + by Erlang code in the same module. Second, all NIFs of a module must have + an Erlang implementation as well. Normally these are minimal stub + implementations that throw an exception. But it can also be used as + fallback implementations for functions that do not have native + implemenations on some architectures.
+NIF libraries are loaded by calling
We use the directive
Loading the NIF library will override the stub implementations
+ and cause calls to
The NIFs of the module are compiled and linked into a
+ shared library. Each NIF is implemented as a normal C function. The macro
+
The function arguments passed to a NIF appears in an array
The first argument to
Function arguments and return values are represented as values
+ of type
1. Compile the C code.
++unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c +windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c+
2. Start Erlang and compile the Erlang code.
++> erl +Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false] + +Eshell V5.7.5 (abort with ^G) +1> c(complex6). +{ok,complex6}+
3. Run the example.
++3> complex6:foo(3). +4 +4> complex6:bar(5). +10 +5> complex6:foo("not an integer"). +** exception error: bad argument + in function complex6:foo/1 + called as comlpex6:foo("not an integer") ++