Cygwin: Implement pthread_tryjoin_np and pthread_timedjoin_np
- Move pthread_join to thread.cc to have all `join' calls in the same file (pthread_timedjoin_np needs pthread_convert_abstime which is static inline in thread.cc) - Bump API version Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
006520ca2b
commit
732e0b395d
|
@ -1135,6 +1135,8 @@ pthread_spin_trylock SIGFE
|
||||||
pthread_spin_unlock SIGFE
|
pthread_spin_unlock SIGFE
|
||||||
pthread_suspend SIGFE
|
pthread_suspend SIGFE
|
||||||
pthread_testcancel SIGFE
|
pthread_testcancel SIGFE
|
||||||
|
pthread_timedjoin_np SIGFE
|
||||||
|
pthread_tryjoin_np SIGFE
|
||||||
pthread_yield = sched_yield SIGFE
|
pthread_yield = sched_yield SIGFE
|
||||||
ptsname SIGFE
|
ptsname SIGFE
|
||||||
ptsname_r SIGFE
|
ptsname_r SIGFE
|
||||||
|
|
|
@ -495,12 +495,13 @@ details. */
|
||||||
324: Export sigtimedwait.
|
324: Export sigtimedwait.
|
||||||
325: Export catclose, catgets, catopen.
|
325: Export catclose, catgets, catopen.
|
||||||
326: Export clearenv
|
326: Export clearenv
|
||||||
|
327: Export pthread_tryjoin_np, pthread_timedjoin_np.
|
||||||
|
|
||||||
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
|
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
|
||||||
sigaltstack, sethostname. */
|
sigaltstack, sethostname. */
|
||||||
|
|
||||||
#define CYGWIN_VERSION_API_MAJOR 0
|
#define CYGWIN_VERSION_API_MAJOR 0
|
||||||
#define CYGWIN_VERSION_API_MINOR 326
|
#define CYGWIN_VERSION_API_MINOR 327
|
||||||
|
|
||||||
/* There is also a compatibity version number associated with the shared memory
|
/* There is also a compatibity version number associated with the shared memory
|
||||||
regions. It is incremented when incompatible changes are made to the shared
|
regions. It is incremented when incompatible changes are made to the shared
|
||||||
|
|
|
@ -154,6 +154,8 @@ int pthread_getcpuclockid (pthread_t, clockid_t *);
|
||||||
int pthread_getschedparam (pthread_t, int *, struct sched_param *);
|
int pthread_getschedparam (pthread_t, int *, struct sched_param *);
|
||||||
void *pthread_getspecific (pthread_key_t);
|
void *pthread_getspecific (pthread_key_t);
|
||||||
int pthread_join (pthread_t, void **);
|
int pthread_join (pthread_t, void **);
|
||||||
|
int pthread_tryjoin_np (pthread_t, void **);
|
||||||
|
int pthread_timedjoin_np (pthread_t, void **, const struct timespec *);
|
||||||
int pthread_key_create (pthread_key_t *, void (*)(void *));
|
int pthread_key_create (pthread_key_t *, void (*)(void *));
|
||||||
int pthread_key_delete (pthread_key_t);
|
int pthread_key_delete (pthread_key_t);
|
||||||
|
|
||||||
|
|
|
@ -41,12 +41,6 @@ pthread_exit (void *value_ptr)
|
||||||
__builtin_unreachable (); /* FIXME: don't know why this is necessary */
|
__builtin_unreachable (); /* FIXME: don't know why this is necessary */
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
pthread_join (pthread_t thread, void **return_val)
|
|
||||||
{
|
|
||||||
return pthread::join (&thread, (void **) return_val);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_detach (pthread_t thread)
|
pthread_detach (pthread_t thread)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
What's new:
|
What's new:
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
- New API: clearenv.
|
- New API: clearenv, pthread_tryjoin_np, pthread_timedjoin_np.
|
||||||
|
|
||||||
|
|
||||||
What changed:
|
What changed:
|
||||||
-------------
|
-------------
|
||||||
|
|
|
@ -2421,7 +2421,7 @@ pthread_attr_destroy (pthread_attr_t *attr)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread::join (pthread_t *thread, void **return_val)
|
pthread::join (pthread_t *thread, void **return_val, PLARGE_INTEGER timeout)
|
||||||
{
|
{
|
||||||
pthread_t joiner = self ();
|
pthread_t joiner = self ();
|
||||||
|
|
||||||
|
@ -2453,7 +2453,7 @@ pthread::join (pthread_t *thread, void **return_val)
|
||||||
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
||||||
(*thread)->mutex.unlock ();
|
(*thread)->mutex.unlock ();
|
||||||
|
|
||||||
switch (cygwait ((*thread)->win32_obj_id, cw_infinite,
|
switch (cygwait ((*thread)->win32_obj_id, timeout,
|
||||||
cw_sig | cw_sig_restart | cw_cancel))
|
cw_sig | cw_sig_restart | cw_cancel))
|
||||||
{
|
{
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
|
@ -2468,6 +2468,11 @@ pthread::join (pthread_t *thread, void **return_val)
|
||||||
joiner->cancel_self ();
|
joiner->cancel_self ();
|
||||||
// never reached
|
// never reached
|
||||||
break;
|
break;
|
||||||
|
case WAIT_TIMEOUT:
|
||||||
|
// set joined thread back to joinable since we got canceled
|
||||||
|
(*thread)->joiner = NULL;
|
||||||
|
(*thread)->attr.joinable = PTHREAD_CREATE_JOINABLE;
|
||||||
|
return EBUSY;
|
||||||
default:
|
default:
|
||||||
// should never happen
|
// should never happen
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
@ -2574,6 +2579,32 @@ pthread_convert_abstime (clockid_t clock_id, const struct timespec *abstime,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" int
|
||||||
|
pthread_join (pthread_t thread, void **return_val)
|
||||||
|
{
|
||||||
|
return pthread::join (&thread, (void **) return_val, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int
|
||||||
|
pthread_tryjoin_np (pthread_t thread, void **return_val)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER timeout = { 0, 0 };
|
||||||
|
|
||||||
|
return pthread::join (&thread, (void **) return_val, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int
|
||||||
|
pthread_timedjoin_np (pthread_t thread, void **return_val,
|
||||||
|
const struct timespec *abstime)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER timeout;
|
||||||
|
|
||||||
|
int err = pthread_convert_abstime (CLOCK_REALTIME, abstime, &timeout);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
return pthread::join (&thread, (void **) return_val, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
pthread_getattr_np (pthread_t thread, pthread_attr_t *attr)
|
pthread_getattr_np (pthread_t thread, pthread_attr_t *attr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -375,7 +375,7 @@ public:
|
||||||
|
|
||||||
/* API calls */
|
/* API calls */
|
||||||
static int cancel (pthread_t);
|
static int cancel (pthread_t);
|
||||||
static int join (pthread_t * thread, void **return_val);
|
static int join (pthread_t * thread, void **return_val, PLARGE_INTEGER);
|
||||||
static int detach (pthread_t * thread);
|
static int detach (pthread_t * thread);
|
||||||
static int create (pthread_t * thread, const pthread_attr_t * attr,
|
static int create (pthread_t * thread, const pthread_attr_t * attr,
|
||||||
void *(*start_routine) (void *), void *arg);
|
void *(*start_routine) (void *), void *arg);
|
||||||
|
|
Loading…
Reference in New Issue