Signed-off-by: Rafael Fonseca <r4f4rfs(a)gmail.com>
---
src/esx/esx_stream.c | 25 +++++++---------
src/esx/esx_vi.c | 68 +++++++++++++++-----------------------------
src/esx/esx_vi.h | 6 ++--
3 files changed, 36 insertions(+), 63 deletions(-)
diff --git a/src/esx/esx_stream.c b/src/esx/esx_stream.c
index fe3c42ae02..474c0f4739 100644
--- a/src/esx/esx_stream.c
+++ b/src/esx/esx_stream.c
@@ -203,6 +203,7 @@ esxStreamSend(virStreamPtr stream, const char *data, size_t nbytes)
int result = -1;
esxStreamPrivate *priv = stream->privateData;
int status;
+ g_autoptr(GMutexLocker) locker = NULL;
if (nbytes == 0)
return 0;
@@ -217,7 +218,7 @@ esxStreamSend(virStreamPtr stream, const char *data, size_t nbytes)
return -1;
}
- virMutexLock(&priv->curl->lock);
+ locker = g_mutex_locker_new(&priv->curl->lock);
priv->buffer = (char *)data;
priv->buffer_size = nbytes;
@@ -225,7 +226,7 @@ esxStreamSend(virStreamPtr stream, const char *data, size_t nbytes)
if (stream->flags & VIR_STREAM_NONBLOCK) {
if (esxStreamTransfer(priv, false) < 0)
- goto cleanup;
+ return -1;
if (priv->buffer_used < priv->buffer_size)
result = priv->buffer_size - priv->buffer_used;
@@ -236,7 +237,7 @@ esxStreamSend(virStreamPtr stream, const char *data, size_t nbytes)
status = esxStreamTransfer(priv, true);
if (status < 0)
- goto cleanup;
+ return -1;
if (status > 0)
break;
@@ -245,9 +246,6 @@ esxStreamSend(virStreamPtr stream, const char *data, size_t nbytes)
result = priv->buffer_size - priv->buffer_used;
}
- cleanup:
- virMutexUnlock(&priv->curl->lock);
-
return result;
}
@@ -260,6 +258,7 @@ esxStreamRecvFlags(virStreamPtr stream,
int result = -1;
esxStreamPrivate *priv = stream->privateData;
int status;
+ g_autoptr(GMutexLocker) locker = NULL;
virCheckFlags(0, -1);
@@ -276,7 +275,7 @@ esxStreamRecvFlags(virStreamPtr stream,
return -1;
}
- virMutexLock(&priv->curl->lock);
+ locker = g_mutex_locker_new(&priv->curl->lock);
priv->buffer = data;
priv->buffer_size = nbytes;
@@ -296,7 +295,7 @@ esxStreamRecvFlags(virStreamPtr stream,
result = priv->buffer_used;
} else if (stream->flags & VIR_STREAM_NONBLOCK) {
if (esxStreamTransfer(priv, false) < 0)
- goto cleanup;
+ return -1;
if (priv->buffer_used > 0)
result = priv->buffer_used;
@@ -307,7 +306,7 @@ esxStreamRecvFlags(virStreamPtr stream,
status = esxStreamTransfer(priv, true);
if (status < 0)
- goto cleanup;
+ return -1;
if (status > 0)
break;
@@ -316,9 +315,6 @@ esxStreamRecvFlags(virStreamPtr stream,
result = priv->buffer_used;
}
- cleanup:
- virMutexUnlock(&priv->curl->lock);
-
return result;
}
@@ -346,11 +342,12 @@ esxStreamClose(virStreamPtr stream, bool finish)
{
int result = 0;
esxStreamPrivate *priv = stream->privateData;
+ g_autoptr(GMutexLocker) locker = NULL;
if (!priv)
return 0;
- virMutexLock(&priv->curl->lock);
+ locker = g_mutex_locker_new(&priv->curl->lock);
if (finish && priv->backlog_used > 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -360,8 +357,6 @@ esxStreamClose(virStreamPtr stream, bool finish)
stream->privateData = NULL;
- virMutexUnlock(&priv->curl->lock);
-
esxFreeStreamPrivate(&priv);
return result;
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index 16690edfbe..ed6c6c28cd 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -112,7 +112,7 @@ ESX_VI__TEMPLATE__FREE(CURL,
if (item->headers)
curl_slist_free_all(item->headers);
- virMutexDestroy(&item->lock);
+ g_mutex_clear(&item->lock);
})
static size_t
@@ -356,11 +356,7 @@ esxVI_CURL_Connect(esxVI_CURL *curl, esxUtil_ParsedUri *parsedUri)
parsedUri->proxy_port);
}
- if (virMutexInit(&curl->lock) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Could not initialize CURL mutex"));
- return -1;
- }
+ g_mutex_init(&curl->lock);
return 0;
}
@@ -392,7 +388,7 @@ esxVI_CURL_Download(esxVI_CURL *curl, const char *url, char
**content,
range = g_strdup_printf("%llu-", offset);
}
- virMutexLock(&curl->lock);
+ g_mutex_lock(&curl->lock);
curl_easy_setopt(curl->handle, CURLOPT_URL, url);
curl_easy_setopt(curl->handle, CURLOPT_RANGE, range);
@@ -402,7 +398,7 @@ esxVI_CURL_Download(esxVI_CURL *curl, const char *url, char
**content,
responseCode = esxVI_CURL_Perform(curl, url);
- virMutexUnlock(&curl->lock);
+ g_mutex_unlock(&curl->lock);
if (responseCode < 0) {
goto cleanup;
@@ -433,14 +429,13 @@ int
esxVI_CURL_Upload(esxVI_CURL *curl, const char *url, const char *content)
{
int responseCode = 0;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&curl->lock);
if (!content) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid
argument"));
return -1;
}
- virMutexLock(&curl->lock);
-
curl_easy_setopt(curl->handle, CURLOPT_URL, url);
curl_easy_setopt(curl->handle, CURLOPT_RANGE, NULL);
curl_easy_setopt(curl->handle, CURLOPT_READDATA, &content);
@@ -449,8 +444,6 @@ esxVI_CURL_Upload(esxVI_CURL *curl, const char *url, const char
*content)
responseCode = esxVI_CURL_Perform(curl, url);
- virMutexUnlock(&curl->lock);
-
if (responseCode < 0) {
return -1;
} else if (responseCode != 200 && responseCode != 201) {
@@ -494,7 +487,7 @@ esxVI_SharedCURL_Lock(CURL *handle G_GNUC_UNUSED, curl_lock_data
data,
return;
}
- virMutexLock(&shared->locks[i]);
+ g_mutex_lock(&shared->locks[i]);
}
static void
@@ -522,7 +515,7 @@ esxVI_SharedCURL_Unlock(CURL *handle G_GNUC_UNUSED, curl_lock_data
data,
return;
}
- virMutexUnlock(&shared->locks[i]);
+ g_mutex_unlock(&shared->locks[i]);
}
/* esxVI_SharedCURL_Alloc */
@@ -543,7 +536,7 @@ ESX_VI__TEMPLATE__FREE(SharedCURL,
curl_share_cleanup(item->handle);
for (i = 0; i < G_N_ELEMENTS(item->locks); ++i)
- virMutexDestroy(&item->locks[i]);
+ g_mutex_clear(&item->locks[i]);
})
int
@@ -583,22 +576,18 @@ esxVI_SharedCURL_Add(esxVI_SharedCURL *shared, esxVI_CURL *curl)
CURL_LOCK_DATA_DNS);
for (i = 0; i < G_N_ELEMENTS(shared->locks); ++i) {
- if (virMutexInit(&shared->locks[i]) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Could not initialize a CURL (share)
mutex"));
- return -1;
- }
+ g_mutex_init(&shared->locks[i]);
}
}
- virMutexLock(&curl->lock);
+ g_mutex_lock(&curl->lock);
curl_easy_setopt(curl->handle, CURLOPT_SHARE, shared->handle);
curl->shared = shared;
++shared->count;
- virMutexUnlock(&curl->lock);
+ g_mutex_unlock(&curl->lock);
return 0;
}
@@ -606,6 +595,8 @@ esxVI_SharedCURL_Add(esxVI_SharedCURL *shared, esxVI_CURL *curl)
int
esxVI_SharedCURL_Remove(esxVI_SharedCURL *shared, esxVI_CURL *curl)
{
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&curl->lock);
+
if (!curl->handle) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot unshare uninitialized CURL handle"));
@@ -623,15 +614,11 @@ esxVI_SharedCURL_Remove(esxVI_SharedCURL *shared, esxVI_CURL *curl)
return -1;
}
- virMutexLock(&curl->lock);
-
curl_easy_setopt(curl->handle, CURLOPT_SHARE, NULL);
curl->shared = NULL;
--shared->count;
- virMutexUnlock(&curl->lock);
-
return 0;
}
@@ -661,6 +648,8 @@ ESX_VI__TEMPLATE__FREE(MultiCURL,
int
esxVI_MultiCURL_Add(esxVI_MultiCURL *multi, esxVI_CURL *curl)
{
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&curl->lock);
+
if (!curl->handle) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot add uninitialized CURL handle to a multi
handle"));
@@ -684,21 +673,19 @@ esxVI_MultiCURL_Add(esxVI_MultiCURL *multi, esxVI_CURL *curl)
}
- virMutexLock(&curl->lock);
-
curl_multi_add_handle(multi->handle, curl->handle);
curl->multi = multi;
++multi->count;
- virMutexUnlock(&curl->lock);
-
return 0;
}
int
esxVI_MultiCURL_Remove(esxVI_MultiCURL *multi, esxVI_CURL *curl)
{
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&curl->lock);
+
if (!curl->handle) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot remove uninitialized CURL handle from a "
@@ -718,15 +705,11 @@ esxVI_MultiCURL_Remove(esxVI_MultiCURL *multi, esxVI_CURL *curl)
return -1;
}
- virMutexLock(&curl->lock);
-
curl_multi_remove_handle(multi->handle, curl->handle);
curl->multi = NULL;
--multi->count;
- virMutexUnlock(&curl->lock);
-
return 0;
}
@@ -809,7 +792,7 @@ ESX_VI__TEMPLATE__ALLOC(Context)
ESX_VI__TEMPLATE__FREE(Context,
{
if (item->sessionLock)
- virMutexDestroy(item->sessionLock);
+ g_mutex_clear(item->sessionLock);
esxVI_CURL_Free(&item->curl);
VIR_FREE(item->url);
@@ -870,11 +853,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url,
goto cleanup;
- if (virMutexInit(ctx->sessionLock) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Could not initialize session mutex"));
- goto cleanup;
- }
+ g_mutex_init(ctx->sessionLock);
if (esxVI_RetrieveServiceContent(ctx, &ctx->service) < 0)
goto cleanup;
@@ -1262,7 +1241,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName,
if (esxVI_Response_Alloc(response) < 0)
return -1;
- virMutexLock(&ctx->curl->lock);
+ g_mutex_lock(&ctx->curl->lock);
curl_easy_setopt(ctx->curl->handle, CURLOPT_URL, ctx->url);
curl_easy_setopt(ctx->curl->handle, CURLOPT_RANGE, NULL);
@@ -1273,7 +1252,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName,
(*response)->responseCode = esxVI_CURL_Perform(ctx->curl, ctx->url);
- virMutexUnlock(&ctx->curl->lock);
+ g_mutex_unlock(&ctx->curl->lock);
if ((*response)->responseCode < 0)
goto cleanup;
@@ -1908,13 +1887,14 @@ esxVI_EnsureSession(esxVI_Context *ctx)
esxVI_DynamicProperty *dynamicProperty = NULL;
esxVI_UserSession *currentSession = NULL;
char *escapedPassword = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
if (!ctx->sessionLock) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid call, no
mutex"));
return -1;
}
- virMutexLock(ctx->sessionLock);
+ locker = g_mutex_locker_new(ctx->sessionLock);
if (!ctx->session) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid call, no
session"));
@@ -1969,8 +1949,6 @@ esxVI_EnsureSession(esxVI_Context *ctx)
result = 0;
cleanup:
- virMutexUnlock(ctx->sessionLock);
-
VIR_FREE(escapedPassword);
esxVI_String_Free(&propertyNameList);
esxVI_ObjectContent_Free(&sessionManager);
diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
index b960c0900a..949f90a43d 100644
--- a/src/esx/esx_vi.h
+++ b/src/esx/esx_vi.h
@@ -115,7 +115,7 @@ struct _esxVI_ParsedHostCpuIdInfo {
struct _esxVI_CURL {
CURL *handle;
- virMutex lock;
+ GMutex lock;
struct curl_slist *headers;
char error[CURL_ERROR_SIZE];
esxVI_SharedCURL *shared;
@@ -137,7 +137,7 @@ int esxVI_CURL_Upload(esxVI_CURL *curl, const char *url, const char
*content);
struct _esxVI_SharedCURL {
CURLSH *handle;
- virMutex locks[3]; /* share, cookie, dns */
+ GMutex locks[3]; /* share, cookie, dns */
size_t count; /* number of added easy handle */
};
@@ -184,7 +184,7 @@ struct _esxVI_Context {
esxVI_ProductLine productLine;
unsigned long productVersion; /* = 1000000 * major + 1000 * minor + micro */
esxVI_UserSession *session; /* ... except the session ... */
- virMutexPtr sessionLock; /* ... that is protected by this mutex */
+ GMutex *sessionLock; /* ... that is protected by this mutex */
esxVI_Datacenter *datacenter;
char *datacenterPath; /* including folders */
esxVI_ComputeResource *computeResource;
--
2.25.2