foreign function interface lua
play

Foreign Function Interface & Lua 1/30 ConT EXt meeting 2018 - PowerPoint PPT Presentation

Foreign Function Interface & Lua 1/30 ConT EXt meeting 2018 PragueSibina, Czech Republic, September 28, 2018 Foreign Function Interface & Lua Calling code from shared libraries in C is simple: the canonical way is look at


  1. Foreign Function Interface & Lua 1/30 ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  2. Foreign Function Interface & Lua Calling code from shared libraries in C is simple: the canonical way is look at the interface ( somelib.h ) /* somelib.h */ #ifndef SOMELIB_H #define SOMELIB_H typedef struct { int num; double dnum; } DataPoint; DataPoint *add_data(const DataPoint *dps, unsigned n); #endif /* SOMELIB_H */ 2/30 ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  3. Foreign Function Interface & Lua ( somelib.c ) /* somelib.c */ #include <stdlib.h> #include <stdio.h> #include <assert.h> #include "somelib.h" DataPoint *add_data(const DataPoint* dps, unsigned n) { DataPoint *out; out = malloc(sizeof(DataPoint)); assert(out); /* hmm, we are drastic here... */ out->num = 0; out->dnum = 0.0; for (unsigned i = 0; i < n; ++i) { out->num += dps[i].num; out->dnum += dps[i].dnum; } return out; } 3/30 ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  4. Foreign Function Interface & Lua using the interface : #include <stdio.h> #include <stdlib.h> #include "somelib.h" int main(void) { DataPoint *dout; DataPoint dp[4] = {{2, 2.2}, {3, 3.3}, {4, 4.4}, {5, 5.5}}; printf("Calling add_data\n"); dout = add_data(dp, sizeof(dp) / sizeof(DataPoint)); if (dout){ printf("dout = {%d, %lf}\n", dout->num, dout->dnum); free(dout); } return 0; } 4/30 ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  5. Foreign Function Interface & Lua link the shared library at building time: $> gcc -fPIC -shared -I. -Wall -Wextra -Wunused -Wimplicit -Wreturn-type -Wdeclaration-after-statement -Wno-unknown-pragmas -Wmissing-prototypes -Wmissing-declarations -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wold-style-definition -o somelib.so somelib.c $> gcc -I. -L. -Wall -Wextra -Wunused -Wimplicit -Wreturn-type -Wdeclaration-after-statement -Wno-unknown-pragmas -Wmissing-prototypes -Wmissing-declarations -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wold-style-definition -Wl,-rpath,'$ORIGIN/.' test-043.c -o test-043 -l:somelib.so $> ./test-043 Calling add_data dout = {14, 15.400000} 5/30 ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  6. Foreign Function Interface & Lua Using dlopen() to load shared library at run-time (1/3): #include <dlfcn.h> #include <ffi.h> #include <stdio.h> #include <stdlib.h> #include "somelib.h" int main(void) { void *libhandle; void *add_data_fn; char *err; ffi_type *args[2];ffi_type *rtype; ffi_cif cif; ffi_status status; DataPoint dp[4] = {{2, 2.2}, {3, 3.3}, {4, 4.4}, {5, 5.5}}; DataPoint *pdp; unsigned nelems; void *values[2]; DataPoint *dout; libhandle = dlopen("./somelib.so", RTLD_LAZY); /* <--- string ! */ if (!libhandle) { fprintf(stderr, "dlopen error: %s\n", dlerror()); exit(1); } add_data_fn = dlsym(libhandle, "add_data"); /* <--- string ! */ err = dlerror(); if (err) { fprintf(stderr, "dlsym failed: %s\n", err); exit(1); } : 6/30 ConT ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  7. Foreign Function Interface & Lua Using dlopen() to load shared library at run-time (2/3): : args[0]=&ffi_type_pointer; args[1]=&ffi_type_uint; rtype = &ffi_type_pointer; status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, rtype, args); if (status != FFI_OK) { fprintf(stderr, "ffi_prep_cif failed: %d\n", status); exit(1); } pdp = dp; nelems = sizeof(dp) / sizeof(DataPoint); values[0] = &pdp; values[1] = &nelems; printf("Calling add_data via libffi\n"); dout = NULL; ffi_call(&cif, FFI_FN(add_data_fn), &dout, values); if (dout) { printf("dout = {%d, %lf}\n", dout->num, dout->dnum); } return 0; } 7/30 ConT ConT ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  8. Foreign Function Interface & Lua Using dlopen() to load shared library at run-time (3/3): $>gcc test-044a.c -o test-044a -lffi -ldl vs. $> gcc -I. -L. -Wl,-rpath,'$ORIGIN/.' test-043.c -o test-043 -l:somelib.so Apparently no gain: libffi vs somelib shared library. Not only: code is more complex. But the key point is run-time : both library and function are specifjed by strings. 8/30 ConT ConT ConT ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  9. Foreign Function Interface & Lua run-time ⤷ scripting language ⤷ Lua ⤷ LuaT EX It is (seems) possible to use a shared library without a Lua binding (i.e. another shared library) as done with SWIGLIB. 9/30 ConT ConT ConT ConT ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

  10. Foreign Function Interface & Lua Python already supports libffi in two ways : 1) Python: ctypes from ctypes import cdll, Structure, c_int, c_double, c_uint lib = cdll.LoadLibrary('./somelib.so') print('Loaded lib {0}'.format(lib)) class DataPoint(Structure): _fields_ = [('num', c_int), ('dnum', c_double)] dps = (DataPoint * 4)((2, 2.2), (3, 3.3), (4, 4.4), (5, 5.5)) add_data_fn = lib.add_data add_data_fn.restype = DataPoint print('Calling add_data via ctypes') dout = add_data_fn(dps, 4) print('dout = {0}, {1}'.format(dout.num, dout.dnum)) ctypes looks similar to the previous libffi (complex) code. 10/30 ConT ConT ConT ConT ConT ConT ConT ConT ConT ConT EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018 EXt meeting 2018 — Prague–Sibřina, Czech Republic, September 2–8, 2018

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend