Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
src/nwfilter/nwfilter_learnipaddr.c | 83 +++++++++--------------------
1 file changed, 24 insertions(+), 59 deletions(-)
diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
index 99bffdc4fb..2c85972012 100644
--- a/src/nwfilter/nwfilter_learnipaddr.c
+++ b/src/nwfilter/nwfilter_learnipaddr.c
@@ -143,11 +143,9 @@ static bool threadsTerminate;
int
virNWFilterLockIface(const char *ifname)
{
- virNWFilterIfaceLock *ifaceLock;
+ VIR_LOCK_GUARD lock = virLockGuardLock(&ifaceMapLock);
+ virNWFilterIfaceLock *ifaceLock = virHashLookup(ifaceLockMap, ifname);
- virMutexLock(&ifaceMapLock);
-
- ifaceLock = virHashLookup(ifaceLockMap, ifname);
if (!ifaceLock) {
ifaceLock = g_new0(virNWFilterIfaceLock, 1);
@@ -155,21 +153,20 @@ virNWFilterLockIface(const char *ifname)
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("mutex initialization failed"));
g_free(ifaceLock);
- goto error;
+ return -1;
}
if (virStrcpyStatic(ifaceLock->ifname, ifname) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("interface name %s does not fit into "
- "buffer "),
+ _("interface name %s does not fit into buffer"),
ifaceLock->ifname);
g_free(ifaceLock);
- goto error;
+ return -1;
}
while (virHashAddEntry(ifaceLockMap, ifname, ifaceLock)) {
g_free(ifaceLock);
- goto error;
+ return -1;
}
ifaceLock->refctr = 0;
@@ -177,27 +174,17 @@ virNWFilterLockIface(const char *ifname)
ifaceLock->refctr++;
- virMutexUnlock(&ifaceMapLock);
-
virMutexLock(&ifaceLock->lock);
return 0;
-
- error:
- virMutexUnlock(&ifaceMapLock);
-
- return -1;
}
void
virNWFilterUnlockIface(const char *ifname)
{
- virNWFilterIfaceLock *ifaceLock;
-
- virMutexLock(&ifaceMapLock);
-
- ifaceLock = virHashLookup(ifaceLockMap, ifname);
+ VIR_LOCK_GUARD lock = virLockGuardLock(&ifaceMapLock);
+ virNWFilterIfaceLock *ifaceLock = virHashLookup(ifaceLockMap, ifname);
if (ifaceLock) {
virMutexUnlock(&ifaceLock->lock);
@@ -206,8 +193,6 @@ virNWFilterUnlockIface(const char *ifname)
if (ifaceLock->refctr == 0)
virHashRemoveEntry(ifaceLockMap, ifname);
}
-
- virMutexUnlock(&ifaceMapLock);
}
@@ -228,17 +213,13 @@ virNWFilterIPAddrLearnReqFree(virNWFilterIPAddrLearnReq *req)
static int
virNWFilterRegisterLearnReq(virNWFilterIPAddrLearnReq *req)
{
- int res = -1;
g_autofree char *ifindex_str = g_strdup_printf("%d", req->ifindex);
+ VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
- virMutexLock(&pendingLearnReqLock);
-
- if (!virHashLookup(pendingLearnReq, ifindex_str))
- res = virHashAddEntry(pendingLearnReq, ifindex_str, req);
-
- virMutexUnlock(&pendingLearnReqLock);
+ if (virHashLookup(pendingLearnReq, ifindex_str))
+ return -1;
- return res;
+ return virHashAddEntry(pendingLearnReq, ifindex_str, req);
}
@@ -247,9 +228,7 @@ virNWFilterRegisterLearnReq(virNWFilterIPAddrLearnReq *req)
int
virNWFilterTerminateLearnReq(const char *ifname)
{
- int rc = -1;
int ifindex;
- virNWFilterIPAddrLearnReq *req;
g_autofree char *ifindex_str = NULL;
/* It's possible that it's already been removed as a result of
@@ -262,38 +241,30 @@ virNWFilterTerminateLearnReq(const char *ifname)
if (virNetDevGetIndex(ifname, &ifindex) < 0) {
virResetLastError();
- return rc;
+ return -1;
}
ifindex_str = g_strdup_printf("%d", ifindex);
- virMutexLock(&pendingLearnReqLock);
-
- req = virHashLookup(pendingLearnReq, ifindex_str);
- if (req) {
- rc = 0;
- req->terminate = true;
+ VIR_WITH_MUTEX_LOCK_GUARD(&pendingLearnReqLock) {
+ virNWFilterIPAddrLearnReq *req;
+ if ((req = virHashLookup(pendingLearnReq, ifindex_str))) {
+ req->terminate = true;
+ return 0;
+ }
}
- virMutexUnlock(&pendingLearnReqLock);
-
- return rc;
+ return -1;
}
bool
virNWFilterHasLearnReq(int ifindex)
{
- void *res;
g_autofree char *ifindex_str = g_strdup_printf("%d", ifindex);
+ VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
- virMutexLock(&pendingLearnReqLock);
-
- res = virHashLookup(pendingLearnReq, ifindex_str);
-
- virMutexUnlock(&pendingLearnReqLock);
-
- return res != NULL;
+ return virHashLookup(pendingLearnReq, ifindex_str) != NULL;
}
@@ -309,16 +280,10 @@ freeLearnReqEntry(void *payload)
static virNWFilterIPAddrLearnReq *
virNWFilterDeregisterLearnReq(int ifindex)
{
- virNWFilterIPAddrLearnReq *res;
g_autofree char *ifindex_str = g_strdup_printf("%d", ifindex);
+ VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
- virMutexLock(&pendingLearnReqLock);
-
- res = virHashSteal(pendingLearnReq, ifindex_str);
-
- virMutexUnlock(&pendingLearnReqLock);
-
- return res;
+ return virHashSteal(pendingLearnReq, ifindex_str);
}
#endif
--
2.31.1