Browse code

uxnemu: fix the stuck threads on quit, SOMEWHAT

Create threads in detached mode and check if events failed to be
pushed. Stdin thread is still blocking on fread hence the "SOMEWHAT".

Sigrid Solveig Haflínudóttir authored on 28/03/2022 15:24:35
Showing 1 changed files
... ...
@@ -81,8 +81,8 @@ stdin_handler(void *p)
81 81
 {
82 82
 	SDL_Event event;
83 83
 	event.type = stdin_event;
84
-	while(fread(&event.cbutton.button, 1, 1, stdin) > 0)
85
-		SDL_PushEvent(&event);
84
+	while(fread(&event.cbutton.button, 1, 1, stdin) > 0 && SDL_PushEvent(&event) >= 0)
85
+		;
86 86
 	return 0;
87 87
 	(void)p;
88 88
 }
... ...
@@ -90,18 +90,17 @@ stdin_handler(void *p)
90 90
 static int
91 91
 redraw_handler(void *p)
92 92
 {
93
-	int dropped_frames = 0;
93
+	int dropped_frames = 0, stop = 0;
94 94
 	SDL_Event event, interrupt;
95 95
 	event.type = redraw_event;
96 96
 	interrupt.type = interrupt_event;
97
-	for(;;) {
97
+	while(!stop) {
98 98
 		SDL_Delay(16);
99 99
 		if(SDL_HasEvent(redraw_event) == SDL_FALSE) {
100
-			SDL_PushEvent(&event);
100
+			stop = SDL_PushEvent(&event) < 0;
101 101
 			dropped_frames = 0;
102
-		}
103
-		else if(++dropped_frames == TIMEOUT_FRAMES) {
104
-			SDL_PushEvent(&interrupt);
102
+		} else if(++dropped_frames == TIMEOUT_FRAMES) {
103
+			stop = SDL_PushEvent(&interrupt) < 0;
105 104
 		}
106 105
 	}
107 106
 	return 0;
... ...
@@ -178,8 +177,8 @@ init(void)
178 177
 	audio0_event = SDL_RegisterEvents(POLYPHONY);
179 178
 	redraw_event = SDL_RegisterEvents(1);
180 179
 	interrupt_event = SDL_RegisterEvents(1);
181
-	SDL_CreateThread(stdin_handler, "stdin", NULL);
182
-	SDL_CreateThread(redraw_handler, "redraw", NULL);
180
+	SDL_DetachThread(SDL_CreateThread(stdin_handler, "stdin", NULL));
181
+	SDL_DetachThread(SDL_CreateThread(redraw_handler, "redraw", NULL));
183 182
 	SDL_StartTextInput();
184 183
 	SDL_ShowCursor(SDL_DISABLE);
185 184
 	SDL_EventState(SDL_DROPFILE, SDL_ENABLE);