[libvirt] [PATCH 1/3] virthread: Introduce virRWLockInitPreferWriter
John Ferlan
jferlan at redhat.com
Mon Jul 24 17:12:59 UTC 2017
On 07/19/2017 10:31 AM, Michal Privoznik wrote:
> We already have virRWLockInit. But this uses pthread defaults
> which prefer reader to initialize the RW lock. This may lead to
> writer starvation. Therefore we need to have the counterpart that
> prefers writers. Now, according to the
> pthread_rwlockattr_setkind_np() man page setting
> PTHREAD_RWLOCK_PREFER_WRITER_NP attribute is no-op. Therefore we
> need to use PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
> attribute. So much for good enum value names.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/util/virthread.c | 35 +++++++++++++++++++++++++++++++++++
> src/util/virthread.h | 1 +
> 3 files changed, 37 insertions(+)
>
This has broken the CI build, freebsd is not happy:
../../src/util/virthread.c:133:42: error: use of undeclared identifier
'PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP'
pthread_rwlockattr_setkind_np(&attr,
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
^
1 error generated.
John
You know what my suggestion is ;-)
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 187b12b32..a792e00c8 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2728,6 +2728,7 @@ virMutexUnlock;
> virOnce;
> virRWLockDestroy;
> virRWLockInit;
> +virRWLockInitPreferWriter;
> virRWLockRead;
> virRWLockUnlock;
> virRWLockWrite;
> diff --git a/src/util/virthread.c b/src/util/virthread.c
> index 6c495158f..a8dd72f8b 100644
> --- a/src/util/virthread.c
> +++ b/src/util/virthread.c
> @@ -95,6 +95,15 @@ void virMutexUnlock(virMutexPtr m)
> }
>
>
> +/**
> + * virRWLockInit:
> + * @m: rwlock to init
> + *
> + * Initializes RW lock using pthread default attributes (which
> + * is PTHREAD_RWLOCK_PREFER_READER_NP).
> + *
> + * Returns 0 on success, -1 otherwise.
> + */
> int virRWLockInit(virRWLockPtr m)
> {
> int ret;
> @@ -106,6 +115,32 @@ int virRWLockInit(virRWLockPtr m)
> return 0;
> }
>
> +
> +/**
> + * virRWLockInitPreferWriter:
> + * @m: rwlock to init
> + *
> + * Initializes RW lock which prefers writers over readers.
> + *
> + * Returns 0 on success, -1 otherwise.
> + */
> +int virRWLockInitPreferWriter(virRWLockPtr m)
> +{
> + int ret;
> + pthread_rwlockattr_t attr;
> +
> + pthread_rwlockattr_init(&attr);
> + pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
> + ret = pthread_rwlock_init(&m->lock, &attr);
> + pthread_rwlockattr_destroy(&attr);
> + if (ret != 0) {
> + errno = ret;
> + return -1;
> + }
> + return 0;
> +}
> +
> +
> void virRWLockDestroy(virRWLockPtr m)
> {
> pthread_rwlock_destroy(&m->lock);
> diff --git a/src/util/virthread.h b/src/util/virthread.h
> index e466d9bf0..18b785af2 100644
> --- a/src/util/virthread.h
> +++ b/src/util/virthread.h
> @@ -136,6 +136,7 @@ void virMutexUnlock(virMutexPtr m);
>
>
> int virRWLockInit(virRWLockPtr m) ATTRIBUTE_RETURN_CHECK;
> +int virRWLockInitPreferWriter(virRWLockPtr m) ATTRIBUTE_RETURN_CHECK;
> void virRWLockDestroy(virRWLockPtr m);
>
> void virRWLockRead(virRWLockPtr m);
>
More information about the libvir-list
mailing list