Windows: cm_user interlocked operations
authorJeffrey Altman <jaltman@your-file-system.com>
Sun, 27 Jan 2013 20:43:58 +0000 (15:43 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Sun, 3 Feb 2013 19:53:55 +0000 (11:53 -0800)
Convert cm_user refcnts to use interlocked operations.

Change-Id: Ib40d2446792dcde3038ea601281406e013147595
Reviewed-on: http://gerrit.openafs.org/9061
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsd/cm_user.c
src/WINNT/afsd/cm_user.h

index 9f20907..c471fad 100644 (file)
@@ -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);
 }
 
index ed98032..4f63b56 100644 (file)
@@ -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;