diff options
| author | moteus <mimir@newmail.ru> | 2013-12-27 18:25:00 +0400 |
|---|---|---|
| committer | moteus <mimir@newmail.ru> | 2013-12-27 18:25:00 +0400 |
| commit | a087c2737441aad781be7e3d88775e688152ad4e (patch) | |
| tree | 582a8dd895f13eed50ff727c4fc75d5b9b48be9b | |
| parent | a26ecf383900e4c396958da80200cb2eb1121506 (diff) | |
| download | lua-llthreads2-a087c2737441aad781be7e3d88775e688152ad4e.tar.gz lua-llthreads2-a087c2737441aad781be7e3d88775e688152ad4e.tar.bz2 lua-llthreads2-a087c2737441aad781be7e3d88775e688152ad4e.zip | |
Add. pass cfunctions to child thread.
| -rw-r--r-- | .travis.yml | 1 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | src/llthread.c | 5 | ||||
| -rw-r--r-- | test/test_pass_cfunction.lua | 17 |
4 files changed, 24 insertions, 1 deletions
diff --git a/.travis.yml b/.travis.yml index 7cadb6a..d02d26a 100644 --- a/.travis.yml +++ b/.travis.yml | |||
| @@ -52,6 +52,7 @@ script: | |||
| 52 | - lua$LUA_SFX test_join_detach.lua | 52 | - lua$LUA_SFX test_join_detach.lua |
| 53 | - lua$LUA_SFX test_register_ffi.lua | 53 | - lua$LUA_SFX test_register_ffi.lua |
| 54 | - lua$LUA_SFX test_logger.lua | 54 | - lua$LUA_SFX test_logger.lua |
| 55 | - lua$LUA_SFX test_pass_cfunction.lua | ||
| 55 | 56 | ||
| 56 | notifications: | 57 | notifications: |
| 57 | email: | 58 | email: |
| @@ -9,7 +9,6 @@ This is full dropin replacement for [llthreads](https://github.com/Neopallium/lu | |||
| 9 | * does not support ffi interface (use Lua C API for LuaJIT) | 9 | * does not support ffi interface (use Lua C API for LuaJIT) |
| 10 | * returns nil instead of false on error | 10 | * returns nil instead of false on error |
| 11 | * start method returns self instead of true on success | 11 | * start method returns self instead of true on success |
| 12 | * does not open all standart libraries (set LLTHREAD_REGISTER_STD_LIBRARY to on this feature) | ||
| 13 | * register loaders for llthreads library itself | 12 | * register loaders for llthreads library itself |
| 14 | 13 | ||
| 15 | ##Additional | 14 | ##Additional |
| @@ -17,6 +16,7 @@ This is full dropin replacement for [llthreads](https://github.com/Neopallium/lu | |||
| 17 | * thread:join() method support arbitrary timeout on Windows threads | 16 | * thread:join() method support arbitrary timeout on Windows threads |
| 18 | * set_logger function allow logging errors (crash Lua VM) in current llthread's threads | 17 | * set_logger function allow logging errors (crash Lua VM) in current llthread's threads |
| 19 | * thread:start() has additional parameter which control in which thread child Lua VM will be destroyed | 18 | * thread:start() has additional parameter which control in which thread child Lua VM will be destroyed |
| 19 | * allow pass cfunctions to child thread (e.g. to initialize Lua state) (experemental) | ||
| 20 | 20 | ||
| 21 | ##Usage | 21 | ##Usage |
| 22 | 22 | ||
diff --git a/src/llthread.c b/src/llthread.c index 668a8c8..88498a8 100644 --- a/src/llthread.c +++ b/src/llthread.c | |||
| @@ -228,6 +228,11 @@ static int llthread_copy_value(llthread_copy_state *state, int depth, int idx) { | |||
| 228 | } | 228 | } |
| 229 | break; | 229 | break; |
| 230 | case LUA_TFUNCTION: | 230 | case LUA_TFUNCTION: |
| 231 | if(lua_iscfunction(state->from_L, idx)){ | ||
| 232 | lua_CFunction fn = lua_tocfunction(state->from_L, idx); | ||
| 233 | lua_pushcfunction(state->to_L, fn); | ||
| 234 | break; | ||
| 235 | } | ||
| 231 | case LUA_TUSERDATA: | 236 | case LUA_TUSERDATA: |
| 232 | case LUA_TTHREAD: | 237 | case LUA_TTHREAD: |
| 233 | default: | 238 | default: |
diff --git a/test/test_pass_cfunction.lua b/test/test_pass_cfunction.lua new file mode 100644 index 0000000..86fcd3d --- /dev/null +++ b/test/test_pass_cfunction.lua | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | local llthreads = require"llthreads" | ||
| 2 | local utils = require"utils" | ||
| 3 | |||
| 4 | local thread = llthreads.new(utils.thread_init .. [[ | ||
| 5 | require "llthreads" | ||
| 6 | local fn = ... | ||
| 7 | |||
| 8 | if type(fn) ~= 'function' then | ||
| 9 | print("ERROR! No function : ", fn, type(fn)) | ||
| 10 | os.exit(-2) | ||
| 11 | end | ||
| 12 | |||
| 13 | fn("print('Done!'); require'os'.exit(0)"):start():join() | ||
| 14 | ]], llthreads.new) | ||
| 15 | |||
| 16 | print(thread:start():join()) | ||
| 17 | os.exit(-1) \ No newline at end of file | ||
