1 |
|
|
#include "gwion_util.h" |
2 |
|
|
#include "gwion_ast.h" |
3 |
|
|
#include "gwion_env.h" |
4 |
|
|
#include "vm.h" |
5 |
|
|
#include "gwion.h" |
6 |
|
|
#include "instr.h" |
7 |
|
|
#include "object.h" |
8 |
|
|
#include "operator.h" |
9 |
|
|
#include "import.h" |
10 |
|
|
#include "gwi.h" |
11 |
|
|
|
12 |
|
8 |
static CTOR(event_ctor) { |
13 |
|
8 |
EV_SHREDS(o) = new_vector(shred->info->mp); |
14 |
|
8 |
} |
15 |
|
|
|
16 |
|
14 |
static DTOR(event_dtor) { |
17 |
|
14 |
free_vector(shred->info->mp, EV_SHREDS(o)); |
18 |
|
14 |
} |
19 |
|
|
|
20 |
|
6 |
static OP_CHECK(opck_eventwait) { |
21 |
|
6 |
return env->gwion->type[et_int]; |
22 |
|
|
} |
23 |
|
|
|
24 |
|
5 |
static INSTR(EventWait) { |
25 |
|
5 |
POP_REG(shred, SZ_FLOAT); |
26 |
|
5 |
const M_Object event = *(M_Object*)REG(-SZ_INT); |
27 |
|
5 |
shreduler_remove(shred->tick->shreduler, shred, 0); |
28 |
|
5 |
const Vector v = EV_SHREDS(event); |
29 |
|
5 |
vector_add(v, (vtype)shred); |
30 |
|
5 |
*(m_int*)REG(-SZ_INT) = 1; |
31 |
|
5 |
_release(event, shred); |
32 |
|
5 |
} |
33 |
|
|
|
34 |
|
1 |
static MFUN(event_signal) { |
35 |
|
1 |
const Vector v = EV_SHREDS(o); |
36 |
|
1 |
const VM_Shred sh = (VM_Shred)vector_front(v); |
37 |
✓✗ |
1 |
if(sh) { |
38 |
|
1 |
shredule(sh->tick->shreduler, sh, GWION_EPSILON); |
39 |
|
1 |
vector_rem(v, 0); |
40 |
|
|
} |
41 |
|
1 |
} |
42 |
|
|
|
43 |
|
7 |
ANN void broadcast(const M_Object o) { |
44 |
✓✓ |
12 |
for(m_uint i = 0; i < vector_size(EV_SHREDS(o)); i++) { |
45 |
|
5 |
const VM_Shred sh = (VM_Shred)vector_at(EV_SHREDS(o), i); |
46 |
|
5 |
shredule(sh->tick->shreduler, sh, GWION_EPSILON); |
47 |
|
|
} |
48 |
|
7 |
vector_clear(EV_SHREDS(o)); |
49 |
|
7 |
} |
50 |
|
|
|
51 |
|
3 |
static MFUN(event_broadcast) { |
52 |
|
3 |
broadcast(o); |
53 |
|
3 |
} |
54 |
|
|
|
55 |
|
713 |
GWION_IMPORT(event) { |
56 |
|
713 |
const Type t_event = gwi_class_ini(gwi, "Event", "Object"); |
57 |
|
713 |
gwi_class_xtor(gwi, event_ctor, event_dtor); |
58 |
|
713 |
gwi->gwion->type[et_event] = t_event; // use func |
59 |
|
|
|
60 |
|
713 |
GWI_BB(gwi_item_ini(gwi, "@internal", "@shreds")) |
61 |
|
713 |
GWI_BB(gwi_item_end(gwi, ae_flag_member, NULL)) |
62 |
|
713 |
GWI_BB(gwi_func_ini(gwi, "void", "signal")) |
63 |
|
713 |
GWI_BB(gwi_func_end(gwi, event_signal, ae_flag_none)) |
64 |
|
713 |
GWI_BB(gwi_func_ini(gwi, "void", "broadcast")) |
65 |
|
713 |
GWI_BB(gwi_func_end(gwi, event_broadcast, ae_flag_none)) |
66 |
|
713 |
GWI_BB(gwi_class_end(gwi)) |
67 |
|
713 |
GWI_BB(gwi_oper_ini(gwi, "nonnull Event", "@now", "int")) |
68 |
|
713 |
_CHECK_OP("=>", eventwait, EventWait) |
69 |
|
713 |
return GW_OK; |
70 |
|
|
} |