Generic Erlang Port [Driver]: Automatically generate an Erlang port driver or Erlang port for C/C++ bindings using a single self-contained file, and easily switch between either.
C++ M4 Erlang C CMake Makefile Shell
Permalink
Failed to load latest commit information.
CMake/erlang Add cmake build system Feb 17, 2011
config Add autoconf build. Sep 1, 2016
m4 Add autoconf build. Sep 1, 2016
.gitignore Add cmake build system Feb 17, 2011
CMakeLists.txt Add cmake build system Feb 17, 2011
LICENSE.txt Generic Erlang Port [Driver] (GEP[D]), Version 0.7 Jan 23, 2011
Makefile.am Fix comments. Sep 1, 2016
README.markdown
autogen.sh Add autoconf build. Sep 1, 2016
configure.ac Add autoconf build. Sep 1, 2016
erlang_functions_hrl.h Allow Erlang binaries for pchar_len. Sep 21, 2016
main.cpp Comment and README tweaks. Sep 21, 2016
make.sh Update README. Sep 15, 2016
make_dev Add autoconf build. Sep 1, 2016
pchar_len_t.h Update documentation. Oct 13, 2011
port.cpp Comment and README tweaks. Sep 21, 2016
port.hpp Comment and README tweaks. Sep 21, 2016
port_driver.cpp Comment and README tweaks. Sep 21, 2016
realloc_ptr.hpp realloc_ptr.hpp bugfix. Added puint32_len type (tuple) to the port fu… Feb 4, 2011
test_bindings.erl Comment and README tweaks. Sep 21, 2016
test_bindings.h Add BOOST_PP_TUPLE_TO_SEQ bug work-around. Sep 20, 2016
test_functions.c Add binary return values from functions with the type "pchar_len_t". … Oct 7, 2011
test_functions.h Add binary return values from functions with the type "pchar_len_t". … Oct 7, 2011

README.markdown

GENERIC ERLANG PORT [DRIVER] (GEP[D])

PURPOSE

To automatically generate an Erlang port driver or Erlang port for C/C++ bindings using a single self-contained file.

Files:

  • test_bindings.h contains the ONLY configuration to support the C functions (in test_functions.h and test_functions.c)
  • test_bindings.erl provides the gen_server to manage the port or port driver
  • erlang_functions_hrl.h creates the erlang function interface
  • port_driver.cpp provides the Erlang port driver implementation
  • port.cpp and port.hpp provide the Erlang port implementation

Whether PORT_DRIVER_NAME_PREFIX or PORT_NAME_PREFIX is defined determines if a port driver or port is built, respectively (in test_bindings.h). If both are defined, both are built and the port driver is used within test_bindings.erl (undefine ERL_PORT_DRIVER_NAME if you want to use the port).

Features:

  • a function binding with only a single line tuple
  • efficient passing of function types with no intermediate character buffer
  • functionality like the Erlang Driver Tool Kit (EDTK) (no fd handling though)
  • macro expansion to avoid code duplication errors
  • floating point type handling
  • stdout/stderr handling in the generated port code

Caveat:

(This is no longer true for Erlang >= R15) The generated port driver code can not be used for hot code updating if it performs an asynchronous call because erts will lock the driver (making it "permanent") with driver_lock_driver() (http://erlang.org/doc/man/erl_driver.html#driver_lock_driver). With the driver locked, there is no possibility that an async operation would create instability after a hot code update.

BUILDING

Some of the features in port_driver.cpp requires erts >= 5.6.1 (Erlang >= R12B01). Boost is required for the preprocessor macro expansion code (http://www.boost.org/).

To build, use:

./autogen.sh
./configure
make
make install

RUNNING

The test_bindings code should generate output similar to:

$ erl +A 16
1> test_bindings:start().
using port driver
{ok,<0.35.0>}
2> test_bindings:test().
sync sleep
async sleep
...
stdout writing before 2 second sleep
                                    ok
3> stdout writing after 2 second sleep
                                      stderr
                                            line
                                                break(s)
                                                        missasync function call returned: {ok,ok}
3> 

LICENSE

BSD license

CONTACT

Michael Truog

THANKS

  • Matt Stancliff (GEPD CMake integration)
  • Scott Lystig Fritchie (EDTK, i.e., Erlang Driver Tool Kit)