#include <mach/mach.h>
#include <pthread_internals.h>
#include <pthread.h>
#include "cthreads.h"
#include "cthread_internals.h"
pthread_lock_t reply_port_lock;
extern mach_port_t _pthread_reply_port(pthread_t);
static mach_port_t _task_reply_port = MACH_PORT_NULL;
void mig_fork_child()
{
UNLOCK(reply_port_lock);
}
void
mig_init(init_done)
int init_done;
{
if (init_done == 0) {
LOCK_INIT(reply_port_lock);
_task_reply_port = mach_reply_port();
}
}
mach_port_t
mig_get_reply_port()
{
register cproc_t self;
pthread_t pself;
#ifdef CTHREADS_DEBUG
int d = cthread_debug;
#endif CTHREADS_DEBUG
#ifdef CTHREADS_DEBUG
cthread_debug = FALSE;
#endif CTHREADS_DEBUG
pself = pthread_self();
if ((pself != (pthread_t)NULL) && (pself->sig == _PTHREAD_SIG)) {
if (pself->reply_port == MACH_PORT_NULL) {
pself->reply_port = mach_reply_port();
}
return pself->reply_port;
}
self = cproc_self();
if (self == NO_CPROC) {
#ifdef CTHREADS_DEBUG
cthread_debug = d;
#endif CTHREADS_DEBUG
return(_task_reply_port);
}
if (self->reply_port == MACH_PORT_NULL) {
self->reply_port = mach_reply_port();
}
#ifdef CTHREADS_DEBUG
cthread_debug = d;
#endif CTHREADS_DEBUG
return self->reply_port;
}
void
mig_dealloc_reply_port(mach_port_t migport)
{
register cproc_t self;
pthread_t pself;
register mach_port_t port;
#ifdef CTHREADS_DEBUG
int d = cthread_debug;
#endif CTHREADS_DEBUG
#ifdef CTHREADS_DEBUG
cthread_debug = FALSE;
#endif CTHREADS_DEBUG
pself = pthread_self();
if ((pself != (pthread_t)NULL) && (pself->sig == _PTHREAD_SIG)) {
port = pself->reply_port;
if (port != MACH_PORT_NULL && port != _task_reply_port) {
LOCK(reply_port_lock);
pself->reply_port = _task_reply_port;
(void) mach_port_destroy(mach_task_self(), port);
pself->reply_port = MACH_PORT_NULL;
UNLOCK(reply_port_lock);
}
return;
}
self = cproc_self();
if (self == NO_CPROC) {
#ifdef CTHREADS_DEBUG
cthread_debug = d;
#endif CTHREADS_DEBUG
return;
}
ASSERT(self != NO_CPROC);
port = self->reply_port;
if (port != MACH_PORT_NULL && port != _task_reply_port) {
LOCK(reply_port_lock);
self->reply_port = _task_reply_port;
(void) mach_port_destroy(mach_task_self(), port);
self->reply_port = MACH_PORT_NULL;
UNLOCK(reply_port_lock);
}
#ifdef CTHREADS_DEBUG
cthread_debug = d;
#endif CTHREADS_DEBUG
}
void
mig_put_reply_port(
mach_port_t reply_port)
{
}