diff options
| author | rpj <rpj> | 2002-01-31 06:56:03 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2002-01-31 06:56:03 +0000 | 
| commit | 75f8ad67d45d48b9cdde5a298083881790c76c73 (patch) | |
| tree | 0d793e00b40a3292f1fee2b302eb6eccdf15d113 /rwlock.c | |
| parent | 30a1e9738593302fa26e0a668f517bc7f5800190 (diff) | |
2002-01-27  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * mutex.c (pthread_mutex_timedlock): New function suggested by
        Alexander Terekhov. The logic required to implement this
        properly came from Alexander, with some collaboration
        with Thomas Pfaff.
        (pthread_mutex_unlock): Wrap the waiters check and sema
        post in a critical section to prevent a race with
        pthread_mutex_timedlock.
        (ptw32_timed_semwait): New function;
        returns a special result if the absolute timeout parameter
        represents a time already passed when called; used by
        pthread_mutex_timedwait(). Have deliberately not reused
        the name "ptw32_sem_timedwait" because they are not the same
        routine.
        * condvar.c (ptw32_cond_timedwait): Use the new sem_timedwait()
        instead of ptw32_sem_timedwait(), which now has a different
        function. See previous.
        * implement.h: Remove prototype for ptw32_sem_timedwait.
        See next.
        (pthread_mutex_t_): Add critical section element for access
        to lock_idx during mutex post-timeout processing.
        * semaphore.h (sem_timedwait): See next.
        * semaphore.c (sem_timedwait): See next.
        * private.c (ptw32_sem_timedwait): Move to semaphore.c
        and rename as sem_timedwait().
2002-01-18  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * sync.c (pthread_join): Was getting the exit code from the
        calling thread rather than the joined thread if
        defined(__MINGW32__) && !defined(__MSVCRT__).
2002-01-15  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * pthread.h: Unless the build explicitly defines __CLEANUP_SEH,
        __CLEANUP_CXX, or __CLEANUP_C, then the build defaults to
        __CLEANUP_C style cleanup. This style uses setjmp/longjmp
        in the cancelation and thread exit implementations and therefore
        won't do stack unwinding if linked to applications that have it
        (e.g. C++ apps). This is currently consistent with most/all
        commercial Unix POSIX threads implementations.
        * spin.c (pthread_spin_init): Edit renamed function call.
        * nonportable.c (pthread_num_processors_np): New.
        (pthread_getprocessors_np): Renamed to ptw32_getprocessors
        and moved to private.c.
        * private.c (pthread_getprocessors): Moved here from
        nonportable.c.
        * pthread.def (pthread_getprocessors_np): Removed
        from export list.
        * rwlock.c (pthread_rwlockattr_init): New.
        (pthread_rwlockattr_destroy): New.
        (pthread_rwlockattr_getpshared): New.
        (pthread_rwlockattr_setpshared): New.
