Cygwin: pthreads: merge pthread.cc into thread.cc
provide entire internal and external pthread API from inside the same file. While I dislike to have another even larger file, this is basically cleaning up the source and grouping the external API into useful chunks. Splitting the file cleanly is tricky due to usage of inline methods is_good_object and verifyable_object_isvalid. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
1556b96b1b
commit
34872ce1a1
|
@ -314,7 +314,7 @@ DLL_FILES= \
|
|||
posix_ipc.cc \
|
||||
posix_timer.cc \
|
||||
pseudo-reloc.cc \
|
||||
pthread.cc \
|
||||
thread.cc \
|
||||
quotactl.cc \
|
||||
random.cc \
|
||||
registry.cc \
|
||||
|
@ -339,7 +339,6 @@ DLL_FILES= \
|
|||
sysconf.cc \
|
||||
syslog.cc \
|
||||
termios.cc \
|
||||
thread.cc \
|
||||
timerfd.cc \
|
||||
times.cc \
|
||||
tls_pbuf.cc \
|
||||
|
@ -653,7 +652,7 @@ libc.a: $(LIB_NAME) libm.a libpthread.a libutil.a
|
|||
libm.a: $(LIB_NAME) $(newlib_build)/libm.a $(addsuffix .o,$(basename $(MATH_FILES)))
|
||||
$(AM_V_GEN)$(speclib) $^ $(@F)
|
||||
|
||||
libpthread.a: $(LIB_NAME) pthread.o thread.o libc/call_once.o libc/cnd.o \
|
||||
libpthread.a: $(LIB_NAME) thread.o libc/call_once.o libc/cnd.o \
|
||||
libc/mtx.o libc/thrd.o libc/tss.o
|
||||
$(AM_V_GEN)$(speclib) $^ $(@F)
|
||||
|
||||
|
|
|
@ -1,196 +0,0 @@
|
|||
/* pthread.cc: posix pthread interface for Cygwin
|
||||
|
||||
Originally written by Marco Fuykschot <marco@ddi.nl>
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
This software is a copyrighted work licensed under the terms of the
|
||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include "winsup.h"
|
||||
#include "thread.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
/* ThreadCreation */
|
||||
int
|
||||
pthread_create (pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg)
|
||||
{
|
||||
return pthread::create (thread, attr, start_routine, arg);
|
||||
}
|
||||
|
||||
int
|
||||
pthread_once (pthread_once_t * once_control, void (*init_routine) (void))
|
||||
{
|
||||
return pthread::once (once_control, init_routine);
|
||||
}
|
||||
|
||||
int
|
||||
pthread_atfork (void (*prepare)(void), void (*parent)(void), void (*child)(void))
|
||||
{
|
||||
return pthread::atfork (prepare, parent, child);
|
||||
}
|
||||
|
||||
/* Thread Exit */
|
||||
void
|
||||
pthread_exit (void *value_ptr)
|
||||
{
|
||||
pthread::self ()->exit (value_ptr);
|
||||
__builtin_unreachable (); /* FIXME: don't know why this is necessary */
|
||||
}
|
||||
|
||||
int
|
||||
pthread_detach (pthread_t thread)
|
||||
{
|
||||
return pthread::detach (&thread);
|
||||
}
|
||||
|
||||
|
||||
/* This isn't a posix call... should we keep it? */
|
||||
int
|
||||
pthread_suspend (pthread_t thread)
|
||||
{
|
||||
return pthread::suspend (&thread);
|
||||
}
|
||||
|
||||
/* same */
|
||||
int
|
||||
pthread_continue (pthread_t thread)
|
||||
{
|
||||
return pthread::resume (&thread);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
pthread_getsequence_np (pthread_t * thread)
|
||||
{
|
||||
if (!pthread::is_good_object (thread))
|
||||
return EINVAL;
|
||||
return (*thread)->getsequence_np ();
|
||||
}
|
||||
|
||||
/* ID */
|
||||
|
||||
pthread_t pthread_self ()
|
||||
{
|
||||
return pthread::self ();
|
||||
}
|
||||
|
||||
/* Mutexes */
|
||||
int
|
||||
pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
|
||||
{
|
||||
return pthread_mutex::init (mutex, attr, NULL);
|
||||
}
|
||||
|
||||
/* Spinlocks */
|
||||
int
|
||||
pthread_spin_init (pthread_spinlock_t *spinlock, int pshared)
|
||||
{
|
||||
return pthread_spinlock::init (spinlock, pshared);
|
||||
}
|
||||
|
||||
|
||||
/* Synchronisation */
|
||||
int
|
||||
pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr)
|
||||
{
|
||||
return pthread_cond::init (cond, attr);
|
||||
}
|
||||
|
||||
/* RW Locks */
|
||||
int
|
||||
pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
|
||||
{
|
||||
return pthread_rwlock::init (rwlock, attr);
|
||||
}
|
||||
|
||||
/* Cancelability */
|
||||
|
||||
int
|
||||
pthread_cancel (pthread_t thread)
|
||||
{
|
||||
return pthread::cancel (thread);
|
||||
}
|
||||
|
||||
int
|
||||
pthread_setcancelstate (int state, int *oldstate)
|
||||
{
|
||||
return pthread::self ()->setcancelstate (state, oldstate);
|
||||
}
|
||||
|
||||
int
|
||||
pthread_setcanceltype (int type, int *oldtype)
|
||||
{
|
||||
return pthread::self ()->setcanceltype (type, oldtype);
|
||||
}
|
||||
|
||||
void
|
||||
pthread_testcancel ()
|
||||
{
|
||||
pthread::self ()->testcancel ();
|
||||
}
|
||||
|
||||
void
|
||||
_pthread_cleanup_push (__pthread_cleanup_handler *handler)
|
||||
{
|
||||
pthread::self ()->push_cleanup_handler (handler);
|
||||
}
|
||||
|
||||
void
|
||||
_pthread_cleanup_pop (int execute)
|
||||
{
|
||||
pthread::self ()->pop_cleanup_handler (execute);
|
||||
}
|
||||
|
||||
/* Semaphores */
|
||||
int
|
||||
sem_init (sem_t * sem, int pshared, unsigned int value)
|
||||
{
|
||||
return semaphore::init (sem, pshared, value);
|
||||
}
|
||||
|
||||
int
|
||||
sem_destroy (sem_t * sem)
|
||||
{
|
||||
return semaphore::destroy (sem);
|
||||
}
|
||||
|
||||
int
|
||||
sem_wait (sem_t * sem)
|
||||
{
|
||||
return semaphore::wait (sem);
|
||||
}
|
||||
|
||||
int
|
||||
sem_trywait (sem_t * sem)
|
||||
{
|
||||
return semaphore::trywait (sem);
|
||||
}
|
||||
|
||||
int
|
||||
sem_clockwait (sem_t * sem, clockid_t clock_id, const struct timespec *abstime)
|
||||
{
|
||||
return semaphore::clockwait (sem, clock_id, abstime);
|
||||
}
|
||||
|
||||
int
|
||||
sem_timedwait (sem_t * sem, const struct timespec *abstime)
|
||||
{
|
||||
return semaphore::clockwait (sem, CLOCK_REALTIME, abstime);
|
||||
}
|
||||
|
||||
int
|
||||
sem_post (sem_t *sem)
|
||||
{
|
||||
return semaphore::post (sem);
|
||||
}
|
||||
|
||||
int
|
||||
sem_getvalue (sem_t * sem, int *sval)
|
||||
{
|
||||
return semaphore::getvalue (sem, sval);
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue