commit 7d1c62b
Devine Lu Linvega
·
2023-05-03 18:32:38 +0000 UTC
parent 29e130a
Simplified threads implementation somewhat
1 files changed,
+18,
-27
+18,
-27
1@@ -75,14 +75,11 @@ system_inspect(Uxn *u)
2 system_print(&u->rst, "rst");
3 }
4
5-/* Friends */
6+static Uint8 *global_ram, friends_count = 0;
7+static Uint16 friends_tasks[MAX_FRIENDS];
8+static pthread_t friends[MAX_FRIENDS];
9
10-Uint8 *global_ram;
11-Uint16 friends_tasks[MAX_FRIENDS];
12-pthread_t friends[MAX_FRIENDS];
13-int friends_count = 0;
14-
15-void *
16+static void *
17 friend_task(void *vector)
18 {
19 Uxn friend;
20@@ -91,26 +88,20 @@ friend_task(void *vector)
21 return NULL;
22 }
23
24-int
25-wait_friends(void)
26-{
27- int i;
28- for(i = 0; i < friends_count; ++i)
29- pthread_join(friends[i], NULL);
30- return friends_count = 0;
31-}
32-
33-int
34-spawn_friend(Uint8 *ram, Uint16 task)
35+static void
36+system_friend(Uint8 *ram, Uint16 task)
37 {
38- if(!task)
39- return wait_friends();
40- if(friends_count >= MAX_FRIENDS)
41- return system_error("friends", "Too many threads");
42- global_ram = ram;
43- friends_tasks[friends_count] = task;
44- pthread_create(&friends[friends_count], NULL, friend_task, (void *)&friends_tasks[friends_count]);
45- return friends_count++;
46+ if(!task) {
47+ while(friends_count)
48+ pthread_join(friends[--friends_count], NULL);
49+ } else if(friends_count >= MAX_FRIENDS) {
50+ system_error("friends", "Too many threads");
51+ } else {
52+ global_ram = ram;
53+ friends_tasks[friends_count] = task;
54+ pthread_create(&friends[friends_count], NULL, friend_task, (void *)&friends_tasks[friends_count]);
55+ friends_count++;
56+ }
57 }
58
59 /* IO */
60@@ -123,7 +114,7 @@ system_deo(Uxn *u, Uint8 *d, Uint8 port)
61 system_cmd(u->ram, PEEK2(d + 2));
62 break;
63 case 0x5:
64- spawn_friend(u->ram, PEEK2(d + 4));
65+ system_friend(u->ram, PEEK2(d + 4));
66 break;
67 case 0xe:
68 system_inspect(u);