提交 8726e91b 编写于 作者: D Daniel P. Berrange

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: NDaniel P. Berrange <berrange@redhat.com>
上级 3aabe272
...@@ -39,6 +39,7 @@ struct _virIdentity { ...@@ -39,6 +39,7 @@ struct _virIdentity {
}; };
static virClassPtr virIdentityClass; static virClassPtr virIdentityClass;
static virThreadLocal virIdentityCurrent;
static void virIdentityDispose(void *obj); static void virIdentityDispose(void *obj);
...@@ -50,11 +51,69 @@ static int virIdentityOnceInit(void) ...@@ -50,11 +51,69 @@ static int virIdentityOnceInit(void)
virIdentityDispose))) virIdentityDispose)))
return -1; 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; return 0;
} }
VIR_ONCE_GLOBAL_INIT(virIdentity) 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: * virIdentityNew:
......
...@@ -38,6 +38,9 @@ typedef enum { ...@@ -38,6 +38,9 @@ typedef enum {
VIR_IDENTITY_ATTR_LAST, VIR_IDENTITY_ATTR_LAST,
} virIdentityAttrType; } virIdentityAttrType;
virIdentityPtr virIdentityGetCurrent(void);
int virIdentitySetCurrent(virIdentityPtr ident);
virIdentityPtr virIdentityNew(void); virIdentityPtr virIdentityNew(void);
int virIdentitySetAttr(virIdentityPtr ident, int virIdentitySetAttr(virIdentityPtr ident,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册