mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-30 09:53:10 +00:00
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:
parent
908b33644e
commit
8b03a609dd
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user