207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
// Thread
typedef struct ljuv_thread{
uv_thread_t handle;
uv_mutex_t mutex;
lua_State *L;
bool running;
} ljuv_thread;
static const char thread_lua[] =
"local function pack(...) return {n = select('#', ...), ...} end\n\
local buffer = require('string.buffer')\n\
local errtrace\n\
local function error_handler(err) errtrace = debug.traceback(err, 2) end\n\
|
>
>
|
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
|
// Thread
typedef struct ljuv_thread{
uv_thread_t handle;
uv_mutex_t mutex;
lua_State *L;
bool running;
char *data;
size_t data_size;
} ljuv_thread;
static const char thread_lua[] =
"local function pack(...) return {n = select('#', ...), ...} end\n\
local buffer = require('string.buffer')\n\
local errtrace\n\
local function error_handler(err) errtrace = debug.traceback(err, 2) end\n\
|
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
void thread_run(void *arg)
{
ljuv_thread *thread = arg;
lua_State *L = thread->L;
luaL_openlibs(L);
luaL_loadbuffer(L, thread_lua, strlen(thread_lua), "=[ljuv thread]");
lua_call(L, 0, 0);
// end
uv_mutex_lock(&thread->mutex);
thread->running = false;
uv_mutex_unlock(&thread->mutex);
}
// Create thread.
// return NULL on failure
|
>
>
>
>
>
>
>
>
>
>
|
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
void thread_run(void *arg)
{
ljuv_thread *thread = arg;
lua_State *L = thread->L;
luaL_openlibs(L);
luaL_loadbuffer(L, thread_lua, strlen(thread_lua), "=[ljuv thread]");
lua_call(L, 0, 0);
// handle return data
lua_getglobal(thread->L, "ljuv_data");
const char* data_ptr = lua_tolstring(thread->L, -1, &thread->data_size);
if(data_ptr && thread->data_size > 0){
thread->data = malloc(thread->data_size);
if(thread->data) memcpy(thread->data, data_ptr, thread->data_size);
}
else
thread->data = NULL;
// end
lua_close(thread->L);
uv_mutex_lock(&thread->mutex);
thread->running = false;
uv_mutex_unlock(&thread->mutex);
}
// Create thread.
// return NULL on failure
|
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
// return true on success
//
// On success, thread data are released and data/size are filled.
// The data pointer, if not NULL, must be freed with free().
bool thread_join(ljuv_thread *thread, char **data, size_t *size)
{
if(uv_thread_join(&thread->handle) == 0){
lua_getglobal(thread->L, "ljuv_data");
const char* data_ptr = lua_tolstring(thread->L, -1, size);
*data = NULL;
if(data_ptr && *size > 0){
*data = malloc(*size);
if(*data) memcpy(*data, data_ptr, *size);
}
lua_close(thread->L);
uv_mutex_destroy(&thread->mutex);
free(thread);
return true;
}
else return false;
}
|
<
<
|
<
<
<
<
|
|
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
|
// return true on success
//
// On success, thread data are released and data/size are filled.
// The data pointer, if not NULL, must be freed with free().
bool thread_join(ljuv_thread *thread, char **data, size_t *size)
{
if(uv_thread_join(&thread->handle) == 0){
*data = thread->data;
*size = thread->data_size;
uv_mutex_destroy(&thread->mutex);
free(thread);
return true;
}
else return false;
}
|