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);