37 |
|
#include <sys/shm.h> |
38 |
|
#include <errno.h> |
39 |
|
#include <pthread.h> |
40 |
+ |
#include <semaphore.h> |
41 |
|
|
42 |
|
#include <algorithm> |
43 |
|
|
88 |
|
static volatile bool redraw_thread_cancel; // Flag: Cancel Redraw thread |
89 |
|
static pthread_t redraw_thread; // Redraw thread |
90 |
|
|
90 |
– |
static bool local_X11; // Flag: X server running on local machine? |
91 |
|
static volatile bool thread_stop_req = false; |
92 |
< |
static volatile bool thread_stop_ack = false; // Acknowledge for thread_stop_req |
92 |
> |
static sem_t thread_stop_ack; |
93 |
> |
static sem_t thread_resume_req; |
94 |
|
|
95 |
+ |
static bool local_X11; // Flag: X server running on local machine? |
96 |
|
static bool has_dga = false; // Flag: Video DGA capable |
97 |
|
static bool has_vidmode = false; // Flag: VidMode extension available |
98 |
|
|
1663 |
|
|
1664 |
|
// Start periodic thread |
1665 |
|
XSync(x_display, false); |
1666 |
+ |
if (sem_init(&thread_stop_ack, 0, 0) < 0) |
1667 |
+ |
return false; |
1668 |
+ |
if (sem_init(&thread_resume_req, 0, 0) < 0) |
1669 |
+ |
return false; |
1670 |
|
Set_pthread_attr(&redraw_thread_attr, 0); |
1671 |
|
redraw_thread_cancel = false; |
1672 |
|
redraw_thread_active = (pthread_create(&redraw_thread, &redraw_thread_attr, redraw_func, NULL) == 0); |
1686 |
|
redraw_thread_cancel = true; |
1687 |
|
pthread_cancel(redraw_thread); |
1688 |
|
pthread_join(redraw_thread, NULL); |
1689 |
+ |
sem_destroy(&thread_stop_ack); |
1690 |
+ |
sem_destroy(&thread_resume_req); |
1691 |
|
redraw_thread_active = false; |
1692 |
|
} |
1693 |
|
|
2165 |
|
csSave->savePage = ReadMacInt16(ParamPtr + csPage); |
2166 |
|
|
2167 |
|
// Disable interrupts and pause redraw thread |
2160 |
– |
DisableInterrupt(); |
2161 |
– |
thread_stop_ack = false; |
2168 |
|
thread_stop_req = true; |
2169 |
< |
while (!thread_stop_ack) ; |
2169 |
> |
sem_wait(&thread_stop_ack); |
2170 |
> |
thread_stop_req = false; |
2171 |
> |
DisableInterrupt(); |
2172 |
|
|
2173 |
|
/* close old display */ |
2174 |
|
close_display(); |
2189 |
|
csSave->saveMode=VModes[cur_mode].viAppleMode; |
2190 |
|
|
2191 |
|
// Enable interrupts and resume redraw thread |
2184 |
– |
thread_stop_req = false; |
2192 |
|
EnableInterrupt(); |
2193 |
+ |
sem_post(&thread_resume_req); |
2194 |
|
return noErr; |
2195 |
|
} |
2196 |
|
} |
2442 |
|
while (!redraw_thread_cancel) { |
2443 |
|
|
2444 |
|
// Pause if requested (during video mode switches) |
2445 |
< |
while (thread_stop_req) |
2446 |
< |
thread_stop_ack = true; |
2445 |
> |
if (thread_stop_req) { |
2446 |
> |
sem_post(&thread_stop_ack); |
2447 |
> |
sem_wait(&thread_resume_req); |
2448 |
> |
} |
2449 |
|
|
2450 |
|
int64 delay = next - GetTicks_usec(); |
2451 |
|
if (delay < -VIDEO_REFRESH_DELAY) { |