2001-12-02 13:23:26 +08:00
|
|
|
/* thread.cc: Locking and threading module functions
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-01-10 20:32:49 +08:00
|
|
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
Originally written by Marco Fuykschot <marco@ddi.nl>
|
2001-12-02 13:23:26 +08:00
|
|
|
Substantialy enhanced by Robert Collins <rbtcollins@hotmail.com>
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
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. */
|
|
|
|
|
2001-09-12 12:47:47 +08:00
|
|
|
/* Implementation overview and caveats:
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2001-09-12 12:47:47 +08:00
|
|
|
Win32 puts some contraints on what can and cannot be implemented. Where
|
|
|
|
possible we work around those contrainsts. Where we cannot work around
|
|
|
|
the constraints we either pretend to be conformant, or return an error
|
|
|
|
code.
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2001-09-12 12:47:47 +08:00
|
|
|
Some caveats: PROCESS_SHARED objects while they pretend to be process
|
|
|
|
shared, may not actually work. Some test cases are needed to determine
|
|
|
|
win32's behaviour. My suspicion is that the win32 handle needs to be
|
|
|
|
opened with different flags for proper operation.
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2001-09-12 12:47:47 +08:00
|
|
|
R.Collins, April 2001. */
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "winsup.h"
|
2001-01-05 02:33:39 +08:00
|
|
|
#include <limits.h>
|
2001-03-21 10:17:58 +08:00
|
|
|
#include "cygerrno.h"
|
2000-02-18 03:38:33 +08:00
|
|
|
#include <assert.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <syslog.h>
|
2000-08-12 13:35:42 +08:00
|
|
|
#include "pinfo.h"
|
2000-09-08 10:56:55 +08:00
|
|
|
#include "perprocess.h"
|
|
|
|
#include "security.h"
|
2001-03-21 10:17:58 +08:00
|
|
|
#include <semaphore.h>
|
2001-04-21 22:23:47 +08:00
|
|
|
#include <stdio.h>
|
2001-06-26 22:47:48 +08:00
|
|
|
#include <sys/timeb.h>
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
extern int threadsafe;
|
|
|
|
|
2003-06-16 11:24:13 +08:00
|
|
|
extern "C" struct _reent *
|
|
|
|
__getreent ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-03-21 10:17:58 +08:00
|
|
|
struct __reent_t *_r =
|
2002-11-24 21:54:14 +08:00
|
|
|
(struct __reent_t *) MT_INTERFACE->reent_key.get ();
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
if (_r == 0)
|
2003-06-16 11:24:13 +08:00
|
|
|
{
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
system_printf ("local thread storage not inited");
|
2000-02-18 03:38:33 +08:00
|
|
|
#endif
|
2003-06-16 11:24:13 +08:00
|
|
|
/* Return _impure_ptr as long as MTinterface is not initialized */
|
|
|
|
return _impure_ptr;
|
|
|
|
}
|
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
return _r->_clib;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
struct _winsup_t *
|
|
|
|
_reent_winsup ()
|
|
|
|
{
|
2002-11-24 21:54:14 +08:00
|
|
|
struct __reent_t *_r =
|
|
|
|
(struct __reent_t *) MT_INTERFACE->reent_key.get ();
|
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
if (_r == 0)
|
2003-06-16 11:24:13 +08:00
|
|
|
{
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
system_printf ("local thread storage not inited");
|
2000-02-18 03:38:33 +08:00
|
|
|
#endif
|
2003-06-16 11:24:13 +08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
return _r->_winsup;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-01-10 04:40:44 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex::init ()
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
|
|
|
theHandle = CreateMutex (&sec_none_nih, FALSE, NULL);
|
|
|
|
if (!theHandle)
|
|
|
|
{
|
|
|
|
debug_printf ("CreateMutex failed. %E");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex::lock ()
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
|
|
|
DWORD waitResult = WaitForSingleObject (theHandle, INFINITE);
|
|
|
|
if (waitResult != WAIT_OBJECT_0)
|
|
|
|
{
|
|
|
|
system_printf ("Received unexpected wait result %d on handle %p, %E", waitResult, theHandle);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex::unlock ()
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
|
|
|
if (!ReleaseMutex (theHandle))
|
|
|
|
system_printf ("Received a unexpected result releasing mutex. %E");
|
|
|
|
}
|
|
|
|
|
2000-08-04 12:04:46 +08:00
|
|
|
inline LPCRITICAL_SECTION
|
|
|
|
ResourceLocks::Lock (int _resid)
|
|
|
|
{
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
if (!inited)
|
|
|
|
system_printf ("lock called before initialization");
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
thread_printf
|
|
|
|
("Get Resource lock %d ==> %p for %p , real : %d , threadid %d ", _resid,
|
|
|
|
&lock, user_data, myself->pid, GetCurrentThreadId ());
|
2000-08-04 12:04:46 +08:00
|
|
|
#endif
|
|
|
|
return &lock;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-08-04 12:04:46 +08:00
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
void
|
|
|
|
SetResourceLock (int _res_id, int _mode, const char *_function)
|
|
|
|
{
|
2000-08-04 12:04:46 +08:00
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
thread_printf ("Set resource lock %d mode %d for %s start",
|
|
|
|
_res_id, _mode, _function);
|
2000-02-18 03:38:33 +08:00
|
|
|
#endif
|
|
|
|
EnterCriticalSection (user_data->resourcelocks->Lock (_res_id));
|
|
|
|
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
user_data->resourcelocks->owner = GetCurrentThreadId ();
|
|
|
|
user_data->resourcelocks->count++;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ReleaseResourceLock (int _res_id, int _mode, const char *_function)
|
|
|
|
{
|
2000-08-04 12:04:46 +08:00
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
2001-03-21 10:17:58 +08:00
|
|
|
thread_printf ("Release resource lock %d mode %d for %s done", _res_id,
|
|
|
|
_mode, _function);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
AssertResourceOwner (_res_id, _mode);
|
|
|
|
user_data->resourcelocks->count--;
|
|
|
|
if (user_data->resourcelocks->count == 0)
|
|
|
|
user_data->resourcelocks->owner = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
void
|
|
|
|
AssertResourceOwner (int _res_id, int _mode)
|
|
|
|
{
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
thread_printf
|
|
|
|
("Assert Resource lock %d ==> for %p , real : %d , threadid %d count %d owner %d",
|
|
|
|
_res_id, user_data, myself->pid, GetCurrentThreadId (),
|
|
|
|
user_data->resourcelocks->count, user_data->resourcelocks->owner);
|
2000-02-18 03:38:33 +08:00
|
|
|
if (user_data && (user_data->resourcelocks->owner != GetCurrentThreadId ()))
|
2000-08-04 12:04:46 +08:00
|
|
|
system_printf ("assertion failed, not the resource owner");
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
|
|
|
ResourceLocks::Init ()
|
|
|
|
{
|
|
|
|
InitializeCriticalSection (&lock);
|
|
|
|
inited = true;
|
|
|
|
|
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
owner = 0;
|
|
|
|
count = 0;
|
|
|
|
#endif
|
|
|
|
|
2000-10-17 07:55:58 +08:00
|
|
|
thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid);
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
void
|
|
|
|
ResourceLocks::Delete ()
|
|
|
|
{
|
|
|
|
if (inited)
|
|
|
|
{
|
|
|
|
thread_printf ("Close Resource Locks %p ", &lock);
|
|
|
|
DeleteCriticalSection (&lock);
|
|
|
|
inited = false;
|
2000-08-04 12:04:46 +08:00
|
|
|
}
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
void
|
2003-05-16 03:42:51 +08:00
|
|
|
MTinterface::Init ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
|
|
|
reents._clib = _impure_ptr;
|
|
|
|
reents._winsup = &winsup_reent;
|
|
|
|
winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
|
2003-05-16 03:42:51 +08:00
|
|
|
reent_key.set (&reents);
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::init_mutex ();
|
|
|
|
pthread_cond::init_mutex ();
|
|
|
|
pthread_rwlock::init_mutex ();
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
void
|
|
|
|
MTinterface::fixup_before_fork (void)
|
|
|
|
{
|
|
|
|
pthread_key::fixup_before_fork ();
|
|
|
|
}
|
|
|
|
|
2001-09-11 16:15:39 +08:00
|
|
|
/* This function is called from a single threaded process */
|
|
|
|
void
|
|
|
|
MTinterface::fixup_after_fork (void)
|
|
|
|
{
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread_key::fixup_after_fork ();
|
2003-03-05 04:16:49 +08:00
|
|
|
|
2003-06-16 11:24:13 +08:00
|
|
|
#ifndef __SIGNALS_ARE_MULTITHREADED__
|
|
|
|
/* As long as the signal handling not multithreaded
|
|
|
|
switch reents storage back to _impure_ptr for the mainthread
|
|
|
|
to support fork from threads other than the mainthread */
|
|
|
|
reents._clib = _impure_ptr;
|
|
|
|
reents._winsup = &winsup_reent;
|
|
|
|
winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
|
|
|
|
reent_key.set (&reents);
|
|
|
|
#endif
|
|
|
|
|
2003-03-05 04:16:49 +08:00
|
|
|
threadcount = 1;
|
2003-05-16 03:42:51 +08:00
|
|
|
pthread::init_mainthread ();
|
2003-03-05 04:16:49 +08:00
|
|
|
|
2003-06-25 04:14:01 +08:00
|
|
|
pthread::fixup_after_fork ();
|
2003-03-23 18:52:02 +08:00
|
|
|
pthread_mutex::fixup_after_fork ();
|
|
|
|
pthread_cond::fixup_after_fork ();
|
|
|
|
pthread_rwlock::fixup_after_fork ();
|
|
|
|
semaphore::fixup_after_fork ();
|
2001-09-11 16:15:39 +08:00
|
|
|
}
|
|
|
|
|
2002-06-10 09:10:45 +08:00
|
|
|
/* pthread calls */
|
|
|
|
|
|
|
|
/* static methods */
|
2002-09-16 18:53:29 +08:00
|
|
|
void
|
2003-05-16 03:42:51 +08:00
|
|
|
pthread::init_mainthread ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread *thread = get_tls_self_pointer ();
|
2002-11-24 21:54:14 +08:00
|
|
|
if (!thread)
|
|
|
|
{
|
|
|
|
thread = new pthread ();
|
|
|
|
if (!thread)
|
2003-01-15 04:31:47 +08:00
|
|
|
api_fatal ("failed to create mainthread object");
|
2002-11-24 21:54:14 +08:00
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
thread->init_current_thread ();
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
2002-06-10 09:10:45 +08:00
|
|
|
|
|
|
|
pthread *
|
|
|
|
pthread::self ()
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread *thread = get_tls_self_pointer ();
|
2002-11-24 21:54:14 +08:00
|
|
|
if (thread)
|
|
|
|
return thread;
|
2003-03-28 03:52:20 +08:00
|
|
|
return pthread_null::get_null_pthread ();
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::set_tls_self_pointer (pthread *thisThread)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
2002-11-24 21:54:14 +08:00
|
|
|
MT_INTERFACE->thread_self_key.set (thisThread);
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread *
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::get_tls_self_pointer ()
|
2002-11-24 21:54:14 +08:00
|
|
|
{
|
|
|
|
return (pthread *) MT_INTERFACE->thread_self_key.get ();
|
2002-06-10 09:10:45 +08:00
|
|
|
}
|
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
|
|
|
|
|
2003-06-25 04:14:01 +08:00
|
|
|
List<pthread> pthread::threads;
|
|
|
|
|
2002-06-10 09:10:45 +08:00
|
|
|
/* member methods */
|
2001-04-12 12:04:53 +08:00
|
|
|
pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0),
|
2003-07-26 12:53:59 +08:00
|
|
|
running (false), suspended (false),
|
2002-09-23 05:39:03 +08:00
|
|
|
cancelstate (0), canceltype (0), cancel_event (0),
|
2003-06-25 04:14:01 +08:00
|
|
|
joiner (NULL), next (NULL), cleanup_stack (NULL)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-06-25 04:14:01 +08:00
|
|
|
if (this != pthread_null::get_null_pthread ())
|
|
|
|
threads.insert (this);
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread::~pthread ()
|
|
|
|
{
|
|
|
|
if (win32_obj_id)
|
|
|
|
CloseHandle (win32_obj_id);
|
2002-07-04 22:17:30 +08:00
|
|
|
if (cancel_event)
|
|
|
|
CloseHandle (cancel_event);
|
2003-06-25 04:14:01 +08:00
|
|
|
|
|
|
|
if (this != pthread_null::get_null_pthread ())
|
|
|
|
threads.remove (this);
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-16 18:53:29 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::set_thread_id_to_current ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
thread_id = GetCurrentThreadId ();
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
void
|
2002-09-16 18:53:29 +08:00
|
|
|
pthread::precreate (pthread_attr *newattr)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2002-06-23 15:36:21 +08:00
|
|
|
pthread_mutex *verifyable_mutex_obj = &mutex;
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* already running ? */
|
2001-03-21 10:17:58 +08:00
|
|
|
if (win32_obj_id)
|
|
|
|
return;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if (newattr)
|
|
|
|
{
|
|
|
|
attr.joinable = newattr->joinable;
|
2001-04-12 12:04:53 +08:00
|
|
|
attr.contentionscope = newattr->contentionscope;
|
|
|
|
attr.inheritsched = newattr->inheritsched;
|
2001-03-21 10:17:58 +08:00
|
|
|
attr.stacksize = newattr->stacksize;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (&verifyable_mutex_obj))
|
2002-06-10 10:40:13 +08:00
|
|
|
{
|
|
|
|
thread_printf ("New thread object access mutex is not valid. this %p",
|
|
|
|
this);
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
2003-03-19 03:39:21 +08:00
|
|
|
/* Change the mutex type to NORMAL to speed up mutex operations */
|
|
|
|
mutex.type = PTHREAD_MUTEX_NORMAL;
|
2002-06-10 10:40:13 +08:00
|
|
|
|
2002-09-30 23:05:00 +08:00
|
|
|
cancel_event = ::CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
|
2002-07-04 22:17:30 +08:00
|
|
|
if (!cancel_event)
|
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
system_printf ("couldn't create cancel event, this %p LastError %E", this);
|
|
|
|
/* we need the event for correct behaviour */
|
2002-07-04 22:17:30 +08:00
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::create (void *(*func) (void *), pthread_attr *newattr,
|
|
|
|
void *threadarg)
|
2002-09-17 00:09:54 +08:00
|
|
|
{
|
2002-09-16 18:53:29 +08:00
|
|
|
precreate (newattr);
|
|
|
|
if (!magic)
|
|
|
|
return;
|
|
|
|
function = func;
|
|
|
|
arg = threadarg;
|
2002-07-04 22:17:30 +08:00
|
|
|
|
2001-11-28 08:06:35 +08:00
|
|
|
win32_obj_id = ::CreateThread (&sec_none_nih, attr.stacksize,
|
2001-03-21 10:17:58 +08:00
|
|
|
(LPTHREAD_START_ROUTINE) thread_init_wrapper,
|
|
|
|
this, CREATE_SUSPENDED, &thread_id);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if (!win32_obj_id)
|
2002-06-27 22:19:30 +08:00
|
|
|
{
|
|
|
|
thread_printf ("CreateThread failed: this %p LastError %E", this);
|
|
|
|
magic = 0;
|
|
|
|
}
|
2002-09-16 18:53:29 +08:00
|
|
|
else {
|
|
|
|
postcreate ();
|
2001-04-12 12:04:53 +08:00
|
|
|
ResumeThread (win32_obj_id);
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::postcreate ()
|
|
|
|
{
|
2003-06-25 04:14:01 +08:00
|
|
|
running = true;
|
|
|
|
|
|
|
|
InterlockedIncrement (&MT_INTERFACE->threadcount);
|
|
|
|
/* FIXME: set the priority appropriately for system contention scope */
|
|
|
|
if (attr.inheritsched == PTHREAD_EXPLICIT_SCHED)
|
|
|
|
{
|
|
|
|
/* FIXME: set the scheduling settings for the new thread */
|
|
|
|
/* sched_thread_setparam (win32_obj_id, attr.schedparam); */
|
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-07-04 22:17:30 +08:00
|
|
|
void
|
|
|
|
pthread::exit (void *value_ptr)
|
|
|
|
{
|
|
|
|
class pthread *thread = this;
|
|
|
|
|
|
|
|
// run cleanup handlers
|
|
|
|
pop_all_cleanup_handlers ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_key::run_all_destructors ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.lock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
// cleanup if thread is in detached state and not joined
|
2003-04-18 03:57:01 +08:00
|
|
|
if (equal (joiner, thread))
|
2002-07-04 22:17:30 +08:00
|
|
|
delete this;
|
|
|
|
else
|
2002-09-17 00:09:54 +08:00
|
|
|
{
|
2003-06-25 04:14:01 +08:00
|
|
|
running = false;
|
2002-07-04 22:17:30 +08:00
|
|
|
return_ptr = value_ptr;
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (InterlockedDecrement (&MT_INTERFACE->threadcount) == 0)
|
|
|
|
::exit (0);
|
|
|
|
else
|
|
|
|
ExitThread (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
pthread::cancel (void)
|
|
|
|
{
|
|
|
|
class pthread *thread = this;
|
|
|
|
class pthread *self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.lock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
2003-06-25 04:14:01 +08:00
|
|
|
if (!running)
|
|
|
|
{
|
|
|
|
mutex.unlock ();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-07-04 22:17:30 +08:00
|
|
|
if (canceltype == PTHREAD_CANCEL_DEFERRED ||
|
|
|
|
cancelstate == PTHREAD_CANCEL_DISABLE)
|
|
|
|
{
|
|
|
|
// cancel deferred
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
SetEvent (cancel_event);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-04-18 03:57:01 +08:00
|
|
|
else if (equal (thread, self))
|
2002-07-04 22:17:30 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
cancel_self ();
|
|
|
|
return 0; // Never reached
|
|
|
|
}
|
|
|
|
|
|
|
|
// cancel asynchronous
|
|
|
|
SuspendThread (win32_obj_id);
|
|
|
|
if (WaitForSingleObject (win32_obj_id, 0) == WAIT_TIMEOUT)
|
|
|
|
{
|
|
|
|
CONTEXT context;
|
|
|
|
context.ContextFlags = CONTEXT_CONTROL;
|
|
|
|
GetThreadContext (win32_obj_id, &context);
|
|
|
|
context.Eip = (DWORD) pthread::static_cancel_self;
|
|
|
|
SetThreadContext (win32_obj_id, &context);
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
ResumeThread (win32_obj_id);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
/*
|
|
|
|
TODO: insert pthread_testcancel into the required functions
|
|
|
|
the required function list is: *indicates done, X indicates not present in cygwin.
|
|
|
|
aio_suspend ()
|
|
|
|
*close ()
|
|
|
|
*creat ()
|
|
|
|
fcntl ()
|
|
|
|
fsync ()
|
|
|
|
getmsg ()
|
|
|
|
getpmsg ()
|
|
|
|
lockf ()
|
|
|
|
mq_receive ()
|
|
|
|
mq_send ()
|
|
|
|
msgrcv ()
|
|
|
|
msgsnd ()
|
|
|
|
msync ()
|
|
|
|
nanosleep ()
|
|
|
|
open ()
|
2003-01-15 03:55:42 +08:00
|
|
|
*pause ()
|
2002-07-04 22:17:30 +08:00
|
|
|
poll ()
|
|
|
|
pread ()
|
2003-03-19 03:49:38 +08:00
|
|
|
*pthread_cond_timedwait ()
|
|
|
|
*pthread_cond_wait ()
|
2002-07-04 22:17:30 +08:00
|
|
|
*pthread_join ()
|
2003-01-15 04:19:27 +08:00
|
|
|
*pthread_testcancel ()
|
2002-07-04 22:17:30 +08:00
|
|
|
putmsg ()
|
|
|
|
putpmsg ()
|
|
|
|
pwrite ()
|
|
|
|
read ()
|
|
|
|
readv ()
|
|
|
|
select ()
|
2003-01-10 04:57:54 +08:00
|
|
|
*sem_wait ()
|
2003-01-15 03:55:42 +08:00
|
|
|
*sigpause ()
|
|
|
|
*sigsuspend ()
|
2002-07-04 22:17:30 +08:00
|
|
|
sigtimedwait ()
|
|
|
|
sigwait ()
|
|
|
|
sigwaitinfo ()
|
|
|
|
*sleep ()
|
2003-01-15 04:19:27 +08:00
|
|
|
*system ()
|
2002-07-04 22:17:30 +08:00
|
|
|
tcdrain ()
|
|
|
|
*usleep ()
|
2003-01-15 04:13:09 +08:00
|
|
|
*wait ()
|
|
|
|
*wait3()
|
2002-07-04 22:17:30 +08:00
|
|
|
waitid ()
|
2003-01-15 04:13:09 +08:00
|
|
|
*waitpid ()
|
2002-07-04 22:17:30 +08:00
|
|
|
write ()
|
|
|
|
writev ()
|
|
|
|
|
|
|
|
the optional list is:
|
|
|
|
catclose ()
|
|
|
|
catgets ()
|
|
|
|
catopen ()
|
|
|
|
closedir ()
|
|
|
|
closelog ()
|
|
|
|
ctermid ()
|
|
|
|
dbm_close ()
|
|
|
|
dbm_delete ()
|
|
|
|
dbm_fetch ()
|
|
|
|
dbm_nextkey ()
|
|
|
|
dbm_open ()
|
|
|
|
dbm_store ()
|
|
|
|
dlclose ()
|
|
|
|
dlopen ()
|
|
|
|
endgrent ()
|
|
|
|
endpwent ()
|
|
|
|
endutxent ()
|
|
|
|
fclose ()
|
|
|
|
fcntl ()
|
|
|
|
fflush ()
|
|
|
|
fgetc ()
|
|
|
|
fgetpos ()
|
|
|
|
fgets ()
|
|
|
|
fgetwc ()
|
|
|
|
fgetws ()
|
|
|
|
fopen ()
|
|
|
|
fprintf ()
|
|
|
|
fputc ()
|
|
|
|
fputs ()
|
|
|
|
fputwc ()
|
|
|
|
fputws ()
|
|
|
|
fread ()
|
|
|
|
freopen ()
|
|
|
|
fscanf ()
|
|
|
|
fseek ()
|
|
|
|
fseeko ()
|
|
|
|
fsetpos ()
|
|
|
|
ftell ()
|
|
|
|
ftello ()
|
|
|
|
ftw ()
|
|
|
|
fwprintf ()
|
|
|
|
fwrite ()
|
|
|
|
fwscanf ()
|
|
|
|
getc ()
|
|
|
|
getc_unlocked ()
|
|
|
|
getchar ()
|
|
|
|
getchar_unlocked ()
|
|
|
|
getcwd ()
|
|
|
|
getdate ()
|
|
|
|
getgrent ()
|
|
|
|
getgrgid ()
|
|
|
|
getgrgid_r ()
|
|
|
|
getgrnam ()
|
|
|
|
getgrnam_r ()
|
|
|
|
getlogin ()
|
|
|
|
getlogin_r ()
|
|
|
|
getpwent ()
|
|
|
|
*getpwnam ()
|
|
|
|
*getpwnam_r ()
|
|
|
|
*getpwuid ()
|
|
|
|
*getpwuid_r ()
|
|
|
|
gets ()
|
|
|
|
getutxent ()
|
|
|
|
getutxid ()
|
|
|
|
getutxline ()
|
|
|
|
getw ()
|
|
|
|
getwc ()
|
|
|
|
getwchar ()
|
|
|
|
getwd ()
|
|
|
|
glob ()
|
|
|
|
iconv_close ()
|
|
|
|
iconv_open ()
|
|
|
|
ioctl ()
|
|
|
|
lseek ()
|
|
|
|
mkstemp ()
|
|
|
|
nftw ()
|
|
|
|
opendir ()
|
|
|
|
openlog ()
|
|
|
|
pclose ()
|
|
|
|
perror ()
|
|
|
|
popen ()
|
|
|
|
printf ()
|
|
|
|
putc ()
|
|
|
|
putc_unlocked ()
|
|
|
|
putchar ()
|
|
|
|
putchar_unlocked ()
|
|
|
|
puts ()
|
|
|
|
pututxline ()
|
|
|
|
putw ()
|
|
|
|
putwc ()
|
|
|
|
putwchar ()
|
|
|
|
readdir ()
|
|
|
|
readdir_r ()
|
|
|
|
remove ()
|
|
|
|
rename ()
|
|
|
|
rewind ()
|
|
|
|
rewinddir ()
|
|
|
|
scanf ()
|
|
|
|
seekdir ()
|
|
|
|
semop ()
|
|
|
|
setgrent ()
|
|
|
|
setpwent ()
|
|
|
|
setutxent ()
|
|
|
|
strerror ()
|
|
|
|
syslog ()
|
|
|
|
tmpfile ()
|
|
|
|
tmpnam ()
|
|
|
|
ttyname ()
|
|
|
|
ttyname_r ()
|
|
|
|
ungetc ()
|
|
|
|
ungetwc ()
|
|
|
|
unlink ()
|
|
|
|
vfprintf ()
|
|
|
|
vfwprintf ()
|
|
|
|
vprintf ()
|
|
|
|
vwprintf ()
|
|
|
|
wprintf ()
|
|
|
|
wscanf ()
|
|
|
|
|
|
|
|
Note, that for fcntl (), for any value of the cmd argument.
|
|
|
|
|
|
|
|
And we must not introduce cancellation points anywhere else that's part of the posix or
|
|
|
|
opengroup specs.
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::testcancel (void)
|
|
|
|
{
|
|
|
|
if (cancelstate == PTHREAD_CANCEL_DISABLE)
|
|
|
|
return;
|
|
|
|
|
2003-03-28 03:57:06 +08:00
|
|
|
if (WaitForSingleObject (cancel_event, 0) == WAIT_OBJECT_0)
|
2002-07-04 22:17:30 +08:00
|
|
|
cancel_self ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::static_cancel_self (void)
|
|
|
|
{
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread::self ()->cancel_self ();
|
2002-07-04 22:17:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-01-15 04:31:47 +08:00
|
|
|
DWORD
|
|
|
|
pthread::cancelable_wait (HANDLE object, DWORD timeout, const bool do_cancel)
|
2003-01-10 04:57:54 +08:00
|
|
|
{
|
|
|
|
DWORD res;
|
|
|
|
HANDLE wait_objects[2];
|
|
|
|
pthread_t thread = self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (&thread) || thread->cancelstate == PTHREAD_CANCEL_DISABLE)
|
2003-01-10 04:57:54 +08:00
|
|
|
return WaitForSingleObject (object, timeout);
|
|
|
|
|
|
|
|
// Do not change the wait order
|
|
|
|
// The object must have higher priority than the cancel event,
|
|
|
|
// because WaitForMultipleObjects will return the smallest index
|
|
|
|
// if both objects are signaled
|
|
|
|
wait_objects[0] = object;
|
|
|
|
wait_objects[1] = thread->cancel_event;
|
|
|
|
|
|
|
|
res = WaitForMultipleObjects (2, wait_objects, FALSE, timeout);
|
|
|
|
if (do_cancel && res == WAIT_CANCELED)
|
|
|
|
pthread::static_cancel_self ();
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2002-07-04 22:17:30 +08:00
|
|
|
int
|
|
|
|
pthread::setcancelstate (int state, int *oldstate)
|
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.lock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
|
|
|
if (state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE)
|
|
|
|
result = EINVAL;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (oldstate)
|
2002-09-17 00:09:54 +08:00
|
|
|
*oldstate = cancelstate;
|
2002-07-04 22:17:30 +08:00
|
|
|
cancelstate = state;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
pthread::setcanceltype (int type, int *oldtype)
|
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.lock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
|
|
|
if (type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS)
|
|
|
|
result = EINVAL;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (oldtype)
|
2002-09-17 00:09:54 +08:00
|
|
|
*oldtype = canceltype;
|
2002-07-04 22:17:30 +08:00
|
|
|
canceltype = type;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2002-06-10 09:10:45 +08:00
|
|
|
void
|
|
|
|
pthread::push_cleanup_handler (__pthread_cleanup_handler *handler)
|
|
|
|
{
|
|
|
|
if (this != self ())
|
|
|
|
// TODO: do it?
|
2002-09-17 00:09:54 +08:00
|
|
|
api_fatal ("Attempt to push a cleanup handler across threads");
|
2002-06-23 15:36:21 +08:00
|
|
|
handler->next = cleanup_stack;
|
2002-09-30 09:19:45 +08:00
|
|
|
InterlockedExchangePointer (&cleanup_stack, handler);
|
2002-06-10 09:10:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::pop_cleanup_handler (int const execute)
|
|
|
|
{
|
|
|
|
if (this != self ())
|
|
|
|
// TODO: send a signal or something to the thread ?
|
|
|
|
api_fatal ("Attempt to execute a cleanup handler across threads");
|
2002-09-17 00:09:54 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.lock ();
|
2002-07-04 22:17:30 +08:00
|
|
|
|
2002-06-23 15:36:21 +08:00
|
|
|
if (cleanup_stack != NULL)
|
2002-06-10 09:10:45 +08:00
|
|
|
{
|
2002-06-23 15:36:21 +08:00
|
|
|
__pthread_cleanup_handler *handler = cleanup_stack;
|
2002-06-10 09:10:45 +08:00
|
|
|
|
|
|
|
if (execute)
|
2002-09-17 00:09:54 +08:00
|
|
|
(*handler->function) (handler->arg);
|
2002-06-23 15:36:21 +08:00
|
|
|
cleanup_stack = handler->next;
|
2002-06-10 09:10:45 +08:00
|
|
|
}
|
2002-07-04 22:17:30 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex.unlock ();
|
2002-06-10 09:10:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
pthread::pop_all_cleanup_handlers ()
|
|
|
|
{
|
2002-06-23 15:36:21 +08:00
|
|
|
while (cleanup_stack != NULL)
|
2002-06-10 09:10:45 +08:00
|
|
|
pop_cleanup_handler (1);
|
|
|
|
}
|
|
|
|
|
2002-09-16 18:53:29 +08:00
|
|
|
void
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread::cancel_self ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
exit (PTHREAD_CANCELED);
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::get_thread_id ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
return thread_id;
|
|
|
|
}
|
|
|
|
|
2002-11-24 21:54:14 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::init_current_thread ()
|
2002-11-24 21:54:14 +08:00
|
|
|
{
|
|
|
|
cancel_event = ::CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
|
|
|
|
if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
|
2003-01-15 04:31:47 +08:00
|
|
|
GetCurrentProcess (), &win32_obj_id,
|
|
|
|
0, FALSE, DUPLICATE_SAME_ACCESS))
|
2002-11-24 21:54:14 +08:00
|
|
|
win32_obj_id = NULL;
|
2003-03-28 03:52:20 +08:00
|
|
|
set_thread_id_to_current ();
|
|
|
|
set_tls_self_pointer (this);
|
2002-11-24 21:54:14 +08:00
|
|
|
}
|
|
|
|
|
2003-06-25 04:14:01 +08:00
|
|
|
void
|
|
|
|
pthread::_fixup_after_fork ()
|
|
|
|
{
|
|
|
|
/* set thread to not running if it is not the forking thread */
|
|
|
|
if (this != pthread::self ())
|
|
|
|
{
|
|
|
|
magic = 0;
|
|
|
|
running = false;
|
|
|
|
win32_obj_id = NULL;
|
|
|
|
cancel_event = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-09-21 06:34:05 +08:00
|
|
|
/* static members */
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_attr::is_good_object (pthread_attr_t const *attr)
|
2002-09-21 06:34:05 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (attr, PTHREAD_ATTR_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* instance members */
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC),
|
2001-04-12 12:04:53 +08:00
|
|
|
joinable (PTHREAD_CREATE_JOINABLE), contentionscope (PTHREAD_SCOPE_PROCESS),
|
|
|
|
inheritsched (PTHREAD_INHERIT_SCHED), stacksize (0)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2001-04-12 12:04:53 +08:00
|
|
|
schedparam.sched_priority = 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread_attr::~pthread_attr ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-21 07:46:12 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_condattr::is_good_object (pthread_condattr_t const *attr)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (attr, PTHREAD_CONDATTR_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
pthread_condattr::pthread_condattr ():verifyable_object
|
|
|
|
(PTHREAD_CONDATTR_MAGIC), shared (PTHREAD_PROCESS_PRIVATE)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread_condattr::~pthread_condattr ()
|
|
|
|
{
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
List<pthread_cond> pthread_cond::conds;
|
|
|
|
|
2003-01-10 04:40:44 +08:00
|
|
|
/* This is used for cond creation protection within a single process only */
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex NO_COPY pthread_cond::cond_initialization_lock;
|
2003-01-10 04:40:44 +08:00
|
|
|
|
|
|
|
/* We can only be called once.
|
|
|
|
TODO: (no rush) use a non copied memory section to
|
|
|
|
hold an initialization flag. */
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::init_mutex ()
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!cond_initialization_lock.init ())
|
2003-01-10 04:40:44 +08:00
|
|
|
api_fatal ("Could not create win32 Mutex for pthread cond static initializer support.");
|
|
|
|
}
|
|
|
|
|
2003-03-19 03:49:38 +08:00
|
|
|
pthread_cond::pthread_cond (pthread_condattr *attr) :
|
|
|
|
verifyable_object (PTHREAD_COND_MAGIC),
|
2003-03-28 03:52:20 +08:00
|
|
|
shared (0), waiting (0), pending (0), sem_wait (NULL),
|
|
|
|
mtx_cond(NULL), next (NULL)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
pthread_mutex *verifyable_mutex_obj;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 03:49:38 +08:00
|
|
|
if (attr)
|
|
|
|
if (attr->shared != PTHREAD_PROCESS_PRIVATE)
|
|
|
|
{
|
2003-07-26 12:53:59 +08:00
|
|
|
magic = 0;
|
|
|
|
return;
|
2003-03-19 03:49:38 +08:00
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
verifyable_mutex_obj = &mtx_in;
|
|
|
|
if (!pthread_mutex::is_good_object (&verifyable_mutex_obj))
|
2001-05-07 06:23:43 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
thread_printf ("Internal cond mutex is not valid. this %p", this);
|
2001-06-26 22:57:33 +08:00
|
|
|
magic = 0;
|
2003-03-19 03:49:38 +08:00
|
|
|
return;
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
/*
|
|
|
|
* Change the mutex type to NORMAL.
|
|
|
|
* This mutex MUST be of type normal
|
|
|
|
*/
|
|
|
|
mtx_in.type = PTHREAD_MUTEX_NORMAL;
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
verifyable_mutex_obj = &mtx_out;
|
|
|
|
if (!pthread_mutex::is_good_object (&verifyable_mutex_obj))
|
2003-03-19 03:49:38 +08:00
|
|
|
{
|
|
|
|
thread_printf ("Internal cond mutex is not valid. this %p", this);
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* Change the mutex type to NORMAL to speed up mutex operations */
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_out.type = PTHREAD_MUTEX_NORMAL;
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
sem_wait = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL);
|
|
|
|
if (!sem_wait)
|
2003-03-19 03:49:38 +08:00
|
|
|
{
|
|
|
|
debug_printf ("CreateSemaphore failed. %E");
|
|
|
|
magic = 0;
|
|
|
|
return;
|
2001-05-07 06:23:43 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
conds.insert (this);
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread_cond::~pthread_cond ()
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (sem_wait)
|
|
|
|
CloseHandle (sem_wait);
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
conds.remove (this);
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::unblock (const bool all)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
unsigned long releaseable;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-07-26 12:53:59 +08:00
|
|
|
/*
|
2003-03-19 03:49:38 +08:00
|
|
|
* Block outgoing threads (and avoid simultanous unblocks)
|
2001-12-26 20:46:26 +08:00
|
|
|
*/
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_out.lock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
releaseable = waiting - pending;
|
|
|
|
if (releaseable)
|
2001-09-29 17:01:01 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
unsigned long released;
|
|
|
|
|
|
|
|
if (!pending)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Block incoming threads until all waiting threads are released.
|
|
|
|
*/
|
|
|
|
mtx_in.lock ();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Calculate releaseable again because threads can enter until
|
|
|
|
* the semaphore has been taken, but they can not leave, therefore pending
|
|
|
|
* is unchanged and releaseable can only get higher
|
|
|
|
*/
|
|
|
|
releaseable = waiting - pending;
|
|
|
|
}
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
released = all ? releaseable : 1;
|
|
|
|
pending += released;
|
|
|
|
/*
|
|
|
|
* Signal threads
|
|
|
|
*/
|
2003-03-28 03:52:20 +08:00
|
|
|
::ReleaseSemaphore (sem_wait, released, NULL);
|
2001-09-29 17:01:01 +08:00
|
|
|
}
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* And let the threads release.
|
|
|
|
*/
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_out.unlock ();
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::wait (pthread_mutex_t mutex, DWORD dwMilliseconds)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-04-21 22:23:47 +08:00
|
|
|
DWORD rv;
|
2003-01-10 04:50:23 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_in.lock ();
|
2003-03-28 03:57:06 +08:00
|
|
|
if (InterlockedIncrement ((long *)&waiting) == 1)
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_cond = mutex;
|
|
|
|
else if (mtx_cond != mutex)
|
2003-03-19 03:49:38 +08:00
|
|
|
{
|
|
|
|
InterlockedDecrement ((long *)&waiting);
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_in.unlock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
return EINVAL;
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_in.unlock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Release the mutex and wait on semaphore
|
2003-01-10 04:50:23 +08:00
|
|
|
*/
|
2003-03-19 03:49:38 +08:00
|
|
|
++mutex->condwaits;
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex->unlock ();
|
2001-09-12 12:47:47 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
rv = pthread::cancelable_wait (sem_wait, dwMilliseconds, false);
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_out.lock ();
|
2003-07-26 12:53:59 +08:00
|
|
|
|
2003-03-19 03:49:38 +08:00
|
|
|
if (rv != WAIT_OBJECT_0)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
/*
|
|
|
|
* It might happen that a signal is sent while the thread got canceled
|
|
|
|
* or timed out. Try to take one.
|
|
|
|
* If the thread gets one than a signal|broadcast is in progress.
|
2003-07-26 12:53:59 +08:00
|
|
|
*/
|
2003-03-28 03:57:06 +08:00
|
|
|
if (WaitForSingleObject (sem_wait, 0) == WAIT_OBJECT_0)
|
2003-07-26 12:53:59 +08:00
|
|
|
/*
|
|
|
|
* thread got cancelled ot timed out while a signalling is in progress.
|
|
|
|
* Set wait result back to signaled
|
|
|
|
*/
|
|
|
|
rv = WAIT_OBJECT_0;
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
InterlockedDecrement ((long *)&waiting);
|
|
|
|
|
2003-03-28 03:57:06 +08:00
|
|
|
if (rv == WAIT_OBJECT_0 && --pending == 0)
|
2003-03-19 03:49:38 +08:00
|
|
|
/*
|
|
|
|
* All signaled threads are released,
|
|
|
|
* new threads can enter Wait
|
|
|
|
*/
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_in.unlock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_out.unlock ();
|
2003-07-26 12:53:59 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex->lock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
--mutex->condwaits;
|
|
|
|
|
|
|
|
if (rv == WAIT_CANCELED)
|
|
|
|
pthread::static_cancel_self ();
|
|
|
|
else if (rv == WAIT_TIMEOUT)
|
|
|
|
return ETIMEDOUT;
|
|
|
|
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-09-11 16:15:39 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::_fixup_after_fork ()
|
2001-09-11 16:15:39 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
waiting = pending = 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_cond = NULL;
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
/* Unlock eventually locked mutexes */
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx_in.unlock ();
|
|
|
|
mtx_out.unlock ();
|
2003-03-19 03:49:38 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
sem_wait = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL);
|
|
|
|
if (!sem_wait)
|
|
|
|
api_fatal ("pthread_cond::_fixup_after_fork () failed to recreate win32 semaphore");
|
2001-09-11 16:15:39 +08:00
|
|
|
}
|
|
|
|
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlockattr::is_good_object (pthread_rwlockattr_t const *attr)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (attr, PTHREAD_RWLOCKATTR_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread_rwlockattr::pthread_rwlockattr ():verifyable_object
|
|
|
|
(PTHREAD_RWLOCKATTR_MAGIC), shared (PTHREAD_PROCESS_PRIVATE)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread_rwlockattr::~pthread_rwlockattr ()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
List<pthread_rwlock> pthread_rwlock::rwlocks;
|
|
|
|
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
/* This is used for rwlock creation protection within a single process only */
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex NO_COPY pthread_rwlock::rwlock_initialization_lock;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
/* We can only be called once.
|
|
|
|
TODO: (no rush) use a non copied memory section to
|
|
|
|
hold an initialization flag. */
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::init_mutex ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!rwlock_initialization_lock.init ())
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
api_fatal ("Could not create win32 Mutex for pthread rwlock static initializer support.");
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread_rwlock::pthread_rwlock (pthread_rwlockattr *attr) :
|
|
|
|
verifyable_object (PTHREAD_RWLOCK_MAGIC),
|
2003-03-28 03:52:20 +08:00
|
|
|
shared (0), waiting_readers (0), waiting_writers (0), writer (NULL),
|
|
|
|
readers (NULL), mtx (NULL), cond_readers (NULL), cond_writers (NULL),
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
next (NULL)
|
|
|
|
{
|
|
|
|
pthread_mutex *verifyable_mutex_obj = &mtx;
|
|
|
|
pthread_cond *verifyable_cond_obj;
|
|
|
|
|
|
|
|
if (attr)
|
|
|
|
if (attr->shared != PTHREAD_PROCESS_PRIVATE)
|
|
|
|
{
|
2003-07-26 12:53:59 +08:00
|
|
|
magic = 0;
|
|
|
|
return;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (&verifyable_mutex_obj))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
thread_printf ("Internal rwlock mutex is not valid. this %p", this);
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* Change the mutex type to NORMAL to speed up mutex operations */
|
|
|
|
mtx.type = PTHREAD_MUTEX_NORMAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
verifyable_cond_obj = &cond_readers;
|
|
|
|
if (!pthread_cond::is_good_object (&verifyable_cond_obj))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
thread_printf ("Internal rwlock readers cond is not valid. this %p", this);
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
verifyable_cond_obj = &cond_writers;
|
|
|
|
if (!pthread_cond::is_good_object (&verifyable_cond_obj))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
thread_printf ("Internal rwlock writers cond is not valid. this %p", this);
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlocks.insert (this);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
pthread_rwlock::~pthread_rwlock ()
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlocks.remove (this);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::rdlock ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
struct RWLOCK_READER *reader;
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.lock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (lookup_reader (self))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
result = EDEADLK;
|
|
|
|
goto DONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
reader = new struct RWLOCK_READER;
|
|
|
|
if (!reader)
|
|
|
|
{
|
|
|
|
result = EAGAIN;
|
|
|
|
goto DONE;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
while (writer || waiting_writers)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cleanup_push (pthread_rwlock::rdlock_cleanup, this);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
++waiting_readers;
|
|
|
|
cond_readers.wait (&mtx);
|
|
|
|
--waiting_readers;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
pthread_cleanup_pop (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
reader->thread = self;
|
2003-03-28 03:52:20 +08:00
|
|
|
add_reader (reader);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
DONE:
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::tryrdlock ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.lock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (writer || waiting_writers || lookup_reader (self))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
result = EBUSY;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
struct RWLOCK_READER *reader = new struct RWLOCK_READER;
|
|
|
|
if (reader)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
|
|
|
reader->thread = self;
|
|
|
|
add_reader (reader);
|
|
|
|
}
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
else
|
2003-07-26 12:53:59 +08:00
|
|
|
result = EAGAIN;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
2003-07-26 12:53:59 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::wrlock ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.lock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (writer == self || lookup_reader (self))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
result = EDEADLK;
|
|
|
|
goto DONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (writer || readers)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cleanup_push (pthread_rwlock::wrlock_cleanup, this);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
++waiting_writers;
|
|
|
|
cond_writers.wait (&mtx);
|
|
|
|
--waiting_writers;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
pthread_cleanup_pop (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
writer = self;
|
|
|
|
|
|
|
|
DONE:
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::trywrlock ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.lock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
if (writer || readers)
|
|
|
|
result = EBUSY;
|
|
|
|
else
|
|
|
|
writer = self;
|
2003-07-26 12:53:59 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::unlock ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.lock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
if (writer)
|
|
|
|
{
|
|
|
|
if (writer != self)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
|
|
|
result = EPERM;
|
|
|
|
goto DONE;
|
|
|
|
}
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
writer = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
struct RWLOCK_READER *reader = lookup_reader (self);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
if (!reader)
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
|
|
|
result = EPERM;
|
|
|
|
goto DONE;
|
|
|
|
}
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
remove_reader (reader);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
delete reader;
|
|
|
|
}
|
|
|
|
|
2003-04-16 04:14:12 +08:00
|
|
|
release ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
DONE:
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::add_reader (struct RWLOCK_READER *rd)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
rd->next = (struct RWLOCK_READER *)
|
|
|
|
InterlockedExchangePointer (&readers, rd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::remove_reader (struct RWLOCK_READER *rd)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
if (readers == rd)
|
|
|
|
InterlockedExchangePointer (&readers, rd->next);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
struct RWLOCK_READER *temp = readers;
|
|
|
|
while (temp->next && temp->next != rd)
|
|
|
|
temp = temp->next;
|
|
|
|
/* but there may be a race between the loop above and this statement */
|
|
|
|
InterlockedExchangePointer (&temp->next, rd->next);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct pthread_rwlock::RWLOCK_READER *
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::lookup_reader (pthread_t thread)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
struct RWLOCK_READER *temp = readers;
|
|
|
|
|
|
|
|
while (temp && temp->thread != thread)
|
|
|
|
temp = temp->next;
|
|
|
|
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::rdlock_cleanup (void *arg)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
pthread_rwlock *rwlock = (pthread_rwlock *) arg;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
--(rwlock->waiting_readers);
|
2003-04-16 04:14:12 +08:00
|
|
|
rwlock->release ();
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlock->mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::wrlock_cleanup (void *arg)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
pthread_rwlock *rwlock = (pthread_rwlock *) arg;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
--(rwlock->waiting_writers);
|
2003-04-16 04:14:12 +08:00
|
|
|
rwlock->release ();
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlock->mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::_fixup_after_fork ()
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
struct RWLOCK_READER **temp = &readers;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
waiting_readers = 0;
|
|
|
|
waiting_writers = 0;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
|
|
|
|
/* Unlock eventually locked mutex */
|
2003-03-28 03:52:20 +08:00
|
|
|
mtx.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
/*
|
|
|
|
* Remove all readers except self
|
|
|
|
*/
|
|
|
|
while (*temp)
|
|
|
|
{
|
|
|
|
if ((*temp)->thread == self)
|
2003-07-26 12:53:59 +08:00
|
|
|
temp = &((*temp)->next);
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
else
|
2003-07-26 12:53:59 +08:00
|
|
|
{
|
|
|
|
struct RWLOCK_READER *cur = *temp;
|
|
|
|
*temp = (*temp)->next;
|
|
|
|
delete cur;
|
|
|
|
}
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
/* pthread_key */
|
|
|
|
/* static members */
|
2002-10-01 05:06:05 +08:00
|
|
|
/* This stores pthread_key information across fork() boundaries */
|
|
|
|
List<pthread_key> pthread_key::keys;
|
2002-09-21 11:20:27 +08:00
|
|
|
|
2002-09-21 06:34:05 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_key::is_good_object (pthread_key_t const *key)
|
2002-09-21 06:34:05 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (key, PTHREAD_KEY_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
/* non-static members */
|
2001-09-11 16:15:39 +08:00
|
|
|
|
2002-09-21 09:59:46 +08:00
|
|
|
pthread_key::pthread_key (void (*aDestructor) (void *)):verifyable_object (PTHREAD_KEY_MAGIC), destructor (aDestructor)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
tls_index = TlsAlloc ();
|
|
|
|
if (tls_index == TLS_OUT_OF_INDEXES)
|
2001-03-21 10:17:58 +08:00
|
|
|
magic = 0;
|
2002-09-21 11:20:27 +08:00
|
|
|
else
|
2003-03-28 03:52:20 +08:00
|
|
|
keys.insert (this);
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread_key::~pthread_key ()
|
|
|
|
{
|
2002-09-21 11:20:27 +08:00
|
|
|
/* We may need to make the list code lock the list during operations
|
|
|
|
*/
|
2002-09-23 05:39:03 +08:00
|
|
|
if (magic != 0)
|
2002-09-17 17:12:36 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
keys.remove (this);
|
|
|
|
TlsFree (tls_index);
|
2002-09-17 17:12:36 +08:00
|
|
|
}
|
2001-04-23 10:56:19 +08:00
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
|
|
|
|
int
|
|
|
|
pthread_key::set (const void *value)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
/* the OS function doesn't perform error checking */
|
2003-03-28 03:52:20 +08:00
|
|
|
TlsSetValue (tls_index, (void *) value);
|
2001-03-21 10:17:58 +08:00
|
|
|
return 0;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
void *
|
2002-09-21 09:59:46 +08:00
|
|
|
pthread_key::get () const
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
int saved_error = ::GetLastError ();
|
|
|
|
void *result = TlsGetValue (tls_index);
|
|
|
|
::SetLastError (saved_error);
|
2002-09-17 18:01:49 +08:00
|
|
|
return result;
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_key::save_key_to_buffer ()
|
2002-09-17 17:12:36 +08:00
|
|
|
{
|
|
|
|
fork_buf = get ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_key::recreate_key_from_buffer ()
|
2002-09-17 17:12:36 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
tls_index = TlsAlloc ();
|
|
|
|
if (tls_index == TLS_OUT_OF_INDEXES)
|
|
|
|
api_fatal ("pthread_key::recreate_key_from_buffer () failed to reallocate Tls storage");
|
2002-09-17 17:12:36 +08:00
|
|
|
set (fork_buf);
|
|
|
|
}
|
|
|
|
|
2002-09-21 09:59:46 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_key::run_destructor ()
|
2002-09-21 09:59:46 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
if (destructor)
|
2002-09-27 23:08:50 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
void *oldValue = get ();
|
2002-09-27 23:08:50 +08:00
|
|
|
if (oldValue)
|
|
|
|
{
|
2003-01-15 04:31:47 +08:00
|
|
|
set (NULL);
|
|
|
|
destructor (oldValue);
|
2002-09-27 23:08:50 +08:00
|
|
|
}
|
|
|
|
}
|
2002-09-21 09:59:46 +08:00
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* pshared mutexs:
|
|
|
|
|
|
|
|
REMOVED FROM CURRENT. These can be reinstated with the daemon, when all the
|
|
|
|
gymnastics can be a lot easier.
|
|
|
|
|
|
|
|
the mutex_t (size 4) is not used as a verifyable object because we cannot
|
|
|
|
guarantee the same address space for all processes.
|
|
|
|
we use the following:
|
|
|
|
high bit set (never a valid address).
|
|
|
|
second byte is reserved for the priority.
|
|
|
|
third byte is reserved
|
|
|
|
fourth byte is the mutex id. (max 255 cygwin mutexs system wide).
|
|
|
|
creating mutex's does get slower and slower, but as creation is a one time
|
|
|
|
job, it should never become an issue
|
|
|
|
|
|
|
|
And if you're looking at this and thinking, why not an array in cygwin for all mutexs,
|
|
|
|
- you incur a penalty on _every_ mutex call and you have toserialise them all.
|
|
|
|
... Bad karma.
|
|
|
|
|
|
|
|
option 2? put everything in userspace and update the ABI?
|
|
|
|
- bad karma as well - the HANDLE, while identical across process's,
|
|
|
|
Isn't duplicated, it's reopened. */
|
2001-04-21 22:23:47 +08:00
|
|
|
|
2002-09-21 06:34:05 +08:00
|
|
|
/* static members */
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::is_good_object (pthread_mutex_t const *mutex)
|
2002-09-21 06:34:05 +08:00
|
|
|
{
|
2002-09-21 07:46:12 +08:00
|
|
|
if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != VALID_OBJECT)
|
2002-09-21 06:34:05 +08:00
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::is_good_initializer (pthread_mutex_t const *mutex)
|
2002-09-21 06:34:05 +08:00
|
|
|
{
|
2002-09-21 07:46:12 +08:00
|
|
|
if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER) != VALID_STATIC_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::is_good_initializer_or_object (pthread_mutex_t const *mutex)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER) == INVALID_OBJECT)
|
2002-09-21 06:34:05 +08:00
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2002-10-18 22:02:40 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::is_good_initializer_or_bad_object (pthread_mutex_t const *mutex)
|
2002-10-17 16:44:18 +08:00
|
|
|
{
|
2003-01-10 04:40:44 +08:00
|
|
|
verifyable_object_state objectState = verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER);
|
|
|
|
if (objectState == VALID_OBJECT)
|
2002-10-17 16:44:18 +08:00
|
|
|
return false;
|
2003-01-10 04:40:44 +08:00
|
|
|
return true;
|
2002-10-17 16:44:18 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 03:39:21 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::can_be_unlocked (pthread_mutex_t const *mutex)
|
2003-03-19 03:39:21 +08:00
|
|
|
{
|
|
|
|
pthread_t self = pthread::self ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (mutex))
|
2003-03-19 03:39:21 +08:00
|
|
|
return false;
|
|
|
|
/*
|
|
|
|
* Check if the mutex is owned by the current thread and can be unlocked
|
|
|
|
*/
|
2003-04-18 03:57:01 +08:00
|
|
|
return ((*mutex)->recursion_counter == 1 && pthread::equal ((*mutex)->owner, self));
|
2003-03-19 03:39:21 +08:00
|
|
|
}
|
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
List<pthread_mutex> pthread_mutex::mutexes;
|
|
|
|
|
2002-10-01 05:06:05 +08:00
|
|
|
/* This is used for mutex creation protection within a single process only */
|
2003-03-28 03:52:20 +08:00
|
|
|
native_mutex NO_COPY pthread_mutex::mutex_initialization_lock;
|
2002-09-30 07:47:45 +08:00
|
|
|
|
|
|
|
/* We can only be called once.
|
2002-09-30 09:19:45 +08:00
|
|
|
TODO: (no rush) use a non copied memory section to
|
|
|
|
hold an initialization flag. */
|
2002-09-30 07:47:45 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::init_mutex ()
|
2002-09-30 07:47:45 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!mutex_initialization_lock.init ())
|
2002-09-30 23:11:55 +08:00
|
|
|
api_fatal ("Could not create win32 Mutex for pthread mutex static initializer support.");
|
2002-09-30 07:47:45 +08:00
|
|
|
}
|
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
pthread_mutex::pthread_mutex (pthread_mutexattr *attr) :
|
|
|
|
verifyable_object (PTHREAD_MUTEX_MAGIC),
|
2003-03-19 03:39:21 +08:00
|
|
|
lock_counter (0),
|
2003-01-10 04:50:23 +08:00
|
|
|
win32_obj_id (NULL), recursion_counter (0),
|
|
|
|
condwaits (0), owner (NULL), type (PTHREAD_MUTEX_DEFAULT),
|
2003-01-15 04:31:47 +08:00
|
|
|
pshared (PTHREAD_PROCESS_PRIVATE)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL);
|
|
|
|
if (!win32_obj_id)
|
2001-04-21 22:23:47 +08:00
|
|
|
{
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
2003-01-10 04:50:23 +08:00
|
|
|
/*attr checked in the C call */
|
|
|
|
if (attr)
|
2001-09-12 11:18:05 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
if (attr->pshared == PTHREAD_PROCESS_SHARED)
|
2003-01-15 04:31:47 +08:00
|
|
|
{
|
|
|
|
// fail
|
|
|
|
magic = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
type = attr->mutextype;
|
2001-09-12 11:18:05 +08:00
|
|
|
}
|
2003-01-10 04:50:23 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutexes.insert (this);
|
2001-04-12 12:04:53 +08:00
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
|
|
|
|
pthread_mutex::~pthread_mutex ()
|
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
if (win32_obj_id)
|
|
|
|
CloseHandle (win32_obj_id);
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
mutexes.remove (this);
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::_lock (pthread_t self)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
int result = 0;
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-03-28 03:57:06 +08:00
|
|
|
if (InterlockedIncrement ((long *)&lock_counter) == 1)
|
2003-03-28 03:52:20 +08:00
|
|
|
set_owner (self);
|
2003-04-18 03:57:01 +08:00
|
|
|
else if (type != PTHREAD_MUTEX_NORMAL && pthread::equal (owner, self))
|
2001-09-12 11:18:05 +08:00
|
|
|
{
|
2003-03-19 03:39:21 +08:00
|
|
|
InterlockedDecrement ((long *) &lock_counter);
|
2003-03-28 03:57:06 +08:00
|
|
|
if (type == PTHREAD_MUTEX_RECURSIVE)
|
2003-03-28 03:52:20 +08:00
|
|
|
result = lock_recursive ();
|
2003-01-10 04:50:23 +08:00
|
|
|
else
|
2003-01-15 04:31:47 +08:00
|
|
|
result = EDEADLK;
|
2001-09-12 11:18:05 +08:00
|
|
|
}
|
2003-01-10 04:50:23 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
WaitForSingleObject (win32_obj_id, INFINITE);
|
2003-03-28 03:52:20 +08:00
|
|
|
set_owner (self);
|
2003-01-10 04:50:23 +08:00
|
|
|
}
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
return result;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::_trylock (pthread_t self)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
int result = 0;
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-09-25 11:51:51 +08:00
|
|
|
if (InterlockedCompareExchange ((long *) &lock_counter, 1, 0) == 0)
|
2003-03-28 03:52:20 +08:00
|
|
|
set_owner (self);
|
2003-04-18 03:57:01 +08:00
|
|
|
else if (type == PTHREAD_MUTEX_RECURSIVE && pthread::equal (owner, self))
|
2003-03-28 03:52:20 +08:00
|
|
|
result = lock_recursive ();
|
2003-01-10 04:50:23 +08:00
|
|
|
else
|
|
|
|
result = EBUSY;
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
return result;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::_unlock (pthread_t self)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-04-18 03:57:01 +08:00
|
|
|
if (!pthread::equal (owner, self))
|
2003-01-10 04:50:23 +08:00
|
|
|
return EPERM;
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-03-28 03:57:06 +08:00
|
|
|
if (--recursion_counter == 0)
|
2001-09-12 11:18:05 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
owner = NULL;
|
2003-03-19 03:39:21 +08:00
|
|
|
if (InterlockedDecrement ((long *)&lock_counter))
|
2003-01-15 04:31:47 +08:00
|
|
|
// Another thread is waiting
|
|
|
|
::ReleaseSemaphore (win32_obj_id, 1, NULL);
|
2001-09-12 11:18:05 +08:00
|
|
|
}
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::_destroy (pthread_t self)
|
2003-01-10 04:50:23 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (condwaits || _trylock (self))
|
2003-01-10 04:50:23 +08:00
|
|
|
// Do not destroy a condwaited or locked mutex
|
|
|
|
return EBUSY;
|
|
|
|
else if (recursion_counter != 1)
|
|
|
|
{
|
|
|
|
// Do not destroy a recursive locked mutex
|
|
|
|
--recursion_counter;
|
|
|
|
return EBUSY;
|
|
|
|
}
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
delete this;
|
|
|
|
return 0;
|
|
|
|
}
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2001-09-11 16:15:39 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutex::_fixup_after_fork ()
|
2001-09-11 16:15:39 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
debug_printf ("mutex %x in _fixup_after_fork", this);
|
2001-09-11 16:15:39 +08:00
|
|
|
if (pshared != PTHREAD_PROCESS_PRIVATE)
|
2003-03-28 03:52:20 +08:00
|
|
|
api_fatal ("pthread_mutex::_fixup_after_fork () doesn'tunderstand PROCESS_SHARED mutex's");
|
2003-01-10 04:50:23 +08:00
|
|
|
|
2003-03-28 03:57:06 +08:00
|
|
|
if (owner == NULL)
|
2003-01-10 04:50:23 +08:00
|
|
|
/* mutex has no owner, reset to initial */
|
|
|
|
lock_counter = 0;
|
2003-03-19 03:39:21 +08:00
|
|
|
else if (lock_counter != 0)
|
|
|
|
/* All waiting threads are gone after a fork */
|
|
|
|
lock_counter = 1;
|
2003-01-10 04:50:23 +08:00
|
|
|
|
|
|
|
win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL);
|
|
|
|
if (!win32_obj_id)
|
2003-03-28 03:52:20 +08:00
|
|
|
api_fatal ("pthread_mutex::_fixup_after_fork () failed to recreate win32 semaphore for mutex");
|
2003-01-10 04:50:23 +08:00
|
|
|
|
2001-09-12 11:18:05 +08:00
|
|
|
condwaits = 0;
|
2001-09-11 16:15:39 +08:00
|
|
|
}
|
|
|
|
|
2002-09-21 07:46:12 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_mutexattr::is_good_object (pthread_mutexattr_t const * attr)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (attr, PTHREAD_MUTEXATTR_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC),
|
|
|
|
pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_DEFAULT)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread_mutexattr::~pthread_mutexattr ()
|
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
}
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
List<semaphore> semaphore::semaphores;
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
semaphore::semaphore (int pshared, unsigned int value):verifyable_object (SEM_MAGIC)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-11-28 08:06:35 +08:00
|
|
|
this->win32_obj_id = ::CreateSemaphore (&sec_none_nih, value, LONG_MAX,
|
2002-09-30 23:05:00 +08:00
|
|
|
NULL);
|
2001-03-21 10:17:58 +08:00
|
|
|
if (!this->win32_obj_id)
|
|
|
|
magic = 0;
|
|
|
|
this->shared = pshared;
|
2001-09-11 16:15:39 +08:00
|
|
|
currentvalue = value;
|
2003-03-23 18:52:02 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphores.insert (this);
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
semaphore::~semaphore ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-03-21 10:17:58 +08:00
|
|
|
if (win32_obj_id)
|
|
|
|
CloseHandle (win32_obj_id);
|
2003-03-23 18:52:02 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphores.remove (this);
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphore::_post ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-09-11 16:15:39 +08:00
|
|
|
/* we can't use the currentvalue, because the wait functions don't let us access it */
|
|
|
|
ReleaseSemaphore (win32_obj_id, 1, NULL);
|
|
|
|
currentvalue++;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphore::_trywait ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
/* FIXME: signals should be able to interrupt semaphores...
|
2001-07-27 04:47:05 +08:00
|
|
|
*We probably need WaitForMultipleObjects here.
|
2001-03-21 10:17:58 +08:00
|
|
|
*/
|
|
|
|
if (WaitForSingleObject (win32_obj_id, 0) == WAIT_TIMEOUT)
|
2002-02-28 21:50:41 +08:00
|
|
|
{
|
|
|
|
set_errno (EAGAIN);
|
|
|
|
return -1;
|
|
|
|
}
|
2001-09-11 16:15:39 +08:00
|
|
|
currentvalue--;
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphore::_wait ()
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-01-10 04:57:54 +08:00
|
|
|
switch (pthread::cancelable_wait (win32_obj_id, INFINITE))
|
|
|
|
{
|
|
|
|
case WAIT_OBJECT_0:
|
|
|
|
currentvalue--;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
debug_printf ("cancelable_wait failed. %E");
|
|
|
|
return;
|
|
|
|
}
|
2001-09-11 16:15:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphore::_fixup_after_fork ()
|
2001-09-11 16:15:39 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
debug_printf ("sem %x in _fixup_after_fork", this);
|
2001-09-11 16:15:39 +08:00
|
|
|
if (shared != PTHREAD_PROCESS_PRIVATE)
|
2001-11-28 08:06:35 +08:00
|
|
|
api_fatal ("doesn't understand PROCESS_SHARED semaphores variables");
|
2001-09-11 16:15:39 +08:00
|
|
|
/* FIXME: duplicate code here and in the constructor. */
|
2001-11-28 08:06:35 +08:00
|
|
|
this->win32_obj_id = ::CreateSemaphore (&sec_none_nih, currentvalue, LONG_MAX, NULL);
|
2001-09-11 16:15:39 +08:00
|
|
|
if (!win32_obj_id)
|
2001-11-28 08:06:35 +08:00
|
|
|
api_fatal ("failed to create new win32 semaphore");
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
verifyable_object::verifyable_object (long verifyer):
|
|
|
|
magic (verifyer)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
verifyable_object::~verifyable_object ()
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2001-03-21 10:17:58 +08:00
|
|
|
magic = 0;
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Generic memory acccess routine - where should it live ? */
|
2001-03-21 10:17:58 +08:00
|
|
|
int __stdcall
|
2001-09-29 17:01:01 +08:00
|
|
|
check_valid_pointer (void const *pointer)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2001-09-29 17:01:01 +08:00
|
|
|
if (!pointer || IsBadWritePtr ((void *) pointer, sizeof (verifyable_object)))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EFAULT;
|
|
|
|
return 0;
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2001-09-29 17:01:01 +08:00
|
|
|
verifyable_object_state
|
|
|
|
verifyable_object_isvalid (void const * objectptr, long magic, void *static_ptr)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2001-09-25 19:45:26 +08:00
|
|
|
verifyable_object **object = (verifyable_object **)objectptr;
|
2001-03-21 10:17:58 +08:00
|
|
|
if (check_valid_pointer (object))
|
2001-09-29 17:01:01 +08:00
|
|
|
return INVALID_OBJECT;
|
2002-10-18 22:02:40 +08:00
|
|
|
if (static_ptr && *object == static_ptr)
|
|
|
|
return VALID_STATIC_OBJECT;
|
2001-09-29 17:01:01 +08:00
|
|
|
if (!*object)
|
|
|
|
return INVALID_OBJECT;
|
2001-09-25 19:45:26 +08:00
|
|
|
if (check_valid_pointer (*object))
|
2001-09-29 17:01:01 +08:00
|
|
|
return INVALID_OBJECT;
|
2001-09-25 19:45:26 +08:00
|
|
|
if ((*object)->magic != magic)
|
2001-09-29 17:01:01 +08:00
|
|
|
return INVALID_OBJECT;
|
|
|
|
return VALID_OBJECT;
|
|
|
|
}
|
|
|
|
|
|
|
|
verifyable_object_state
|
|
|
|
verifyable_object_isvalid (void const * objectptr, long magic)
|
|
|
|
{
|
|
|
|
return verifyable_object_isvalid (objectptr, magic, NULL);
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-09-20 10:43:18 +08:00
|
|
|
inline void
|
|
|
|
__reent_t::init_clib (struct _reent& var)
|
|
|
|
{
|
|
|
|
var = ((struct _reent) _REENT_INIT (var));
|
|
|
|
var._stdin = _GLOBAL_REENT->_stdin;
|
|
|
|
var._stdout = _GLOBAL_REENT->_stdout;
|
|
|
|
var._stderr = _GLOBAL_REENT->_stderr;
|
|
|
|
_clib = &var;
|
|
|
|
};
|
|
|
|
|
2001-07-27 04:47:05 +08:00
|
|
|
/* Pthreads */
|
2000-02-18 03:38:33 +08:00
|
|
|
void *
|
2002-06-10 10:40:13 +08:00
|
|
|
pthread::thread_init_wrapper (void *_arg)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-03-19 05:11:25 +08:00
|
|
|
// Setup the local/global storage of this thread
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
pthread *thread = (pthread *) _arg;
|
2000-02-18 03:38:33 +08:00
|
|
|
struct __reent_t local_reent;
|
|
|
|
struct _winsup_t local_winsup;
|
2003-09-20 10:43:18 +08:00
|
|
|
struct _reent local_clib;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
struct sigaction _sigs[NSIG];
|
2002-09-30 09:19:45 +08:00
|
|
|
sigset_t _sig_mask; /* one set for everything to ignore. */
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
// setup signal structures
|
2000-02-18 03:38:33 +08:00
|
|
|
thread->sigs = _sigs;
|
|
|
|
thread->sigmask = &_sig_mask;
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 08:37:18 +08:00
|
|
|
thread->sigtodo = NULL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
memset (&local_winsup, 0, sizeof (struct _winsup_t));
|
|
|
|
|
2003-09-20 10:43:18 +08:00
|
|
|
local_reent.init_clib (local_clib);
|
2000-02-18 03:38:33 +08:00
|
|
|
local_reent._winsup = &local_winsup;
|
|
|
|
|
|
|
|
local_winsup._process_logmask = LOG_UPTO (LOG_DEBUG);
|
|
|
|
|
2002-11-24 21:54:14 +08:00
|
|
|
MT_INTERFACE->reent_key.set (&local_reent);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
thread->set_thread_id_to_current ();
|
|
|
|
set_tls_self_pointer (thread);
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
thread->mutex.lock ();
|
2002-06-05 20:39:55 +08:00
|
|
|
// if thread is detached force cleanup on exit
|
2002-06-10 09:10:45 +08:00
|
|
|
if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL)
|
2002-11-24 21:54:14 +08:00
|
|
|
thread->joiner = thread;
|
2003-03-28 03:52:20 +08:00
|
|
|
thread->mutex.unlock ();
|
2002-06-05 20:39:55 +08:00
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
#ifdef _CYG_THREAD_FAILSAFE
|
|
|
|
if (_REENT == _impure_ptr)
|
|
|
|
system_printf ("local storage for thread isn't setup correctly");
|
|
|
|
#endif
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
thread_printf ("started thread %p %p %p %p %p %p", _arg, &local_clib,
|
|
|
|
_impure_ptr, thread, thread->function, thread->arg);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
// call the user's thread
|
2000-02-18 03:38:33 +08:00
|
|
|
void *ret = thread->function (thread->arg);
|
|
|
|
|
2002-07-04 22:17:30 +08:00
|
|
|
thread->exit (ret);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
#if 0
|
|
|
|
// ??? This code only runs if the thread exits by returning.
|
2001-04-23 10:56:19 +08:00
|
|
|
// it's all now in __pthread_exit ();
|
2001-03-21 10:17:58 +08:00
|
|
|
#endif
|
2002-09-30 09:19:45 +08:00
|
|
|
/* never reached */
|
2001-03-21 10:17:58 +08:00
|
|
|
return 0;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2002-09-16 18:53:29 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread::is_good_object (pthread_t const *thread)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (thread, PTHREAD_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned long
|
|
|
|
pthread::getsequence_np ()
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
return get_thread_id ();
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::create (pthread_t *thread, const pthread_attr_t *attr,
|
2001-03-21 10:17:58 +08:00
|
|
|
void *(*start_routine) (void *), void *arg)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-11-28 08:06:35 +08:00
|
|
|
DECLARE_TLS_STORAGE;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (attr && !pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*thread = new pthread ();
|
|
|
|
(*thread)->create (start_routine, attr ? *attr : NULL, arg);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (thread))
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-03-21 10:17:58 +08:00
|
|
|
delete (*thread);
|
|
|
|
*thread = NULL;
|
|
|
|
return EAGAIN;
|
2000-08-04 12:04:46 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::once (pthread_once_t *once_control, void (*init_routine) (void))
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2002-06-23 15:36:21 +08:00
|
|
|
// already done ?
|
|
|
|
if (once_control->state)
|
|
|
|
return 0;
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
pthread_mutex_lock (&once_control->mutex);
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Here we must set a cancellation handler to unlock the mutex if needed */
|
|
|
|
/* but a cancellation handler is not the right thing. We need this in the thread
|
2001-07-27 04:47:05 +08:00
|
|
|
*cleanup routine. Assumption: a thread can only be in one pthread_once routine
|
|
|
|
*at a time. Stote a mutex_t *in the pthread_structure. if that's non null unlock
|
|
|
|
*on pthread_exit ();
|
2001-04-12 12:04:53 +08:00
|
|
|
*/
|
2002-06-23 15:36:21 +08:00
|
|
|
if (!once_control->state)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
|
|
|
init_routine ();
|
|
|
|
once_control->state = 1;
|
|
|
|
}
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Here we must remove our cancellation handler */
|
2001-04-12 12:04:53 +08:00
|
|
|
pthread_mutex_unlock (&once_control->mutex);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::cancel (pthread_t thread)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (&thread))
|
2001-04-12 12:04:53 +08:00
|
|
|
return ESRCH;
|
|
|
|
|
2002-07-04 22:17:30 +08:00
|
|
|
return thread->cancel ();
|
2001-04-12 12:04:53 +08:00
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Races in pthread_atfork:
|
|
|
|
We are race safe in that any additions to the lists are made via
|
|
|
|
InterlockedExchangePointer.
|
|
|
|
However, if the user application doesn't perform syncronisation of some sort
|
|
|
|
It's not guaranteed that a near simultaneous call to pthread_atfork and fork
|
|
|
|
will result in the new atfork handlers being calls.
|
|
|
|
More rigorous internal syncronisation isn't needed as the user program isn't
|
|
|
|
guaranteeing their own state.
|
|
|
|
|
|
|
|
as far as multiple calls to pthread_atfork, the worst case is simultaneous calls
|
|
|
|
will result in an indeterminate order for parent and child calls (what gets inserted
|
|
|
|
first isn't guaranteed.)
|
|
|
|
|
|
|
|
There is one potential race... Does the result of InterlockedExchangePointer
|
|
|
|
get committed to the return location _before_ any context switches can occur?
|
|
|
|
If yes, we're safe, if no, we're not. */
|
2001-04-13 23:28:20 +08:00
|
|
|
void
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread::atforkprepare (void)
|
2001-04-13 23:28:20 +08:00
|
|
|
{
|
2002-09-17 17:12:36 +08:00
|
|
|
MT_INTERFACE->fixup_before_fork ();
|
|
|
|
|
2001-04-23 10:56:19 +08:00
|
|
|
callback *cb = MT_INTERFACE->pthread_prepare;
|
2001-04-13 23:28:20 +08:00
|
|
|
while (cb)
|
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
cb->cb ();
|
|
|
|
cb = cb->next;
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-04-23 10:56:19 +08:00
|
|
|
void
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread::atforkparent (void)
|
2001-04-13 23:28:20 +08:00
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
callback *cb = MT_INTERFACE->pthread_parent;
|
2001-04-13 23:28:20 +08:00
|
|
|
while (cb)
|
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
cb->cb ();
|
|
|
|
cb = cb->next;
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2002-09-17 17:12:36 +08:00
|
|
|
pthread::atforkchild (void)
|
2001-04-13 23:28:20 +08:00
|
|
|
{
|
2002-09-17 17:12:36 +08:00
|
|
|
MT_INTERFACE->fixup_after_fork ();
|
|
|
|
|
2001-04-23 10:56:19 +08:00
|
|
|
callback *cb = MT_INTERFACE->pthread_child;
|
2001-04-13 23:28:20 +08:00
|
|
|
while (cb)
|
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
cb->cb ();
|
|
|
|
cb = cb->next;
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Register a set of functions to run before and after fork.
|
|
|
|
prepare calls are called in LI-FC order.
|
|
|
|
parent and child calls are called in FI-FC order. */
|
2001-04-13 23:28:20 +08:00
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::atfork (void (*prepare)(void), void (*parent)(void), void (*child)(void))
|
2001-04-13 23:28:20 +08:00
|
|
|
{
|
2001-07-27 04:47:05 +08:00
|
|
|
callback *prepcb = NULL, *parentcb = NULL, *childcb = NULL;
|
2001-04-13 23:28:20 +08:00
|
|
|
if (prepare)
|
|
|
|
{
|
|
|
|
prepcb = new callback;
|
|
|
|
if (!prepcb)
|
|
|
|
return ENOMEM;
|
|
|
|
}
|
|
|
|
if (parent)
|
|
|
|
{
|
|
|
|
parentcb = new callback;
|
|
|
|
if (!parentcb)
|
|
|
|
{
|
|
|
|
if (prepcb)
|
|
|
|
delete prepcb;
|
|
|
|
return ENOMEM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (child)
|
|
|
|
{
|
|
|
|
childcb = new callback;
|
|
|
|
if (!childcb)
|
|
|
|
{
|
|
|
|
if (prepcb)
|
|
|
|
delete prepcb;
|
|
|
|
if (parentcb)
|
|
|
|
delete parentcb;
|
|
|
|
return ENOMEM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prepcb)
|
|
|
|
{
|
|
|
|
prepcb->cb = prepare;
|
2001-12-02 13:23:26 +08:00
|
|
|
prepcb->next = (callback *) InterlockedExchangePointer ((LONG *) &MT_INTERFACE->pthread_prepare, (long int) prepcb);
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
if (parentcb)
|
|
|
|
{
|
|
|
|
parentcb->cb = parent;
|
2001-07-27 04:47:05 +08:00
|
|
|
callback **t = &MT_INTERFACE->pthread_parent;
|
2001-04-13 23:28:20 +08:00
|
|
|
while (*t)
|
|
|
|
t = &(*t)->next;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* t = pointer to last next in the list */
|
2001-12-02 13:23:26 +08:00
|
|
|
parentcb->next = (callback *) InterlockedExchangePointer ((LONG *) t, (long int) parentcb);
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
if (childcb)
|
|
|
|
{
|
|
|
|
childcb->cb = child;
|
2001-07-27 04:47:05 +08:00
|
|
|
callback **t = &MT_INTERFACE->pthread_child;
|
2001-04-13 23:28:20 +08:00
|
|
|
while (*t)
|
|
|
|
t = &(*t)->next;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* t = pointer to last next in the list */
|
2001-12-02 13:23:26 +08:00
|
|
|
childcb->next = (callback *) InterlockedExchangePointer ((LONG *) t, (long int) childcb);
|
2001-04-13 23:28:20 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_init (pthread_attr_t *attr)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-06-12 03:08:42 +08:00
|
|
|
if (pthread_attr::is_good_object (attr))
|
2003-06-13 02:15:34 +08:00
|
|
|
return EBUSY;
|
2003-06-12 03:08:42 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*attr = new pthread_attr;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*attr);
|
|
|
|
*attr = NULL;
|
2003-06-12 03:08:42 +08:00
|
|
|
return ENOMEM;
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getinheritsched (const pthread_attr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *inheritsched)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*inheritsched = (*attr)->inheritsched;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getschedparam (const pthread_attr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
struct sched_param *param)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*param = (*attr)->schedparam;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* From a pure code point of view, this should call a helper in sched.cc,
|
|
|
|
to allow for someone adding scheduler policy changes to win32 in the future.
|
|
|
|
However that's extremely unlikely, so short and sweet will do us */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*policy = SCHED_FIFO;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getscope (const pthread_attr_t *attr, int *contentionscope)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*contentionscope = (*attr)->contentionscope;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
if (detachstate < 0 || detachstate > 1)
|
|
|
|
return EINVAL;
|
|
|
|
(*attr)->joinable = detachstate;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
*detachstate = (*attr)->joinable;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setinheritsched (pthread_attr_t *attr, int inheritsched)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
if (inheritsched != PTHREAD_INHERIT_SCHED
|
|
|
|
&& inheritsched != PTHREAD_EXPLICIT_SCHED)
|
|
|
|
return ENOTSUP;
|
|
|
|
(*attr)->inheritsched = inheritsched;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setschedparam (pthread_attr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
const struct sched_param *param)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
if (!valid_sched_parameters (param))
|
|
|
|
return ENOTSUP;
|
|
|
|
(*attr)->schedparam = *param;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* See __pthread_attr_getschedpolicy for some notes */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
if (policy != SCHED_FIFO)
|
|
|
|
return ENOTSUP;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setscope (pthread_attr_t *attr, int contentionscope)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
if (contentionscope != PTHREAD_SCOPE_SYSTEM
|
|
|
|
&& contentionscope != PTHREAD_SCOPE_PROCESS)
|
|
|
|
return EINVAL;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* In future, we may be able to support system scope by escalating the thread
|
|
|
|
priority to exceed the priority class. For now we only support PROCESS scope. */
|
2001-04-12 12:04:53 +08:00
|
|
|
if (contentionscope != PTHREAD_SCOPE_PROCESS)
|
|
|
|
return ENOTSUP;
|
|
|
|
(*attr)->contentionscope = contentionscope;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_setstacksize (pthread_attr_t *attr, size_t size)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
(*attr)->stacksize = size;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *size)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
*size = (*attr)->stacksize;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_attr_destroy (pthread_attr_t *attr)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_attr::is_good_object (attr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
delete (*attr);
|
|
|
|
*attr = NULL;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::join (pthread_t *thread, void **return_val)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread_t joiner = self ();
|
2002-06-05 20:39:55 +08:00
|
|
|
|
2003-01-10 04:57:54 +08:00
|
|
|
joiner->testcancel ();
|
2002-11-24 21:54:14 +08:00
|
|
|
|
2002-06-23 15:36:21 +08:00
|
|
|
// Initialize return val with NULL
|
|
|
|
if (return_val)
|
|
|
|
*return_val = NULL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (&joiner))
|
2003-01-10 04:57:54 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (thread))
|
2001-03-21 10:17:58 +08:00
|
|
|
return ESRCH;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-04-18 03:57:01 +08:00
|
|
|
if (equal (*thread,joiner))
|
2002-06-23 15:36:21 +08:00
|
|
|
return EDEADLK;
|
2002-06-05 20:39:55 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.lock ();
|
2002-06-10 10:40:13 +08:00
|
|
|
|
2002-09-17 17:12:36 +08:00
|
|
|
if ((*thread)->attr.joinable == PTHREAD_CREATE_DETACHED)
|
2002-06-05 20:39:55 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.unlock ();
|
2002-06-10 10:40:13 +08:00
|
|
|
return EINVAL;
|
2002-06-05 20:39:55 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
else
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2002-06-05 20:39:55 +08:00
|
|
|
(*thread)->joiner = joiner;
|
2002-06-10 09:10:45 +08:00
|
|
|
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.unlock ();
|
2001-04-21 22:23:47 +08:00
|
|
|
|
2003-01-10 04:57:54 +08:00
|
|
|
switch (cancelable_wait ((*thread)->win32_obj_id, INFINITE, false))
|
2003-01-15 04:31:47 +08:00
|
|
|
{
|
|
|
|
case WAIT_OBJECT_0:
|
|
|
|
if (return_val)
|
|
|
|
*return_val = (*thread)->return_ptr;
|
|
|
|
delete (*thread);
|
|
|
|
break;
|
|
|
|
case WAIT_CANCELED:
|
|
|
|
// set joined thread back to joinable since we got canceled
|
|
|
|
(*thread)->joiner = NULL;
|
|
|
|
(*thread)->attr.joinable = PTHREAD_CREATE_JOINABLE;
|
|
|
|
joiner->cancel_self ();
|
|
|
|
// never reached
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
// should never happen
|
|
|
|
return EINVAL;
|
|
|
|
}
|
2003-01-10 04:57:54 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::detach (pthread_t *thread)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (thread))
|
2001-03-21 10:17:58 +08:00
|
|
|
return ESRCH;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.lock ();
|
2001-04-12 12:04:53 +08:00
|
|
|
if ((*thread)->attr.joinable == PTHREAD_CREATE_DETACHED)
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.unlock ();
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-06-10 10:40:13 +08:00
|
|
|
// check if thread is still alive
|
2003-06-25 04:14:01 +08:00
|
|
|
if ((*thread)->running && WaitForSingleObject ((*thread)->win32_obj_id, 0) == WAIT_TIMEOUT)
|
2002-06-10 10:40:13 +08:00
|
|
|
{
|
|
|
|
// force cleanup on exit
|
|
|
|
(*thread)->joiner = *thread;
|
|
|
|
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.unlock ();
|
2002-06-10 10:40:13 +08:00
|
|
|
}
|
|
|
|
else
|
2002-06-23 15:36:21 +08:00
|
|
|
{
|
|
|
|
// thread has already terminated.
|
2003-03-28 03:52:20 +08:00
|
|
|
(*thread)->mutex.unlock ();
|
2002-06-10 10:40:13 +08:00
|
|
|
delete (*thread);
|
2002-06-23 15:36:21 +08:00
|
|
|
}
|
2002-06-05 20:39:55 +08:00
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::suspend (pthread_t *thread)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (thread))
|
2001-03-21 10:17:58 +08:00
|
|
|
return ESRCH;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if ((*thread)->suspended == false)
|
|
|
|
{
|
|
|
|
(*thread)->suspended = true;
|
|
|
|
SuspendThread ((*thread)->win32_obj_id);
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
pthread::resume (pthread_t *thread)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (thread))
|
2001-03-21 10:17:58 +08:00
|
|
|
return ESRCH;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if ((*thread)->suspended == true)
|
|
|
|
ResumeThread ((*thread)->win32_obj_id);
|
|
|
|
(*thread)->suspended = false;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* provided for source level compatability.
|
|
|
|
See http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html
|
|
|
|
*/
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_getconcurrency (void)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
|
|
|
return MT_INTERFACE->concurrency;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* keep this in sync with sched.cc */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_getschedparam (pthread_t thread, int *policy,
|
2001-04-12 12:04:53 +08:00
|
|
|
struct sched_param *param)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread::is_good_object (&thread))
|
2001-04-12 12:04:53 +08:00
|
|
|
return ESRCH;
|
|
|
|
*policy = SCHED_FIFO;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* we don't return the current effective priority, we return the current
|
|
|
|
requested priority */
|
2001-04-12 12:04:53 +08:00
|
|
|
*param = thread->attr.schedparam;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Thread SpecificData */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_key_create (pthread_key_t *key, void (*destructor) (void *))
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
/* The opengroup docs don't define if we should check this or not,
|
|
|
|
but creation is relatively rare. */
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_key::is_good_object (key))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EBUSY;
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
*key = new pthread_key (destructor);
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_key::is_good_object (key))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*key);
|
|
|
|
*key = NULL;
|
|
|
|
return EAGAIN;
|
|
|
|
}
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_key_delete (pthread_key_t key)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_key::is_good_object (&key))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
delete (key);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* provided for source level compatability. See
|
|
|
|
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html
|
|
|
|
*/
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_setconcurrency (int new_level)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
|
|
|
if (new_level < 0)
|
|
|
|
return EINVAL;
|
|
|
|
MT_INTERFACE->concurrency = new_level;
|
2001-03-21 10:17:58 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* keep syncronised with sched.cc */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_setschedparam (pthread_t thread, int policy,
|
2001-04-12 12:04:53 +08:00
|
|
|
const struct sched_param *param)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread::is_good_object (&thread))
|
2001-04-12 12:04:53 +08:00
|
|
|
return ESRCH;
|
|
|
|
if (policy != SCHED_FIFO)
|
|
|
|
return ENOTSUP;
|
|
|
|
if (!param)
|
|
|
|
return EINVAL;
|
|
|
|
int rv =
|
|
|
|
sched_set_thread_priority (thread->win32_obj_id, param->sched_priority);
|
|
|
|
if (!rv)
|
|
|
|
thread->attr.schedparam.sched_priority = param->sched_priority;
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_setspecific (pthread_key_t key, const void *value)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_key::is_good_object (&key))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
(key)->set (value);
|
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" void *
|
|
|
|
pthread_getspecific (pthread_key_t key)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_key::is_good_object (&key))
|
2001-03-21 10:17:58 +08:00
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return (key)->get ();
|
|
|
|
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Thread synchronisation */
|
2002-09-21 07:46:12 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::is_good_object (pthread_cond_t const *cond)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::is_good_initializer (pthread_cond_t const *cond)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) != VALID_STATIC_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::is_good_initializer_or_object (pthread_cond_t const *cond)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) == INVALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2003-01-10 04:40:44 +08:00
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_cond::is_good_initializer_or_bad_object (pthread_cond_t const *cond)
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
|
|
|
verifyable_object_state objectState = verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER);
|
|
|
|
if (objectState == VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_cond_destroy (pthread_cond_t *cond)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_cond::is_good_initializer (cond))
|
2001-11-15 19:10:38 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_cond::is_good_object (cond))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* reads are atomic */
|
2001-03-21 10:17:58 +08:00
|
|
|
if ((*cond)->waiting)
|
|
|
|
return EBUSY;
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
delete (*cond);
|
|
|
|
*cond = NULL;
|
2001-03-17 09:14:58 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-01-10 04:40:44 +08:00
|
|
|
pthread_cond::init (pthread_cond_t *cond, const pthread_condattr_t *attr)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (attr && !pthread_condattr::is_good_object (attr))
|
2001-03-17 09:14:58 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!cond_initialization_lock.lock ())
|
2003-01-10 04:40:44 +08:00
|
|
|
return EINVAL;
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_initializer_or_bad_object (cond))
|
2003-01-10 04:40:44 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
cond_initialization_lock.unlock ();
|
2003-01-10 04:40:44 +08:00
|
|
|
return EBUSY;
|
|
|
|
}
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*cond = new pthread_cond (attr ? (*attr) : NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (cond))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*cond);
|
|
|
|
*cond = NULL;
|
2003-03-28 03:52:20 +08:00
|
|
|
cond_initialization_lock.unlock ();
|
2001-03-21 10:17:58 +08:00
|
|
|
return EAGAIN;
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
cond_initialization_lock.unlock ();
|
2001-03-21 10:17:58 +08:00
|
|
|
return 0;
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_cond_broadcast (pthread_cond_t *cond)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_cond::is_good_initializer (cond))
|
2003-03-19 03:49:38 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_cond::is_good_object (cond))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2001-03-19 05:11:25 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*cond)->unblock (true);
|
2001-03-17 09:14:58 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_cond_signal (pthread_cond_t *cond)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_cond::is_good_initializer (cond))
|
2003-03-19 03:49:38 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_cond::is_good_object (cond))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2001-03-17 09:14:58 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*cond)->unblock (false);
|
2001-03-17 09:14:58 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 03:49:38 +08:00
|
|
|
static int
|
2001-09-29 17:01:01 +08:00
|
|
|
__pthread_cond_dowait (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
2003-03-19 03:49:38 +08:00
|
|
|
DWORD waitlength)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (mutex))
|
2003-03-19 03:49:38 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::can_be_unlocked (mutex))
|
2003-03-19 03:49:38 +08:00
|
|
|
return EPERM;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_cond::is_good_initializer (cond))
|
2003-01-10 04:40:44 +08:00
|
|
|
pthread_cond::init (cond, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_cond::is_good_object (cond))
|
2001-03-17 09:14:58 +08:00
|
|
|
return EINVAL;
|
2001-06-26 22:47:48 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*cond)->wait (*mutex, waitlength);
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2001-09-29 17:01:01 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
|
|
|
const struct timespec *abstime)
|
2001-03-19 05:11:25 +08:00
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
struct timeval tv;
|
|
|
|
long waitlength;
|
|
|
|
|
|
|
|
pthread_testcancel ();
|
|
|
|
|
2001-11-28 08:06:35 +08:00
|
|
|
if (check_valid_pointer (abstime))
|
2001-03-19 05:11:25 +08:00
|
|
|
return EINVAL;
|
2003-03-19 03:49:38 +08:00
|
|
|
|
|
|
|
gettimeofday (&tv, NULL);
|
|
|
|
waitlength = abstime->tv_sec * 1000 + abstime->tv_nsec / (1000 * 1000);
|
|
|
|
waitlength -= tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
2001-09-29 17:01:01 +08:00
|
|
|
if (waitlength < 0)
|
|
|
|
return ETIMEDOUT;
|
|
|
|
return __pthread_cond_dowait (cond, mutex, waitlength);
|
|
|
|
}
|
2001-03-21 10:17:58 +08:00
|
|
|
|
2001-09-29 17:01:01 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
|
|
|
|
{
|
2003-03-19 03:49:38 +08:00
|
|
|
pthread_testcancel ();
|
|
|
|
|
2001-09-29 17:01:01 +08:00
|
|
|
return __pthread_cond_dowait (cond, mutex, INFINITE);
|
2001-03-17 09:14:58 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_condattr_init (pthread_condattr_t *condattr)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-06-12 03:08:42 +08:00
|
|
|
if (pthread_condattr::is_good_object (condattr))
|
2003-06-13 02:15:34 +08:00
|
|
|
return EBUSY;
|
2003-06-12 03:08:42 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*condattr = new pthread_condattr;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_condattr::is_good_object (condattr))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*condattr);
|
|
|
|
*condattr = NULL;
|
2003-06-12 03:08:42 +08:00
|
|
|
return ENOMEM;
|
2001-03-21 10:17:58 +08:00
|
|
|
}
|
2001-03-17 09:14:58 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_condattr::is_good_object (attr))
|
2001-03-17 09:14:58 +08:00
|
|
|
return EINVAL;
|
2001-03-21 10:17:58 +08:00
|
|
|
*pshared = (*attr)->shared;
|
2001-03-17 09:14:58 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_condattr::is_good_object (attr))
|
2001-03-17 09:14:58 +08:00
|
|
|
return EINVAL;
|
2001-03-21 10:17:58 +08:00
|
|
|
if ((pshared < 0) || (pshared > 1))
|
|
|
|
return EINVAL;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* shared cond vars not currently supported */
|
2001-04-21 22:23:47 +08:00
|
|
|
if (pshared != PTHREAD_PROCESS_PRIVATE)
|
|
|
|
return EINVAL;
|
2001-03-21 10:17:58 +08:00
|
|
|
(*attr)->shared = pshared;
|
2001-03-17 09:14:58 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_condattr_destroy (pthread_condattr_t *condattr)
|
2001-03-17 09:14:58 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_condattr::is_good_object (condattr))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
delete (*condattr);
|
|
|
|
*condattr = NULL;
|
2001-03-17 09:14:58 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
/* RW locks */
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::is_good_object (pthread_rwlock_t const *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::is_good_initializer (pthread_rwlock_t const *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER) != VALID_STATIC_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::is_good_initializer_or_object (pthread_rwlock_t const *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER) == INVALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_rwlock::is_good_initializer_or_bad_object (pthread_rwlock_t const *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
verifyable_object_state objectState = verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER);
|
|
|
|
if (objectState == VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
|
|
|
if ((*rwlock)->writer || (*rwlock)->readers ||
|
2003-03-28 03:52:20 +08:00
|
|
|
(*rwlock)->waiting_readers || (*rwlock)->waiting_writers)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EBUSY;
|
|
|
|
|
|
|
|
delete (*rwlock);
|
|
|
|
*rwlock = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
pthread_rwlock::init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (attr && !pthread_rwlockattr::is_good_object (attr))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!rwlock_initialization_lock.lock ())
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_initializer_or_bad_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlock_initialization_lock.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EBUSY;
|
|
|
|
}
|
|
|
|
|
|
|
|
*rwlock = new pthread_rwlock (attr ? (*attr) : NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
delete (*rwlock);
|
|
|
|
*rwlock = NULL;
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlock_initialization_lock.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EAGAIN;
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
rwlock_initialization_lock.unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
pthread_testcancel ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
pthread_rwlock::init (rwlock, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*rwlock)->rdlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
pthread_rwlock::init (rwlock, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*rwlock)->tryrdlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
pthread_testcancel ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
pthread_rwlock::init (rwlock, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*rwlock)->wrlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
pthread_rwlock::init (rwlock, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*rwlock)->trywrlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_rwlock::is_good_initializer (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlock::is_good_object (rwlock))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*rwlock)->unlock ();
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-06-12 03:08:42 +08:00
|
|
|
if (pthread_rwlockattr::is_good_object (rwlockattr))
|
2003-06-13 02:15:34 +08:00
|
|
|
return EBUSY;
|
2003-06-12 03:08:42 +08:00
|
|
|
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
*rwlockattr = new pthread_rwlockattr;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlockattr::is_good_object (rwlockattr))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
|
|
|
delete (*rwlockattr);
|
|
|
|
*rwlockattr = NULL;
|
2003-06-12 03:08:42 +08:00
|
|
|
return ENOMEM;
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlockattr::is_good_object (attr))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
*pshared = (*attr)->shared;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlockattr::is_good_object (attr))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
if ((pshared < 0) || (pshared > 1))
|
|
|
|
return EINVAL;
|
|
|
|
/* shared rwlock vars not currently supported */
|
|
|
|
if (pshared != PTHREAD_PROCESS_PRIVATE)
|
|
|
|
return EINVAL;
|
|
|
|
(*attr)->shared = pshared;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr)
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_rwlockattr::is_good_object (rwlockattr))
|
* cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* include/cygwin/version.h: Bump API minor number.
* include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a
reasonable value.
Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init,
pthread_rwlock_rdlock, pthread_rwlock_tryrdlock,
pthread_rwlock_wrlock, pthread_rwlock_trywrlock,
pthread_rwlock_unlock, pthread_rwlockattr_init,
pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared,
and pthread_rwlockattr_destroy.
* thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon.
(PTHREAD_RWLOCK_MAGIC): New define.
(PTHREAD_RWLOCKATTR_MAGIC): Ditto.
(pthread_rwlockattr): New class.
(pthread_rwlock): Ditto.
(MTinterface::rwlocks): New member.
(MTinterface::MTinterface): Initialize rwlocks.
Add prototypes for __pthread_rwlock_destroy,
__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
__pthread_rwlock_unlock, __pthread_rwlockattr_init,
__pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared,
and __pthread_rwlockattr_destroy.
* thread.cc (MTinterface::Init): Initialize rwlock internal mutex.
(MTinterface::fixup_after_fork): Fixup rwlocks after fork.
(pthread_rwlockattr::isGoodObject): Implement.
(pthread_rwlockattr::pthread_rwlockattr): Ditto.
(pthread_rwlockattr::~pthread_rwlockattr): Ditto.
(pthread_rwlock::initMutex): Ditto.
(pthread_rwlock::pthread_rwlock): Ditto.
(pthread_rwlock::~pthread_rwlock): Ditto.
(pthread_rwlock::RdLock): Ditto.
(pthread_rwlock::TryRdLock): Ditto.
(pthread_rwlock::WrLock): Ditto.
(pthread_rwlock::TryWrLock): Ditto.
(pthread_rwlock::UnLock): Ditto.
(pthread_rwlock::addReader): Ditto.
(pthread_rwlock::removeReader): Ditto.
(pthread_rwlock::lookupReader): Ditto.
(pthread_rwlock::RdLockCleanup): Ditto.
(pthread_rwlock::WrLockCleanup): Ditto.
(pthread_rwlock::fixup_after_fork): Ditto.
(pthread_rwlock::isGoodObject): Ditto.
(pthread_rwlock::isGoodInitializer): Ditto.
(pthread_rwlock::isGoodInitializerOrObject): Ditto.
(pthread_rwlock::isGoodInitializerOrBadObject): Ditto.
(__pthread_rwlock_destroy): Ditto.
(pthread_rwlock::init): Ditto.
(__pthread_rwlock_rdlock): Ditto.
(__pthread_rwlock_tryrdlock): Ditto.
(__pthread_rwlock_wrlock): Ditto.
(__pthread_rwlock_trywrlock): Ditto.
2003-03-19 04:01:07 +08:00
|
|
|
return EINVAL;
|
|
|
|
delete (*rwlockattr);
|
|
|
|
*rwlockattr = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Thread signal */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_kill (pthread_t thread, int sig)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
// lock myself, for the use of thread2signal
|
2001-09-10 06:39:35 +08:00
|
|
|
// two different kills might clash: FIXME
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread::is_good_object (&thread))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
|
|
|
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 08:37:18 +08:00
|
|
|
#if 0
|
2001-04-12 12:04:53 +08:00
|
|
|
if (thread->sigs)
|
|
|
|
myself->setthread2signal (thread);
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 08:37:18 +08:00
|
|
|
#endif
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-10-20 12:15:50 +08:00
|
|
|
int rval = raise (sig);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
// unlock myself
|
2000-02-18 03:38:33 +08:00
|
|
|
return rval;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_sigmask (int operation, const sigset_t *set, sigset_t *old_set)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 08:37:18 +08:00
|
|
|
#if 0
|
2002-06-10 09:10:45 +08:00
|
|
|
pthread *thread = pthread::self ();
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
// lock this myself, for the use of thread2signal
|
|
|
|
// two differt kills might clash: FIXME
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if (thread->sigs)
|
|
|
|
myself->setthread2signal (thread);
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 08:37:18 +08:00
|
|
|
#endif
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int rval = sigprocmask (operation, set, old_set);
|
|
|
|
|
2001-03-19 05:11:25 +08:00
|
|
|
// unlock this myself
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
return rval;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-07-27 04:47:05 +08:00
|
|
|
/* ID */
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
extern "C" int
|
2003-03-19 04:12:05 +08:00
|
|
|
pthread_equal (pthread_t t1, pthread_t t2)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-04-18 03:57:01 +08:00
|
|
|
return pthread::equal (t1, t2);
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Mutexes */
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-30 07:56:57 +08:00
|
|
|
/* FIXME: there's a potential race with PTHREAD_MUTEX_INITALIZER:
|
|
|
|
the mutex is not actually inited until the first use.
|
|
|
|
So two threads trying to lock/trylock may collide.
|
|
|
|
Solution: we need a global mutex on mutex creation, or possibly simply
|
|
|
|
on all constructors that allow INITIALIZER macros.
|
|
|
|
the lock should be very small: only around the init routine, not
|
|
|
|
every test, or all mutex access will be synchronised. */
|
2001-04-12 12:04:53 +08:00
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
int
|
2002-09-30 07:47:45 +08:00
|
|
|
pthread_mutex::init (pthread_mutex_t *mutex,
|
2001-07-27 04:47:05 +08:00
|
|
|
const pthread_mutexattr_t *attr)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (attr && !pthread_mutexattr::is_good_object (attr) || check_valid_pointer (mutex))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!mutex_initialization_lock.lock ())
|
2002-09-30 19:43:43 +08:00
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_initializer_or_bad_object (mutex))
|
2002-09-30 07:47:45 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex_initialization_lock.unlock ();
|
2002-09-30 07:47:45 +08:00
|
|
|
return EBUSY;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*mutex = new pthread_mutex (attr ? (*attr) : NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (mutex))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*mutex);
|
|
|
|
*mutex = NULL;
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex_initialization_lock.unlock ();
|
2001-03-21 10:17:58 +08:00
|
|
|
return EAGAIN;
|
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
mutex_initialization_lock.unlock ();
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutex_getprioceiling (const pthread_mutex_t *mutex,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *prioceiling)
|
|
|
|
{
|
2001-11-28 08:06:35 +08:00
|
|
|
pthread_mutex_t *themutex = (pthread_mutex_t *) mutex;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2002-09-30 07:47:45 +08:00
|
|
|
pthread_mutex::init ((pthread_mutex_t *) mutex, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (themutex))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* We don't define _POSIX_THREAD_PRIO_PROTECT because we do't currently support
|
|
|
|
mutex priorities.
|
|
|
|
|
|
|
|
We can support mutex priorities in the future though:
|
|
|
|
Store a priority with each mutex.
|
|
|
|
When the mutex is optained, set the thread priority as appropriate
|
|
|
|
When the mutex is released, reset the thread priority. */
|
2001-04-12 12:04:53 +08:00
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2003-03-23 18:52:02 +08:00
|
|
|
extern "C" int
|
2003-03-19 04:12:05 +08:00
|
|
|
pthread_mutex_lock (pthread_mutex_t *mutex)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
pthread_mutex_t *themutex = mutex;
|
2003-03-28 03:52:20 +08:00
|
|
|
/* This could be simplified via is_good_initializer_or_object
|
|
|
|
and is_good_initializer, but in a performance critical call like this....
|
2002-09-30 09:19:45 +08:00
|
|
|
no. */
|
2001-09-29 17:01:01 +08:00
|
|
|
switch (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER))
|
2001-09-25 19:45:26 +08:00
|
|
|
{
|
2001-09-29 17:01:01 +08:00
|
|
|
case INVALID_OBJECT:
|
|
|
|
return EINVAL;
|
|
|
|
break;
|
|
|
|
case VALID_STATIC_OBJECT:
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2001-11-05 14:09:15 +08:00
|
|
|
{
|
2002-09-30 07:47:45 +08:00
|
|
|
int rv = pthread_mutex::init (mutex, NULL);
|
2002-09-30 09:19:45 +08:00
|
|
|
if (rv && rv != EBUSY)
|
2001-09-29 17:01:01 +08:00
|
|
|
return rv;
|
2001-11-05 14:09:15 +08:00
|
|
|
}
|
2002-09-30 07:47:45 +08:00
|
|
|
/* No else needed. If it's been initialized while we waited,
|
2002-09-30 23:05:00 +08:00
|
|
|
we can just attempt to lock it */
|
2001-09-29 17:01:01 +08:00
|
|
|
break;
|
|
|
|
case VALID_OBJECT:
|
|
|
|
break;
|
2001-09-25 19:45:26 +08:00
|
|
|
}
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*themutex)->lock ();
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutex_trylock (pthread_mutex_t *mutex)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
pthread_mutex_t *themutex = mutex;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2002-09-30 07:47:45 +08:00
|
|
|
pthread_mutex::init (mutex, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (themutex))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*themutex)->trylock ();
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutex_unlock (pthread_mutex_t *mutex)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2002-09-30 07:47:45 +08:00
|
|
|
pthread_mutex::init (mutex, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (mutex))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*mutex)->unlock ();
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutex_destroy (pthread_mutex_t *mutex)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-10 04:50:23 +08:00
|
|
|
int rv;
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2001-04-12 12:04:53 +08:00
|
|
|
return 0;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (mutex))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
rv = (*mutex)->destroy ();
|
2003-01-10 04:50:23 +08:00
|
|
|
if (rv)
|
|
|
|
return rv;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*mutex = NULL;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prioceiling,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *old_ceiling)
|
|
|
|
{
|
2001-04-23 10:56:19 +08:00
|
|
|
pthread_mutex_t *themutex = mutex;
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutex::is_good_initializer (mutex))
|
2002-09-30 07:47:45 +08:00
|
|
|
pthread_mutex::init (mutex, NULL);
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutex::is_good_object (themutex))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Win32 doesn't support mutex priorities - see __pthread_mutex_getprioceiling
|
|
|
|
for more detail */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_getprotocol (const pthread_mutexattr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *protocol)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *pshared)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*pshared = (*attr)->pshared;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_gettype (const pthread_mutexattr_t *attr, int *type)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
*type = (*attr)->mutextype;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
/* FIXME: write and test process shared mutex's. */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_init (pthread_mutexattr_t *attr)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (pthread_mutexattr::is_good_object (attr))
|
2003-06-13 02:15:34 +08:00
|
|
|
return EBUSY;
|
2001-04-12 12:04:53 +08:00
|
|
|
|
|
|
|
*attr = new pthread_mutexattr ();
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
|
|
|
delete (*attr);
|
|
|
|
*attr = NULL;
|
|
|
|
return ENOMEM;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_destroy (pthread_mutexattr_t *attr)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
delete (*attr);
|
|
|
|
*attr = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Win32 doesn't support mutex priorities */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, int protocol)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Win32 doesn't support mutex priorities */
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
int prioceiling)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *attr,
|
2001-04-12 12:04:53 +08:00
|
|
|
int *prioceiling)
|
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
2002-09-30 09:19:45 +08:00
|
|
|
/* we don't use pshared for anything as yet. We need to test PROCESS_SHARED
|
2001-07-27 04:47:05 +08:00
|
|
|
*functionality
|
2001-04-12 12:04:53 +08:00
|
|
|
*/
|
2001-09-10 06:39:35 +08:00
|
|
|
if (pshared != PTHREAD_PROCESS_PRIVATE)
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
|
|
|
(*attr)->pshared = pshared;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-19 04:12:05 +08:00
|
|
|
/* see pthread_mutex_gettype */
|
|
|
|
extern "C" int
|
|
|
|
pthread_mutexattr_settype (pthread_mutexattr_t *attr, int type)
|
2001-04-12 12:04:53 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!pthread_mutexattr::is_good_object (attr))
|
2001-04-12 12:04:53 +08:00
|
|
|
return EINVAL;
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2003-01-10 04:50:23 +08:00
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case PTHREAD_MUTEX_ERRORCHECK:
|
|
|
|
case PTHREAD_MUTEX_RECURSIVE:
|
2003-03-19 03:39:21 +08:00
|
|
|
case PTHREAD_MUTEX_NORMAL:
|
2003-01-10 04:50:23 +08:00
|
|
|
(*attr)->mutextype = type;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
2001-04-12 12:04:53 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* Semaphores */
|
2002-09-21 07:46:12 +08:00
|
|
|
|
|
|
|
/* static members */
|
|
|
|
bool
|
2003-03-28 03:52:20 +08:00
|
|
|
semaphore::is_good_object (sem_t const * sem)
|
2002-09-21 07:46:12 +08:00
|
|
|
{
|
|
|
|
if (verifyable_object_isvalid (sem, SEM_MAGIC) != VALID_OBJECT)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2000-02-18 03:38:33 +08:00
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
semaphore::init (sem_t *sem, int pshared, unsigned int value)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-09-30 09:19:45 +08:00
|
|
|
/* opengroup calls this undefined */
|
2003-03-28 03:52:20 +08:00
|
|
|
if (is_good_object (sem))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EBUSY;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
if (value > SEM_VALUE_MAX)
|
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
*sem = new semaphore (pshared, value);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (sem))
|
2001-03-21 10:17:58 +08:00
|
|
|
{
|
|
|
|
delete (*sem);
|
|
|
|
*sem = NULL;
|
|
|
|
return EAGAIN;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
semaphore::destroy (sem_t *sem)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (sem))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2002-09-30 09:19:45 +08:00
|
|
|
/* FIXME - new feature - test for busy against threads... */
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2001-03-21 10:17:58 +08:00
|
|
|
delete (*sem);
|
|
|
|
*sem = NULL;
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
semaphore::wait (sem_t *sem)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-10 04:57:54 +08:00
|
|
|
pthread_testcancel ();
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (sem))
|
2002-02-28 21:50:41 +08:00
|
|
|
{
|
|
|
|
set_errno (EINVAL);
|
|
|
|
return -1;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*sem)->_wait ();
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
semaphore::trywait (sem_t *sem)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (sem))
|
2002-02-28 21:50:41 +08:00
|
|
|
{
|
|
|
|
set_errno (EINVAL);
|
|
|
|
return -1;
|
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
return (*sem)->_trywait ();
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
int
|
2002-09-21 11:59:58 +08:00
|
|
|
semaphore::post (sem_t *sem)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-03-28 03:52:20 +08:00
|
|
|
if (!is_good_object (sem))
|
2001-03-21 10:17:58 +08:00
|
|
|
return EINVAL;
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
(*sem)->_post ();
|
2000-02-18 03:38:33 +08:00
|
|
|
return 0;
|
2000-10-17 07:55:58 +08:00
|
|
|
}
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
/* pthread_null */
|
2002-09-16 18:53:29 +08:00
|
|
|
pthread *
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::get_null_pthread ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
/* because of weird entry points */
|
|
|
|
_instance.magic = 0;
|
|
|
|
return &_instance;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::pthread_null ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
2002-11-24 21:54:14 +08:00
|
|
|
attr.joinable = PTHREAD_CREATE_DETACHED;
|
2002-09-16 18:53:29 +08:00
|
|
|
/* Mark ourselves as invalid */
|
|
|
|
magic = 0;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::~pthread_null ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::create (void *(*)(void *), pthread_attr *, void *)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::exit (void *value_ptr)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
2002-11-24 21:54:14 +08:00
|
|
|
ExitThread (0);
|
2002-09-16 18:53:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::cancel ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::testcancel ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::setcancelstate (int state, int *oldstate)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::setcanceltype (int type, int *oldtype)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::push_cleanup_handler (__pthread_cleanup_handler *handler)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::pop_cleanup_handler (int const execute)
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
}
|
2003-01-15 04:31:47 +08:00
|
|
|
|
2002-09-16 18:53:29 +08:00
|
|
|
unsigned long
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null::getsequence_np ()
|
2002-09-16 18:53:29 +08:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-28 03:52:20 +08:00
|
|
|
pthread_null pthread_null::_instance;
|