mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 06:35:24 +00:00
Add APIs for associating a virIdentityPtr with the current thread
To allow any internal API to get the current identity, add APIs to associate a virIdentityPtr with the current thread, via a thread local Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
3aabe27247
commit
8726e91b3a
@ -39,6 +39,7 @@ struct _virIdentity {
|
||||
};
|
||||
|
||||
static virClassPtr virIdentityClass;
|
||||
static virThreadLocal virIdentityCurrent;
|
||||
|
||||
static void virIdentityDispose(void *obj);
|
||||
|
||||
@ -50,11 +51,69 @@ static int virIdentityOnceInit(void)
|
||||
virIdentityDispose)))
|
||||
return -1;
|
||||
|
||||
if (virThreadLocalInit(&virIdentityCurrent,
|
||||
(virThreadLocalCleanup)virObjectUnref) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Cannot initialize thread local for current identity"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VIR_ONCE_GLOBAL_INIT(virIdentity)
|
||||
|
||||
/**
|
||||
* virIdentityGetCurrent:
|
||||
*
|
||||
* Get the current identity associated with this thread. The
|
||||
* caller will own a reference to the returned identity, but
|
||||
* must not modify the object in any way, other than to
|
||||
* release the reference when done with virObjectUnref
|
||||
*
|
||||
* Returns: a reference to the current identity, or NULL
|
||||
*/
|
||||
virIdentityPtr virIdentityGetCurrent(void)
|
||||
{
|
||||
virIdentityPtr ident;
|
||||
|
||||
if (virIdentityOnceInit() < 0)
|
||||
return NULL;
|
||||
|
||||
ident = virThreadLocalGet(&virIdentityCurrent);
|
||||
return virObjectRef(ident);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virIdentitySetCurrent:
|
||||
*
|
||||
* Set the new identity to be associated with this thread.
|
||||
* The caller should not modify the passed identity after
|
||||
* it has been set, other than to release its own reference.
|
||||
*
|
||||
* Returns 0 on success, or -1 on error
|
||||
*/
|
||||
int virIdentitySetCurrent(virIdentityPtr ident)
|
||||
{
|
||||
virIdentityPtr old;
|
||||
|
||||
if (virIdentityOnceInit() < 0)
|
||||
return -1;
|
||||
|
||||
old = virThreadLocalGet(&virIdentityCurrent);
|
||||
virObjectUnref(old);
|
||||
|
||||
if (virThreadLocalSet(&virIdentityCurrent,
|
||||
virObjectRef(ident)) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Unable to set thread local identity"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virIdentityNew:
|
||||
|
@ -38,6 +38,9 @@ typedef enum {
|
||||
VIR_IDENTITY_ATTR_LAST,
|
||||
} virIdentityAttrType;
|
||||
|
||||
virIdentityPtr virIdentityGetCurrent(void);
|
||||
int virIdentitySetCurrent(virIdentityPtr ident);
|
||||
|
||||
virIdentityPtr virIdentityNew(void);
|
||||
|
||||
int virIdentitySetAttr(virIdentityPtr ident,
|
||||
|
Loading…
Reference in New Issue
Block a user