summaryrefslogtreecommitdiff
path: root/components/libc/pthreads/pthread_rwlock.c
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-10-17 17:19:12 -0400
committerMeco Man <[email protected]>2021-10-17 17:19:12 -0400
commitb513d37cf2fc33c2dd20021316533feaac0bef23 (patch)
treef14e24d145a40620dbb8fd5a5d807b972ec4a1d5 /components/libc/pthreads/pthread_rwlock.c
parent9fe546b0d86b17c64e57447913c8a9f3a9c40534 (diff)
[libc][posix] create 'posix' folder and move related files into it
Diffstat (limited to 'components/libc/pthreads/pthread_rwlock.c')
-rw-r--r--components/libc/pthreads/pthread_rwlock.c340
1 files changed, 0 insertions, 340 deletions
diff --git a/components/libc/pthreads/pthread_rwlock.c b/components/libc/pthreads/pthread_rwlock.c
deleted file mode 100644
index 1c2fe19f5f..0000000000
--- a/components/libc/pthreads/pthread_rwlock.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2010-10-26 Bernard the first version
- */
-
-#include <pthread.h>
-
-int pthread_rwlockattr_init(pthread_rwlockattr_t *attr)
-{
- if (!attr)
- return EINVAL;
- *attr = PTHREAD_PROCESS_PRIVATE;
-
- return 0;
-}
-RTM_EXPORT(pthread_rwlockattr_init);
-
-int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr)
-{
- if (!attr)
- return EINVAL;
-
- return 0;
-}
-RTM_EXPORT(pthread_rwlockattr_destroy);
-
-int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr,
- int *pshared)
-{
- if (!attr || !pshared)
- return EINVAL;
-
- *pshared = PTHREAD_PROCESS_PRIVATE;
-
- return 0;
-}
-RTM_EXPORT(pthread_rwlockattr_getpshared);
-
-int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared)
-{
- if (!attr || pshared != PTHREAD_PROCESS_PRIVATE)
- return EINVAL;
-
- return 0;
-}
-RTM_EXPORT(pthread_rwlockattr_setpshared);
-
-int pthread_rwlock_init(pthread_rwlock_t *rwlock,
- const pthread_rwlockattr_t *attr)
-{
- if (!rwlock)
- return EINVAL;
-
- rwlock->attr = PTHREAD_PROCESS_PRIVATE;
- pthread_mutex_init(&(rwlock->rw_mutex), NULL);
- pthread_cond_init(&(rwlock->rw_condreaders), NULL);
- pthread_cond_init(&(rwlock->rw_condwriters), NULL);
-
- rwlock->rw_nwaitwriters = 0;
- rwlock->rw_nwaitreaders = 0;
- rwlock->rw_refcount = 0;
-
- return 0;
-}
-RTM_EXPORT(pthread_rwlock_init);
-
-int pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- return 0; /* rwlock is not initialized */
-
- if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- if (rwlock->rw_refcount != 0 ||
- rwlock->rw_nwaitreaders != 0 ||
- rwlock->rw_nwaitwriters != 0)
- {
- result = EBUSY;
-
- return result;
- }
- else
- {
- /* check whether busy */
- result = rt_sem_trytake(&(rwlock->rw_condreaders.sem));
- if (result == RT_EOK)
- {
- result = rt_sem_trytake(&(rwlock->rw_condwriters.sem));
- if (result == RT_EOK)
- {
- rt_sem_release(&(rwlock->rw_condreaders.sem));
- rt_sem_release(&(rwlock->rw_condwriters.sem));
-
- pthread_cond_destroy(&rwlock->rw_condreaders);
- pthread_cond_destroy(&rwlock->rw_condwriters);
- }
- else
- {
- rt_sem_release(&(rwlock->rw_condreaders.sem));
- result = EBUSY;
- }
- }
- else
- result = EBUSY;
- }
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
- if (result == 0)
- pthread_mutex_destroy(&rwlock->rw_mutex);
-
- return result;
-}
-RTM_EXPORT(pthread_rwlock_destroy);
-
-int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- /* give preference to waiting writers */
- while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
- {
- rwlock->rw_nwaitreaders++;
- /* rw_mutex will be released when waiting for rw_condreaders */
- result = pthread_cond_wait(&rwlock->rw_condreaders, &rwlock->rw_mutex);
- /* rw_mutex should have been taken again when returned from waiting */
- rwlock->rw_nwaitreaders--;
- if (result != 0) /* wait error */
- break;
- }
-
- /* another reader has a read lock */
- if (result == 0)
- rwlock->rw_refcount++;
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return (result);
-}
-RTM_EXPORT(pthread_rwlock_rdlock);
-
-int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- if (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
- result = EBUSY; /* held by a writer or waiting writers */
- else
- rwlock->rw_refcount++; /* increment count of reader locks */
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return(result);
-}
-RTM_EXPORT(pthread_rwlock_tryrdlock);
-
-int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock,
- const struct timespec *abstime)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- /* give preference to waiting writers */
- while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
- {
- rwlock->rw_nwaitreaders++;
- /* rw_mutex will be released when waiting for rw_condreaders */
- result = pthread_cond_timedwait(&rwlock->rw_condreaders, &rwlock->rw_mutex, abstime);
- /* rw_mutex should have been taken again when returned from waiting */
- rwlock->rw_nwaitreaders--;
- if (result != 0)
- break;
- }
-
- /* another reader has a read lock */
- if (result == 0)
- rwlock->rw_refcount++;
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return (result);
-}
-RTM_EXPORT(pthread_rwlock_timedrdlock);
-
-int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock,
- const struct timespec *abstime)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- while (rwlock->rw_refcount != 0)
- {
- rwlock->rw_nwaitwriters++;
- /* rw_mutex will be released when waiting for rw_condwriters */
- result = pthread_cond_timedwait(&rwlock->rw_condwriters, &rwlock->rw_mutex, abstime);
- /* rw_mutex should have been taken again when returned from waiting */
- rwlock->rw_nwaitwriters--;
-
- if (result != 0)
- break;
- }
-
- if (result == 0)
- rwlock->rw_refcount = -1;
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return(result);
-}
-RTM_EXPORT(pthread_rwlock_timedwrlock);
-
-int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- if (rwlock->rw_refcount != 0)
- result = EBUSY; /* held by either writer or reader(s) */
- else
- rwlock->rw_refcount = -1; /* available, indicate a writer has it */
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return(result);
-}
-RTM_EXPORT(pthread_rwlock_trywrlock);
-
-int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- if (rwlock->rw_refcount > 0)
- rwlock->rw_refcount--; /* releasing a reader */
- else if (rwlock->rw_refcount == -1)
- rwlock->rw_refcount = 0; /* releasing a writer */
-
- /* give preference to waiting writers over waiting readers */
- if (rwlock->rw_nwaitwriters > 0)
- {
- if (rwlock->rw_refcount == 0)
- result = pthread_cond_signal(&rwlock->rw_condwriters);
- }
- else if (rwlock->rw_nwaitreaders > 0)
- {
- result = pthread_cond_broadcast(&rwlock->rw_condreaders);
- }
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return(result);
-}
-RTM_EXPORT(pthread_rwlock_unlock);
-
-int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
-{
- int result;
-
- if (!rwlock)
- return EINVAL;
- if (rwlock->attr == -1)
- pthread_rwlock_init(rwlock, NULL);
-
- if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0)
- return(result);
-
- while (rwlock->rw_refcount != 0)
- {
- rwlock->rw_nwaitwriters++;
- /* rw_mutex will be released when waiting for rw_condwriters */
- result = pthread_cond_wait(&rwlock->rw_condwriters, &rwlock->rw_mutex);
- /* rw_mutex should have been taken again when returned from waiting */
- rwlock->rw_nwaitwriters--;
-
- if (result != 0)
- break;
- }
-
- if (result == 0)
- rwlock->rw_refcount = -1;
-
- pthread_mutex_unlock(&rwlock->rw_mutex);
-
- return(result);
-}
-RTM_EXPORT(pthread_rwlock_wrlock);
-