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.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
CMake/erlang Add cmake build system Feb 17, 2011
config Add autoconf build. Sep 1, 2016
m4 Change my email address from gmail to protonmail Mar 29, 2018
.gitignore Add cmake build system Feb 17, 2011
CMakeLists.txt Add cmake build system Feb 17, 2011
LICENSE Change my email address from gmail to protonmail Mar 29, 2018
Makefile.am Fix comments. Sep 1, 2016
README.markdown Change my email address from gmail to protonmail Mar 29, 2018
autogen.sh Add autoconf build. Sep 1, 2016
configure.ac Change my email address from gmail to protonmail Mar 29, 2018
erlang_functions_hrl.h Change my email address from gmail to protonmail Mar 29, 2018
main.cpp
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 Change my email address from gmail to protonmail Mar 29, 2018
port.hpp Change my email address from gmail to protonmail Mar 29, 2018
port_driver.cpp Change my email address from gmail to protonmail Mar 29, 2018
realloc_ptr.hpp Change my email address from gmail to protonmail Mar 29, 2018
test_bindings.erl Change my email address from gmail to protonmail Mar 29, 2018
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

MIT License

CONTACT

Michael Truog

THANKS

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