lovr/src/api/l_thread_channel.c

90 lines
2.2 KiB
C
Raw Normal View History

2018-02-18 00:51:32 +00:00
#include "api.h"
#include "thread/thread.h"
2019-07-11 18:29:18 +00:00
#include "event/event.h"
2022-03-22 07:13:21 +00:00
#include "util.h"
2018-09-27 18:45:43 +00:00
#include <math.h>
2018-02-19 18:48:04 +00:00
static void luax_checktimeout(lua_State* L, int index, double* timeout) {
switch (lua_type(L, index)) {
case LUA_TNONE:
case LUA_TNIL:
*timeout = NAN;
break;
case LUA_TBOOLEAN:
*timeout = lua_toboolean(L, index) ? INFINITY : NAN;
break;
default:
*timeout = luax_checkfloat(L, index);
2018-02-19 18:48:04 +00:00
break;
}
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelPush(lua_State* L) {
2018-02-19 18:48:04 +00:00
Variant variant;
double timeout;
Channel* channel = luax_checktype(L, 1, Channel);
luax_checkvariant(L, 2, &variant);
luax_checktimeout(L, 3, &timeout);
uint64_t id;
2019-07-11 18:29:18 +00:00
bool read = lovrChannelPush(channel, &variant, timeout, &id);
2018-02-19 18:48:04 +00:00
lua_pushnumber(L, id);
lua_pushboolean(L, read);
return 2;
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelPop(lua_State* L) {
2018-02-19 18:48:04 +00:00
Variant variant;
double timeout;
Channel* channel = luax_checktype(L, 1, Channel);
luax_checktimeout(L, 2, &timeout);
if (lovrChannelPop(channel, &variant, timeout)) {
luax_pushvariant(L, &variant);
lovrVariantDestroy(&variant);
return 1;
2018-02-19 18:48:04 +00:00
}
lua_pushnil(L);
return 1;
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelPeek(lua_State* L) {
2018-02-19 18:48:04 +00:00
Variant variant;
Channel* channel = luax_checktype(L, 1, Channel);
if (lovrChannelPeek(channel, &variant)) {
2019-12-14 03:53:31 +00:00
luax_pushvariant(L, &variant);
lua_pushboolean(L, true);
return 2;
2018-02-19 18:48:04 +00:00
}
lua_pushnil(L);
2019-12-14 03:53:31 +00:00
lua_pushboolean(L, false);
return 2;
2018-02-19 18:48:04 +00:00
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelClear(lua_State* L) {
2018-02-19 18:48:04 +00:00
Channel* channel = luax_checktype(L, 1, Channel);
lovrChannelClear(channel);
return 0;
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelGetCount(lua_State* L) {
2018-02-19 18:48:04 +00:00
Channel* channel = luax_checktype(L, 1, Channel);
lua_pushinteger(L, lovrChannelGetCount(channel));
return 1;
}
2019-02-17 22:52:22 +00:00
static int l_lovrChannelHasRead(lua_State* L) {
2018-02-19 18:48:04 +00:00
Channel* channel = luax_checktype(L, 1, Channel);
uint64_t id = luaL_checkinteger(L, 2);
lua_pushboolean(L, lovrChannelHasRead(channel, id));
return 1;
}
2018-02-18 00:51:32 +00:00
const luaL_Reg lovrChannel[] = {
2018-02-19 18:48:04 +00:00
{ "push", l_lovrChannelPush },
{ "pop", l_lovrChannelPop },
{ "peek", l_lovrChannelPeek },
{ "clear", l_lovrChannelClear },
{ "getCount", l_lovrChannelGetCount },
{ "hasRead", l_lovrChannelHasRead },
2018-02-18 00:51:32 +00:00
{ NULL, NULL }
};