Commit 1af3b283 authored by Daniel P. Berrangé's avatar Daniel P. Berrangé

storage pool: fix error reporting thread safety

Create wrapper functions for each storage pool C API that accepts a
virErrorPtr parameter. This avoids accessing a thread local from a
goroutine which may race with other goroutines doing native API calls in
the same OS thread.
Signed-off-by: 's avatarDaniel P. Berrangé <berrange@redhat.com>
parent 6d165861
This diff is collapsed.
......@@ -30,5 +30,314 @@ package libvirt
#include <assert.h>
#include "storage_pool_wrapper.h"
int
virStoragePoolBuildWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err)
{
int ret = virStoragePoolBuild(pool, flags);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolCreateWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err)
{
int ret = virStoragePoolCreate(pool, flags);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolDeleteWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err)
{
int ret = virStoragePoolDelete(pool, flags);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolDestroyWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolDestroy(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolFreeWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolFree(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolGetAutostartWrapper(virStoragePoolPtr pool,
int *autostart,
virErrorPtr err)
{
int ret = virStoragePoolGetAutostart(pool, autostart);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
virConnectPtr
virStoragePoolGetConnectWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
virConnectPtr ret = virStoragePoolGetConnect(pool);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolGetInfoWrapper(virStoragePoolPtr pool,
virStoragePoolInfoPtr info,
virErrorPtr err)
{
int ret = virStoragePoolGetInfo(pool, info);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
const char *
virStoragePoolGetNameWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
const char * ret = virStoragePoolGetName(pool);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolGetUUIDWrapper(virStoragePoolPtr pool,
unsigned char *uuid,
virErrorPtr err)
{
int ret = virStoragePoolGetUUID(pool, uuid);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolGetUUIDStringWrapper(virStoragePoolPtr pool,
char *buf,
virErrorPtr err)
{
int ret = virStoragePoolGetUUIDString(pool, buf);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
char *
virStoragePoolGetXMLDescWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err)
{
char * ret = virStoragePoolGetXMLDesc(pool, flags);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolIsActiveWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolIsActive(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolIsPersistentWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolIsPersistent(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolListAllVolumesWrapper(virStoragePoolPtr pool,
virStorageVolPtr **vols,
unsigned int flags,
virErrorPtr err)
{
int ret = virStoragePoolListAllVolumes(pool, vols, flags);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolListVolumesWrapper(virStoragePoolPtr pool,
char ** const names,
int maxnames,
virErrorPtr err)
{
int ret = virStoragePoolListVolumes(pool, names, maxnames);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolNumOfVolumesWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolNumOfVolumes(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolRefWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolRef(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolRefreshWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err)
{
int ret = virStoragePoolRefresh(pool, flags);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolSetAutostartWrapper(virStoragePoolPtr pool,
int autostart,
virErrorPtr err)
{
int ret = virStoragePoolSetAutostart(pool, autostart);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
int
virStoragePoolUndefineWrapper(virStoragePoolPtr pool,
virErrorPtr err)
{
int ret = virStoragePoolUndefine(pool);
if (ret < 0) {
virCopyLastError(err);
}
return ret;
}
virStorageVolPtr
virStorageVolCreateXMLWrapper(virStoragePoolPtr pool,
const char *xmlDesc,
unsigned int flags,
virErrorPtr err)
{
virStorageVolPtr ret = virStorageVolCreateXML(pool, xmlDesc, flags);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
virStorageVolPtr
virStorageVolCreateXMLFromWrapper(virStoragePoolPtr pool,
const char *xmlDesc,
virStorageVolPtr clonevol,
unsigned int flags,
virErrorPtr err)
{
virStorageVolPtr ret = virStorageVolCreateXMLFrom(pool, xmlDesc, clonevol, flags);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
virStorageVolPtr
virStorageVolLookupByNameWrapper(virStoragePoolPtr pool,
const char *name,
virErrorPtr err)
{
virStorageVolPtr ret = virStorageVolLookupByName(pool, name);
if (!ret) {
virCopyLastError(err);
}
return ret;
}
*/
import "C"
......@@ -30,4 +30,121 @@
#include <libvirt/virterror.h>
#include "storage_pool_compat.h"
int
virStoragePoolBuildWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolCreateWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolDeleteWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolDestroyWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolFreeWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolGetAutostartWrapper(virStoragePoolPtr pool,
int *autostart,
virErrorPtr err);
virConnectPtr
virStoragePoolGetConnectWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolGetInfoWrapper(virStoragePoolPtr pool,
virStoragePoolInfoPtr info,
virErrorPtr err);
const char *
virStoragePoolGetNameWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolGetUUIDWrapper(virStoragePoolPtr pool,
unsigned char *uuid,
virErrorPtr err);
int
virStoragePoolGetUUIDStringWrapper(virStoragePoolPtr pool,
char *buf,
virErrorPtr err);
char *
virStoragePoolGetXMLDescWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolIsActiveWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolIsPersistentWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolListAllVolumesWrapper(virStoragePoolPtr pool,
virStorageVolPtr **vols,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolListVolumesWrapper(virStoragePoolPtr pool,
char **const names,
int maxnames,
virErrorPtr err);
int
virStoragePoolNumOfVolumesWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolRefWrapper(virStoragePoolPtr pool,
virErrorPtr err);
int
virStoragePoolRefreshWrapper(virStoragePoolPtr pool,
unsigned int flags,
virErrorPtr err);
int
virStoragePoolSetAutostartWrapper(virStoragePoolPtr pool,
int autostart,
virErrorPtr err);
int
virStoragePoolUndefineWrapper(virStoragePoolPtr pool,
virErrorPtr err);
virStorageVolPtr
virStorageVolCreateXMLWrapper(virStoragePoolPtr pool,
const char *xmlDesc,
unsigned int flags,
virErrorPtr err);
virStorageVolPtr
virStorageVolCreateXMLFromWrapper(virStoragePoolPtr pool,
const char *xmlDesc,
virStorageVolPtr clonevol,
unsigned int flags,
virErrorPtr err);
virStorageVolPtr
virStorageVolLookupByNameWrapper(virStoragePoolPtr pool,
const char *name,
virErrorPtr err);
#endif /* LIBVIRT_GO_STORAGE_POOL_WRAPPER_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment