Skip to content

Commit 4de9724

Browse files
committed
add semaphore for mainthread api
1 parent 7c0123f commit 4de9724

2 files changed

Lines changed: 48 additions & 9 deletions

File tree

src/ltask.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "logqueue.h"
2727
#include "systime.h"
2828
#include "threadsig.h"
29+
#include "semaphore.h"
2930

3031
LUAMOD_API int luaopen_ltask(lua_State *L);
3132
LUAMOD_API int luaopen_ltask_bootstrap(lua_State *L);
@@ -52,23 +53,23 @@ LUAMOD_API int luaopen_ltask_root(lua_State *L);
5253

5354
struct mainthread_session {
5455
atomic_int srv;
55-
struct cond ev;
56+
struct sem ev;
5657
int status;
5758
};
5859

5960
static void
6061
mainthread_init(struct mainthread_session *mt) {
6162
atomic_int_init(&mt->srv, 0);
6263
mt->status = MAINTHREAD_STATUS_NONE;
63-
cond_create(&mt->ev);
64+
sem_init(&mt->ev);
6465
}
6566

6667
static void
6768
mainthread_deinit(struct mainthread_session *mt) {
6869
assert(mt->status == MAINTHREAD_STATUS_NONE || mt->status == MAINTHREAD_STATUS_YIELD);
6970
atomic_int_store(&mt->srv, 0);
7071
mt->status = MAINTHREAD_STATUS_INVALID;
71-
cond_release(&mt->ev);
72+
sem_deinit(&mt->ev);
7273
}
7374

7475
static inline int
@@ -78,8 +79,7 @@ mainthread_current(struct mainthread_session *mt, service_id id) {
7879

7980
static inline void
8081
mainthread_trigger(struct mainthread_session *mt) {
81-
cond_trigger_begin(&mt->ev);
82-
cond_trigger_end(&mt->ev, 1);
82+
sem_release(&mt->ev);
8383
}
8484

8585
struct ltask {
@@ -1153,11 +1153,13 @@ lmainthread_wait(lua_State *L) {
11531153
if (mt->status != MAINTHREAD_STATUS_NONE && mt->status != MAINTHREAD_STATUS_READY)
11541154
return luaL_error(L, "mainthread in use");
11551155
struct service_pool * P = task->services;
1156+
int inf = !lua_toboolean(L, 1);
11561157
int finish = 0;
11571158
do {
1158-
cond_wait_begin(&mt->ev);
1159-
cond_wait(&mt->ev);
1160-
cond_wait_end(&mt->ev);
1159+
if (sem_acquire(&mt->ev, inf)) {
1160+
lua_pushboolean(L, 1); // fail
1161+
return 1;
1162+
}
11611163
if (mt->status != MAINTHREAD_STATUS_READY)
11621164
luaL_error(L, "mainthread not ready");
11631165

@@ -1196,7 +1198,8 @@ lmainthread_wait(lua_State *L) {
11961198
schedule_back(task, id);
11971199
mt->status = MAINTHREAD_STATUS_NONE;
11981200
} while (!finish);
1199-
atomic_int_store(&mt->srv, 0); return 0;
1201+
atomic_int_store(&mt->srv, 0);
1202+
return 0;
12001203
}
12011204

12021205
LUAMOD_API int

src/semaphore.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef ltask_semaphore_h
2+
#define ltask_semaphore_h
3+
4+
#include "cond.h"
5+
6+
struct sem {
7+
struct cond c;
8+
};
9+
10+
static inline void
11+
sem_init(struct sem *s) {
12+
cond_create(&s->c);
13+
}
14+
15+
static inline void
16+
sem_deinit(struct sem *s) {
17+
cond_release(&s->c);
18+
}
19+
20+
static inline int
21+
sem_acquire(struct sem *s, int inf) {
22+
// ignore inf, always wait inf
23+
cond_wait_begin(&s->c);
24+
cond_wait(&s->c);
25+
cond_wait_end(&s->c);
26+
// fail would return -1 (inf == 0)
27+
return 0;
28+
}
29+
30+
static inline void
31+
sem_release(struct sem *s) {
32+
cond_trigger_begin(&s->c);
33+
cond_trigger_end(&s->c, 1);
34+
}
35+
36+
#endif

0 commit comments

Comments
 (0)