From e4d97fa3e4a0d02160e082547b84c437472bfaae Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 27 Jan 2013 15:43:58 -0500 Subject: [PATCH] Windows: cm_user interlocked operations Convert cm_user refcnts to use interlocked operations. Change-Id: Ib40d2446792dcde3038ea601281406e013147595 Reviewed-on: http://gerrit.openafs.org/9061 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_user.c | 20 ++++++++++++++------ src/WINNT/afsd/cm_user.h | 4 ++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/WINNT/afsd/cm_user.c b/src/WINNT/afsd/cm_user.c index 9f209078e..c471fad1c 100644 --- a/src/WINNT/afsd/cm_user.c +++ b/src/WINNT/afsd/cm_user.c @@ -46,7 +46,7 @@ cm_user_t *cm_NewUser(void) userp = malloc(sizeof(*userp)); memset(userp, 0, sizeof(*userp)); - userp->refCount = 1; + InterlockedIncrement( &userp->refCount); lock_InitializeMutex(&userp->mx, "cm_user_t", LOCK_HIERARCHY_USER); return userp; } @@ -97,8 +97,11 @@ cm_ucell_t *cm_FindUCell(cm_user_t *userp, int iterator) void cm_HoldUser(cm_user_t *up) { + long lcount; + lock_ObtainWrite(&cm_userLock); - up->refCount++; + lcount = InterlockedIncrement( &up->refCount); + osi_assertx(lcount > 0, "user refcount error"); lock_ReleaseWrite(&cm_userLock); } @@ -106,13 +109,15 @@ void cm_ReleaseUser(cm_user_t *userp) { cm_ucell_t *ucp; cm_ucell_t *ncp; + long lcount; if (userp == NULL) return; lock_ObtainWrite(&cm_userLock); - osi_assertx(userp->refCount-- > 0, "cm_user_t refCount 0"); - if (userp->refCount == 0) { + lcount = InterlockedDecrement(&userp->refCount); + osi_assertx(lcount >= 0, "cm_user_t refCount < 0"); + if (lcount == 0) { lock_FinalizeMutex(&userp->mx); for (ucp = userp->cellInfop; ucp; ucp = ncp) { ncp = ucp->nextp; @@ -129,7 +134,7 @@ void cm_ReleaseUser(cm_user_t *userp) void cm_HoldUserVCRef(cm_user_t *userp) { lock_ObtainMutex(&userp->mx); - userp->vcRefs++; + InterlockedIncrement(&userp->vcRefs); lock_ReleaseMutex(&userp->mx); } @@ -141,8 +146,11 @@ void cm_HoldUserVCRef(cm_user_t *userp) */ void cm_ReleaseUserVCRef(cm_user_t *userp) { + long lcount; + lock_ObtainMutex(&userp->mx); - osi_assertx(userp->vcRefs-- > 0, "cm_user_t refCount 0"); + lcount = InterlockedDecrement(&userp->vcRefs); + osi_assertx(lcount >= 0, "cm_user vcRefs refCount < 0"); lock_ReleaseMutex(&userp->mx); } diff --git a/src/WINNT/afsd/cm_user.h b/src/WINNT/afsd/cm_user.h index ed98032e3..4f63b565d 100644 --- a/src/WINNT/afsd/cm_user.h +++ b/src/WINNT/afsd/cm_user.h @@ -44,10 +44,10 @@ typedef struct cm_ucell { #define CM_UCELLFLAG_ROOTUSER 0x10 /* cm_rootUser connection */ typedef struct cm_user { - unsigned long refCount; /* ref count - cm_userLock */ + long refCount; /* ref count - cm_userLock */ cm_ucell_t *cellInfop; /* list of cell info */ osi_mutex_t mx; /* mutex */ - int vcRefs; /* count of references from virtual circuits */ + long vcRefs; /* count of references from virtual circuits */ long flags; GUID authgroup; /* AFS redirector */ } cm_user_t; -- 2.39.5