Created
July 7, 2023 13:37
-
-
Save bartoldeman/f97d184e547eff2fbca355083f30db86 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/arch/linux/async/signal.c b/src/arch/linux/async/signal.c | |
index 34ab3dd5c..71fe9ce74 100644 | |
--- a/src/arch/linux/async/signal.c | |
+++ b/src/arch/linux/async/signal.c | |
@@ -743,6 +743,10 @@ static void sigasync(int sig, siginfo_t *si, void *uc) | |
static void sigasync_std(int sig, siginfo_t *si, void *uc) | |
{ | |
+#ifdef __APPLE__ | |
+ // XXX should not be necessary! | |
+ if (!pthread_equal(pthread_self(), dosemu_pthread_self)) return; | |
+#endif | |
sigasync0(sig); | |
if (!asighandlers[sig]) { | |
error("handler for sig %i not registered\n", sig); | |
diff --git a/src/base/dev/misc/vtmr.c b/src/base/dev/misc/vtmr.c | |
index 6a00f9415..cfae9f951 100644 | |
--- a/src/base/dev/misc/vtmr.c | |
+++ b/src/base/dev/misc/vtmr.c | |
@@ -58,7 +58,7 @@ static uint16_t vtmr_imr; | |
static uint16_t vtmr_pirr; | |
static pthread_t vtmr_thr; | |
-static sem_t vtmr_sem; | |
+static sem_t _vtmr_sem, *vtmr_sem = &_vtmr_sem; | |
#if MULTICORE_EXAMPLE | |
static int smi_tid; | |
static char *rmstack; | |
@@ -290,7 +290,7 @@ static void *vtmr_thread(void *arg) | |
pthread_cleanup_pop(1); | |
#else | |
while (1) { | |
- sem_wait(&vtmr_sem); | |
+ sem_wait(vtmr_sem); | |
vtmr_smi(NULL); | |
} | |
#endif | |
@@ -300,7 +300,7 @@ static void *vtmr_thread(void *arg) | |
#if MULTICORE_EXAMPLE | |
static void vtmr_hlt(Bit16u idx, HLT_ARG(arg)) | |
{ | |
- sem_wait(&vtmr_sem); | |
+ sem_wait(vtmr_sem); | |
coopth_start(smi_tid, NULL); | |
} | |
#endif | |
@@ -328,7 +328,7 @@ void vtmr_init(void) | |
hlt_off = hlt_register_handler_vm86(hlt_hdlr); | |
#endif | |
- sem_init(&vtmr_sem, 0, 0); | |
+ sem_init(vtmr_sem, 0, 0); | |
for (i = 0; i < VTMR_MAX; i++) { | |
pthread_mutex_init(&vth[i].done_mtx, NULL); | |
pthread_cond_init(&vth[i].done_cnd, NULL); | |
@@ -367,7 +367,7 @@ static int do_vtmr_raise(int timer) | |
pirr = __sync_fetch_and_or(&vtmr_pirr, mask); | |
if (!(pirr & mask)) { | |
h_printf("vtmr: posting timer event\n"); | |
- sem_post(&vtmr_sem); | |
+ sem_post(vtmr_sem); | |
return 1; | |
} | |
return 0; | |
diff --git a/src/base/dev/sb16/adlib.c b/src/base/dev/sb16/adlib.c | |
index ee9f2ef2f..71daf09ab 100644 | |
--- a/src/base/dev/sb16/adlib.c | |
+++ b/src/base/dev/sb16/adlib.c | |
@@ -69,7 +69,7 @@ static const int opl3_rate = 44100; | |
static pthread_mutex_t synth_mtx = PTHREAD_MUTEX_INITIALIZER; | |
static pthread_mutex_t run_mtx = PTHREAD_MUTEX_INITIALIZER; | |
static pthread_t syn_thr; | |
-static sem_t syn_sem; | |
+static sem_t _syn_sem, *syn_sem = &_syn_sem; | |
static void *synth_thread(void *arg); | |
Bit8u adlib_io_read_base(ioport_t port) | |
@@ -152,7 +152,7 @@ void opl3_init(void) | |
opl3_impl = oplops->Create(opl3_rate); | |
if (oplops->Generate) { | |
- sem_init(&syn_sem, 0, 0); | |
+ sem_init(syn_sem, 0, 0); | |
pthread_create(&syn_thr, NULL, synth_thread, NULL); | |
#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(__GLIBC__) | |
pthread_setname_np(syn_thr, "dosemu: adlib"); | |
@@ -172,7 +172,7 @@ void adlib_done(void) | |
return; | |
pthread_cancel(syn_thr); | |
pthread_join(syn_thr, NULL); | |
- sem_destroy(&syn_sem); | |
+ sem_destroy(syn_sem); | |
} | |
static void adlib_process_samples(int nframes) | |
@@ -218,7 +218,7 @@ static void *synth_thread(void *arg) | |
{ | |
int a_run; | |
while (1) { | |
- sem_wait(&syn_sem); | |
+ sem_wait(syn_sem); | |
pthread_mutex_lock(&run_mtx); | |
a_run = adlib_running; | |
pthread_mutex_unlock(&run_mtx); | |
@@ -235,7 +235,7 @@ void adlib_timer(void) | |
{ | |
if (!oplops->Generate) | |
return; | |
- sem_post(&syn_sem); | |
+ sem_post(syn_sem); | |
} | |
void opl_register_ops(struct opl_ops *ops) | |
diff --git a/src/base/emu-i386/simx86/codegen-x86.c b/src/base/emu-i386/simx86/codegen-x86.c | |
index f45487f72..8326fb22c 100644 | |
--- a/src/base/emu-i386/simx86/codegen-x86.c | |
+++ b/src/base/emu-i386/simx86/codegen-x86.c | |
@@ -3332,7 +3332,7 @@ asm(".text\n" | |
#ifdef __cplusplus | |
extern "C" | |
#endif | |
-void do_seq_start(void); | |
+void do_seq_start(void) asm("do_seq_start"); | |
static unsigned Exec_x86_asm(unsigned *mem_ref, unsigned long *flg, | |
unsigned char *ecpu, unsigned char *SeqStart) | |
{ | |
diff --git a/src/base/emu-i386/simx86/cpatch.c b/src/base/emu-i386/simx86/cpatch.c | |
index adfd70a74..c689ab919 100644 | |
--- a/src/base/emu-i386/simx86/cpatch.c | |
+++ b/src/base/emu-i386/simx86/cpatch.c | |
@@ -39,6 +39,16 @@ | |
#ifdef HOST_ARCH_X86 | |
+asmlinkage void rep_movs_stos(struct rep_stack *stack) asm("rep_movs_stos"); | |
+asmlinkage void stk_16(dosaddr_t addr, Bit16u value) asm("stk_16"); | |
+asmlinkage void stk_32(dosaddr_t addr, Bit32u value) asm("stk_32"); | |
+asmlinkage void wri_8(dosaddr_t addr, Bit8u value, unsigned char *eip) asm("wri_8"); | |
+asmlinkage void wri_16(dosaddr_t addr, Bit16u value, unsigned char *eip) asm("wri_16"); | |
+asmlinkage void wri_32(dosaddr_t addr, Bit32u value, unsigned char *eip) asm("wri_32"); | |
+asmlinkage Bit8u read_8(dosaddr_t addr) asm("read_8"); | |
+asmlinkage Bit16u read_16(dosaddr_t addr) asm("read_16"); | |
+asmlinkage Bit32u read_32(dosaddr_t addr) asm("read_32"); | |
+ | |
static int in_cpatch; | |
/* | |
diff --git a/src/base/lib/mapping/mapfile.c b/src/base/lib/mapping/mapfile.c | |
index 818072686..9be7ea311 100644 | |
--- a/src/base/lib/mapping/mapfile.c | |
+++ b/src/base/lib/mapping/mapfile.c | |
@@ -88,6 +88,7 @@ static void *alias_mapping_file(int cap, void *target, size_t mapsize, int prote | |
if (addr == MAP_FAILED) { | |
addr = mmap(target, mapsize, protect & ~PROT_EXEC, MAP_SHARED | fixed, | |
p->fd, offs); | |
+#ifndef __APPLE__ | |
if (addr != MAP_FAILED) { | |
int ret = mprotect(addr, mapsize, protect); | |
if (ret == -1) { | |
@@ -97,6 +98,7 @@ static void *alias_mapping_file(int cap, void *target, size_t mapsize, int prote | |
} | |
} else | |
perror("mmap()"); | |
+#endif | |
} | |
#if 1 | |
Q_printf("MAPPING: alias_map, fileoffs %llx to %p size %zx, result %p\n", | |
diff --git a/src/base/lib/mapping/mapping.c b/src/base/lib/mapping/mapping.c | |
index 2c1a4ed7a..f851fd550 100644 | |
--- a/src/base/lib/mapping/mapping.c | |
+++ b/src/base/lib/mapping/mapping.c | |
@@ -421,6 +421,9 @@ int mprotect_mapping(int cap, dosaddr_t targ, size_t mapsize, int protect) | |
if (is_kvm_map(cap)) | |
mprotect_kvm(cap, targ, mapsize, protect); | |
if (!(cap & MAPPING_LOWMEM)) { | |
+#ifdef __APPLE__ | |
+ protect &= ~PROT_EXEC; | |
+#endif | |
ret = mprotect(MEM_BASE32(targ), mapsize, protect); | |
if (ret) | |
error("mprotect() failed: %s\n", strerror(errno)); | |
@@ -432,6 +435,9 @@ int mprotect_mapping(int cap, dosaddr_t targ, size_t mapsize, int protect) | |
if (addr == MAP_FAILED || i == KVM_BASE) | |
continue; | |
assert(i == MEM_BASE || targ + mapsize <= ALIAS_SIZE); | |
+#ifdef __APPLE__ | |
+ protect &= ~PROT_EXEC; | |
+#endif | |
Q__printf("MAPPING: mprotect, cap=%s, addr=%p, size=%zx, protect=%x\n", | |
cap, addr, mapsize, protect); | |
ret = mprotect(addr, mapsize, protect); | |
@@ -930,6 +936,9 @@ close_kmem (void) | |
void *mapping_find_hole(unsigned long start, unsigned long stop, | |
unsigned long size) | |
{ | |
+#ifdef __APPLE__ | |
+ return MAP_FAILED; | |
+#else | |
FILE *fp; | |
unsigned long beg, end, pend; | |
int fd, ret; | |
@@ -963,6 +972,7 @@ void *mapping_find_hole(unsigned long start, unsigned long stop, | |
if (ret != 2) | |
return MAP_FAILED; | |
return (void *)pend; | |
+#endif | |
} | |
int mcommit(void *ptr, size_t size) | |
diff --git a/src/base/lib/mcontext/asm.SS b/src/base/lib/mcontext/asm.SS | |
index e27ca3f64..fefe87760 100644 | |
--- a/src/base/lib/mcontext/asm.SS | |
+++ b/src/base/lib/mcontext/asm.SS | |
@@ -25,8 +25,8 @@ | |
#define GET _getmcontext | |
#elif defined(__x86_64__) | |
#define NEEDAMD64CONTEXT 1 | |
-#define SET _setmcontext | |
-#define GET _getmcontext | |
+#define SET __setmcontext | |
+#define GET __getmcontext | |
#elif defined(__arm__) | |
#define NEEDARMCONTEXT 1 | |
#define SET _setmcontext | |
diff --git a/src/base/lib/timer/evtimer.c b/src/base/lib/timer/evtimer.c | |
index e67cda2cb..84349762a 100644 | |
--- a/src/base/lib/timer/evtimer.c | |
+++ b/src/base/lib/timer/evtimer.c | |
@@ -39,8 +39,18 @@ | |
#endif | |
#include "evtimer.h" | |
+#ifdef __APPLE__ | |
+#include <dispatch/dispatch.h> | |
+#endif | |
+ | |
struct evtimer { | |
+#ifdef __APPLE__ | |
+ dispatch_queue_t queue; | |
+ dispatch_source_t source; | |
+ int suspended; | |
+#else | |
timer_t tmr; | |
+#endif | |
void (*callback)(int ticks, void *); | |
void *arg; | |
clockid_t clk_id; | |
@@ -53,14 +63,26 @@ struct evtimer { | |
int in_cbk; | |
}; | |
+#ifdef __APPLE__ | |
+static void evhandler(void *arg) | |
+#else | |
static void evhandler(union sigval sv) | |
+#endif | |
{ | |
int bl; | |
- struct evtimer *t = sv.sival_ptr; | |
+ struct evtimer *t; | |
+#ifdef __APPLE__ | |
+ t = arg; | |
+#else | |
+ t = sv.sival_ptr; | |
+#endif | |
pthread_mutex_lock(&t->block_mtx); | |
bl = t->blocked; | |
- t->ticks += timer_getoverrun(t->tmr) + 1; | |
+#ifndef __APPLE__ | |
+ t->ticks += timer_getoverrun(t->tmr); | |
+#endif | |
+ t->ticks++; | |
if (!bl) | |
t->in_cbk++; | |
pthread_mutex_unlock(&t->block_mtx); | |
@@ -74,21 +96,48 @@ static void evhandler(union sigval sv) | |
} | |
} | |
+#ifdef __APPLE__ | |
+#include <stdio.h> | |
+static void evtimer_cancel(void *arg) | |
+{ | |
+ struct evtimer *t = arg; | |
+ //if (t->source) | |
+ // dispatch_release(t->source); | |
+ //if (t->queue) | |
+ // dispatch_release(t->queue); | |
+ t->source = NULL; | |
+ t->queue = NULL; | |
+} | |
+#endif | |
+ | |
void *evtimer_create(void (*cbk)(int ticks, void *), void *arg) | |
{ | |
struct evtimer *t; | |
clockid_t id = CLOCK_MONOTONIC; | |
+#ifndef __APPLE__ | |
struct sigevent sev = { .sigev_notify = SIGEV_THREAD, | |
.sigev_notify_function = evhandler }; | |
timer_t tmr; | |
int rc; | |
+#endif | |
t = malloc(sizeof(*t)); | |
assert(t); | |
+#ifdef __APPLE__ | |
+ t->queue = dispatch_queue_create("timerqueue", 0); | |
+ t->source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, | |
+ 0, 0, t->queue); | |
+ t->suspended = 1; | |
+ dispatch_set_context(t->source, t); | |
+ dispatch_source_set_event_handler_f(t->source, evhandler); | |
+ dispatch_source_set_cancel_handler_f(t->source, evtimer_cancel); | |
+ t->start.tv_sec = t->start.tv_nsec = 0; | |
+#else | |
sev.sigev_value.sival_ptr = t; | |
rc = timer_create(id, &sev, &tmr); | |
assert(rc != -1); | |
t->tmr = tmr; | |
+#endif | |
t->callback = cbk; | |
t->arg = arg; | |
t->clk_id = id; | |
@@ -105,7 +154,11 @@ void evtimer_delete(void *tmr) | |
{ | |
struct evtimer *t = tmr; | |
+#ifndef __APPLE__ | |
timer_delete(t->tmr); | |
+#else | |
+ dispatch_source_cancel(t->source); | |
+#endif | |
pthread_mutex_destroy(&t->start_mtx); | |
pthread_mutex_destroy(&t->block_mtx); | |
pthread_cond_destroy(&t->block_cnd); | |
@@ -115,17 +168,29 @@ void evtimer_delete(void *tmr) | |
void evtimer_set_rel(void *tmr, uint64_t ns, int periodic) | |
{ | |
struct evtimer *t = tmr; | |
+ struct timespec start; | |
+ | |
+ clock_gettime(t->clk_id, &start); | |
+#ifdef __APPLE__ | |
+ dispatch_time_t dstart; | |
+ if (!t->suspended) | |
+ dispatch_suspend(t->source); | |
+ dstart = dispatch_time(DISPATCH_TIME_NOW, ns); | |
+ dispatch_source_set_timer(t->source, dstart, ns, 0); | |
+ dispatch_resume(t->source); | |
+ t->suspended = 0; | |
+#else | |
struct itimerspec i = {}; | |
- struct timespec rel, abs, start; | |
+ struct timespec rel, abs; | |
rel.tv_sec = ns / NANOSECONDS_PER_SECOND; | |
rel.tv_nsec = ns % NANOSECONDS_PER_SECOND; | |
if (periodic) | |
i.it_interval = rel; | |
- clock_gettime(t->clk_id, &start); | |
timespecadd(&start, &rel, &abs); | |
i.it_value = abs; | |
timer_settime(t->tmr, TIMER_ABSTIME, &i, NULL); | |
+#endif | |
pthread_mutex_lock(&t->start_mtx); | |
t->start = start; | |
pthread_mutex_unlock(&t->start_mtx); | |
@@ -134,22 +199,30 @@ void evtimer_set_rel(void *tmr, uint64_t ns, int periodic) | |
uint64_t evtimer_gettime(void *tmr) | |
{ | |
struct evtimer *t = tmr; | |
- struct timespec rel, abs; | |
+ struct timespec abs; | |
+ uint64_t rel; | |
clock_gettime(t->clk_id, &abs); | |
pthread_mutex_lock(&t->start_mtx); | |
- timespecsub(&abs, &t->start, &rel); | |
+ rel = abs.tv_sec * NANOSECONDS_PER_SECOND + abs.tv_nsec - | |
+ (t->start.tv_sec * NANOSECONDS_PER_SECOND + t->start.tv_nsec); | |
pthread_mutex_unlock(&t->start_mtx); | |
- return (rel.tv_sec * NANOSECONDS_PER_SECOND + rel.tv_nsec); | |
+ return rel; | |
} | |
void evtimer_stop(void *tmr) | |
{ | |
struct evtimer *t = tmr; | |
- struct itimerspec i = {}; | |
struct timespec start; | |
+#ifdef __APPLE__ | |
+ if (!t->suspended) | |
+ dispatch_suspend(t->source); | |
+ t->suspended = 1; | |
+#else | |
+ struct itimerspec i = {}; | |
timer_settime(t->tmr, 0, &i, NULL); | |
+#endif | |
clock_gettime(t->clk_id, &start); | |
pthread_mutex_lock(&t->start_mtx); | |
t->start = start; | |
diff --git a/src/base/misc/dos2linux.c b/src/base/misc/dos2linux.c | |
index f2cd5e6f8..51df81f66 100644 | |
--- a/src/base/misc/dos2linux.c | |
+++ b/src/base/misc/dos2linux.c | |
@@ -189,14 +189,14 @@ static int pty_fd; | |
static int pty_done; | |
static int cbrk; | |
static sem_t *pty_sem; | |
-static sem_t rd_sem; | |
+static sem_t _rd_sem, *rd_sem = &_rd_sem; | |
static pthread_t reader; | |
static void *queue; | |
static void *rd_thread(void *arg) | |
{ | |
while (1) { | |
- sem_wait(&rd_sem); | |
+ sem_wait(rd_sem); | |
while (1) { | |
void *ptr; | |
unsigned len; | |
@@ -223,7 +223,7 @@ static void pty_thr(void) | |
init_charset_state(&kstate, trconfig.keyb_charset); | |
init_charset_state(&dstate, trconfig.dos_charset); | |
- sem_post(&rd_sem); | |
+ sem_post(rd_sem); | |
while (1) { | |
rd = spscq_read(queue, buf, sizeof(buf) - 1); | |
if (rd > 0) { | |
@@ -268,7 +268,7 @@ void dos2tty_init(void) | |
return; | |
} | |
unlockpt(pty_fd); | |
- sem_init(&rd_sem, 0, 0); | |
+ sem_init(rd_sem, 0, 0); | |
queue = spscq_init(1024 * 64); // 64K queue | |
pthread_create(&reader, NULL, rd_thread, queue); | |
} | |
@@ -279,7 +279,7 @@ void dos2tty_done(void) | |
pthread_join(reader, NULL); | |
spscq_done(queue); | |
close(pty_fd); | |
- sem_destroy(&rd_sem); | |
+ sem_destroy(rd_sem); | |
} | |
static void dos2tty_start(void) | |
diff --git a/src/base/misc/ioctl.c b/src/base/misc/ioctl.c | |
index 39c0b005a..b576ae2cc 100644 | |
--- a/src/base/misc/ioctl.c | |
+++ b/src/base/misc/ioctl.c | |
@@ -321,7 +321,9 @@ void ioselect_init(void) | |
void ioselect_done(void) | |
{ | |
+#ifndef __APPLE__ | |
pthread_cancel(io_thr); | |
pthread_join(io_thr, NULL); | |
+#endif | |
close(syncpipe[1]); | |
} | |
diff --git a/src/base/misc/utilities.c b/src/base/misc/utilities.c | |
index fe5315391..661312586 100644 | |
--- a/src/base/misc/utilities.c | |
+++ b/src/base/misc/utilities.c | |
@@ -985,12 +985,12 @@ static int tee_close(void *cookie) | |
return ret; | |
} | |
+#ifdef HAVE_FOPENCOOKIE | |
static cookie_io_functions_t tee_ops = { | |
.write = tee_write, | |
.close = tee_close, | |
}; | |
-#ifdef HAVE_FOPENCOOKIE | |
FILE *fstream_tee(FILE *orig, FILE *copy) | |
{ | |
FILE *f; | |
@@ -1060,14 +1060,15 @@ pid_t run_external_command(const char *path, int argc, const char **argv, | |
dup(pts_fd); | |
close(pts_fd); | |
close(pty_fd); | |
- if (close_from != -1) | |
- closefrom(close_from); | |
+ //if (close_from != -1) | |
+ // closefrom(close_from); | |
/* close signals, then unblock */ | |
signal_done(); | |
/* flush pending signals */ | |
- do { | |
- wt = sigtimedwait(&set, NULL, &to); | |
- } while (wt != -1); | |
+ //do { | |
+ //wt = sigwaitinfo(&set, NULL); | |
+ //wt = sigtimedwait(&set, NULL, &to); | |
+ //} while (wt != -1); | |
sigprocmask(SIG_SETMASK, &oset, NULL); | |
#pragma GCC diagnostic push | |
#pragma GCC diagnostic ignored "-Wincompatible-pointer-types" | |
diff --git a/src/base/video/render.c b/src/base/video/render.c | |
index 0b0ed6b02..c58f987df 100644 | |
--- a/src/base/video/render.c | |
+++ b/src/base/video/render.c | |
@@ -35,7 +35,7 @@ static pthread_t render_thr; | |
#endif | |
static pthread_mutex_t render_mtx = PTHREAD_MUTEX_INITIALIZER; | |
static pthread_rwlock_t mode_mtx = PTHREAD_RWLOCK_INITIALIZER; | |
-static sem_t render_sem; | |
+static sem_t _render_sem, *render_sem = &_render_sem; | |
static void do_rend_gfx(void); | |
static void do_rend_text(void); | |
static int remap_mode(void); | |
@@ -241,8 +241,9 @@ int remapper_init(int have_true_color, int have_shmap, int features, | |
#if RENDER_THREADED | |
static void *render_thread(void *arg) | |
{ | |
+ signal_block_async_nosig(NULL); | |
while (1) { | |
- sem_wait(&render_sem); | |
+ sem_wait(render_sem); | |
pthread_mutex_lock(&upd_mtx); | |
is_updating = 1; | |
pthread_mutex_unlock(&upd_mtx); | |
@@ -264,7 +265,7 @@ int render_init(void) | |
{ | |
int err = 0; | |
#if RENDER_THREADED | |
- err = sem_init(&render_sem, 0, 0); | |
+ err = sem_init(render_sem, 0, 0); | |
assert(!err); | |
err = pthread_create(&render_thr, NULL, render_thread, NULL); | |
#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(__GLIBC__) | |
@@ -287,7 +288,7 @@ void render_done(void) | |
#if RENDER_THREADED | |
pthread_cancel(render_thr); | |
pthread_join(render_thr, NULL); | |
- sem_destroy(&render_sem); | |
+ sem_destroy(render_sem); | |
#endif | |
} | |
@@ -652,7 +653,7 @@ int update_screen(void) | |
if (upd) | |
return 1; | |
- sem_post(&render_sem); | |
+ sem_post(render_sem); | |
return 1; | |
} | |
diff --git a/src/include/utilities.h b/src/include/utilities.h | |
index 7a2b12a00..0a072d349 100644 | |
--- a/src/include/utilities.h | |
+++ b/src/include/utilities.h | |
@@ -3,6 +3,9 @@ | |
#include <sys/types.h> | |
#include <semaphore.h> | |
+#include <unistd.h> | |
+#include <stdlib.h> | |
+#include <assert.h> | |
#include "dosemu_debug.h" | |
extern char *logptr, *logbuf; | |
@@ -120,4 +123,25 @@ pid_t run_external_command(const char *path, int argc, | |
optind = 0 | |
#endif | |
+#ifdef __APPLE__ | |
+static inline int sem_init_helper(sem_t **sem, int pshared, unsigned int val, | |
+ const char *file, int line) | |
+{ | |
+ char *sem_name; | |
+ sem_t *psem; | |
+ | |
+ asprintf(&sem_name, "/dosemu_%s%i_sem_%i", file, line, getpid()); | |
+ assert(sem_name); | |
+ psem = sem_open(sem_name, O_CREAT, S_IRUSR | S_IWUSR, val); | |
+ free(sem_name); | |
+ if (psem == SEM_FAILED) | |
+ return -1; | |
+ sem_unlink(psem); | |
+ *sem = psem; | |
+ return 0; | |
+} | |
+#define sem_init(sem,pshared,val) sem_init_helper(&sem,pshared,val,__FILE__,__LINE__) | |
+#define sem_destroy(x) sem_close(x) | |
+#endif | |
+ | |
#endif /* UTILITIES_H */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment