util: Only have virObjectLock handle virObjectLockable

Now that virObjectRWLockWrite exists to handle the virObjectRWLockable
objects, let's restore virObjectLock to only handle virObjectLockable
class locks. There still exists the possibility that the input @anyobj
isn't a valid object and the resource isn't truly locked, but that
also exists before commit id '77f4593b'.

This also restores some logic that commit id '77f4593b' removed
with respect to a common code path that commit id '10c2bb2b' had
introduced as virObjectGetLockableObj. This code path merely does
the same checks as the original virObjectLock commit 'b545f65d',
but in callable/reusable helper to ensure the @obj at least has
some validity before using.

Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
John Ferlan 2017-07-28 10:14:40 -04:00
parent 908b33644e
commit 8b03a609dd

View File

@ -367,13 +367,28 @@ virObjectRef(void *anyobj)
}
static virObjectLockablePtr
virObjectGetLockableObj(void *anyobj)
{
virObjectPtr obj;
if (virObjectIsClass(anyobj, virObjectLockableClass))
return anyobj;
obj = anyobj;
VIR_WARN("Object %p (%s) is not a virObjectLockable instance",
anyobj, obj ? obj->klass->name : "(unknown)");
return NULL;
}
/**
* virObjectLock:
* @anyobj: any instance of virObjectLockable or virObjectRWLockable
*
* Acquire a lock on @anyobj. The lock must be released by
* virObjectUnlock. In case the passed object is instance of
* virObjectRWLockable a write lock is acquired.
* virObjectUnlock.
*
* The caller is expected to have acquired a reference
* on the object before locking it (eg virObjectRef).
@ -383,18 +398,12 @@ virObjectRef(void *anyobj)
void
virObjectLock(void *anyobj)
{
if (virObjectIsClass(anyobj, virObjectLockableClass)) {
virObjectLockablePtr obj = anyobj;
virMutexLock(&obj->lock);
} else if (virObjectIsClass(anyobj, virObjectRWLockableClass)) {
virObjectRWLockablePtr obj = anyobj;
virRWLockWrite(&obj->lock);
} else {
virObjectPtr obj = anyobj;
VIR_WARN("Object %p (%s) is not a virObjectLockable "
"nor virObjectRWLockable instance",
anyobj, obj ? obj->klass->name : "(unknown)");
}
virObjectLockablePtr obj = virObjectGetLockableObj(anyobj);
if (!obj)
return;
virMutexLock(&obj->lock);
}