Diffstat (limited to 'rwlock.c')
| -rw-r--r-- | rwlock.c | 231 | 
1 files changed, 231 insertions, 0 deletions
| @@ -254,6 +254,237 @@ pthread_rwlock_destroy(pthread_rwlock_t *rwlock)      return ((result != 0) ? result : ((result1 != 0) ? result1 : result2));  } + +int +pthread_rwlockattr_init (pthread_rwlockattr_t * attr) +     /* +      * ------------------------------------------------------ +      * DOCPUBLIC +      *      Initializes a rwlock attributes object with default +      *      attributes. +      * +      * PARAMETERS +      *      attr +      *              pointer to an instance of pthread_rwlockattr_t +      * +      * +      * DESCRIPTION +      *      Initializes a rwlock attributes object with default +      *      attributes. +      * +      * RESULTS +      *              0               successfully initialized attr, +      *              ENOMEM          insufficient memory for attr. +      * +      * ------------------------------------------------------ +      */ +{ +  int result = 0; +  pthread_rwlockattr_t rwa; + +  rwa = (pthread_rwlockattr_t) calloc (1, sizeof (*rwa)); + +  if (rwa == NULL) +    { +      result = ENOMEM; +    } +  else +    { +      rwa->pshared = PTHREAD_PROCESS_PRIVATE; +    } + +  *attr = rwa; + +  return(result); +}                               /* pthread_rwlockattr_init */ + + +int +pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr) +     /* +      * ------------------------------------------------------ +      * DOCPUBLIC +      *      Destroys a rwlock attributes object. The object can +      *      no longer be used. +      * +      * PARAMETERS +      *      attr +      *              pointer to an instance of pthread_rwlockattr_t +      * +      * +      * DESCRIPTION +      *      Destroys a rwlock attributes object. The object can +      *      no longer be used. +      * +      *      NOTES: +      *              1)      Does not affect rwlockss created using 'attr' +      * +      * RESULTS +      *              0               successfully released attr, +      *              EINVAL          'attr' is invalid. +      * +      * ------------------------------------------------------ +      */ +{ +  int result = 0; + +  if (attr == NULL || *attr == NULL) +    { +      result = EINVAL; +    } +  else +    { +      pthread_rwlockattr_t rwa = *attr; + +      *attr = NULL; +      free (rwa); +    } + +  return(result); +}                               /* pthread_rwlockattr_destroy */ + + +int +pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, +                               int *pshared) +     /* +      * ------------------------------------------------------ +      * DOCPUBLIC +      *      Determine whether rwlocks created with 'attr' can be +      *      shared between processes. +      * +      * PARAMETERS +      *      attr +      *              pointer to an instance of pthread_rwlockattr_t +      * +      *      pshared +      *              will be set to one of: +      * +      *                      PTHREAD_PROCESS_SHARED +      *                              May be shared if in shared memory +      * +      *                      PTHREAD_PROCESS_PRIVATE +      *                              Cannot be shared. +      * +      * +      * DESCRIPTION +      *      Rwlocks creatd with 'attr' can be shared between +      *      processes if pthread_rwlock_t variable is allocated +      *      in memory shared by these processes. +      *      NOTES: +      *              1)      pshared rwlocks MUST be allocated in shared +      *                      memory. +      *              2)      The following macro is defined if shared rwlocks +      *                      are supported: +      *                              _POSIX_THREAD_PROCESS_SHARED +      * +      * RESULTS +      *              0               successfully retrieved attribute, +      *              EINVAL          'attr' is invalid, +      * +      * ------------------------------------------------------ +      */ +{ +  int result; + +  if ((attr != NULL && *attr != NULL) && +      (pshared != NULL)) +    { +      *pshared = (*attr)->pshared; +      result = 0; +    } +  else +    { +      result = EINVAL; +    } + +  return (result); + +}                               /* pthread_rwlockattr_getpshared */ + + +int +pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, +			      int pshared) +     /* +      * ------------------------------------------------------ +      * DOCPUBLIC +      *      Rwlocks created with 'attr' can be shared between +      *      processes if pthread_rwlock_t variable is allocated +      *      in memory shared by these processes. +      * +      * PARAMETERS +      *      attr +      *              pointer to an instance of pthread_rwlockattr_t +      * +      *      pshared +      *              must be one of: +      * +      *                      PTHREAD_PROCESS_SHARED +      *                              May be shared if in shared memory +      * +      *                      PTHREAD_PROCESS_PRIVATE +      *                              Cannot be shared. +      * +      * DESCRIPTION +      *      Rwlocks creatd with 'attr' can be shared between +      *      processes if pthread_rwlock_t variable is allocated +      *      in memory shared by these processes. +      * +      *      NOTES: +      *              1)      pshared rwlocks MUST be allocated in shared +      *                      memory. +      * +      *              2)      The following macro is defined if shared rwlocks +      *                      are supported: +      *                              _POSIX_THREAD_PROCESS_SHARED +      * +      * RESULTS +      *              0               successfully set attribute, +      *              EINVAL          'attr' or pshared is invalid, +      *              ENOSYS          PTHREAD_PROCESS_SHARED not supported, +      * +      * ------------------------------------------------------ +      */ +{ +  int result; + +  if ((attr != NULL && *attr != NULL) && +      ((pshared == PTHREAD_PROCESS_SHARED) || +       (pshared == PTHREAD_PROCESS_PRIVATE))) +    { +      if (pshared == PTHREAD_PROCESS_SHARED) +        { + +#if !defined( _POSIX_THREAD_PROCESS_SHARED ) + +          result = ENOSYS; +          pshared = PTHREAD_PROCESS_PRIVATE; + +#else + +          result = 0; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + +        } +      else +        { +          result = 0; +        } + +      (*attr)->pshared = pshared; +    } +  else +    { +      result = EINVAL; +    } + +  return (result); + +}                               /* pthread_rwlockattr_setpshared */ + +  int  pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)  { | 
