Windows: Interlocked ops for cm_scache
[openafs.git] / src / WINNT / afsd / cm_dcache.c
index 8970477..8c00319 100644 (file)
@@ -114,13 +114,14 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
     }
 
     /* prepare the output status for the store */
-    scp->mask |= CM_SCACHEMASK_CLIENTMODTIME;
+    _InterlockedOr(&scp->mask, CM_SCACHEMASK_CLIENTMODTIME);
     cm_StatusFromAttr(&inStatus, scp, NULL);
     truncPos = scp->length;
     if ((scp->mask & CM_SCACHEMASK_TRUNCPOS)
-        && LargeIntegerLessThan(scp->truncPos, truncPos))
+         && LargeIntegerLessThan(scp->truncPos, truncPos)) {
         truncPos = scp->truncPos;
-       scp->mask &= ~CM_SCACHEMASK_TRUNCPOS;
+        _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_TRUNCPOS);
+    }
 
     /* compute how many bytes to write from this buffer */
     thyper = LargeIntegerSubtract(scp->length, biod.offset);
@@ -380,14 +381,14 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
         }
 
         if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
-            scp->mask &= ~CM_SCACHEMASK_LENGTH;
+            _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH);
 
         cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
     } else {
         if (code == CM_ERROR_SPACE)
-            scp->flags |= CM_SCACHEFLAG_OUTOFSPACE;
+            _InterlockedOr(&scp->flags, CM_SCACHEFLAG_OUTOFSPACE);
         else if (code == CM_ERROR_QUOTA)
-            scp->flags |= CM_SCACHEFLAG_OVERQUOTA;
+            _InterlockedOr(&scp->flags, CM_SCACHEFLAG_OVERQUOTA);
     }
     cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
 
@@ -427,14 +428,14 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
     /* prepare the output status for the store */
     inStatus.Mask = AFS_SETMODTIME;
     inStatus.ClientModTime = scp->clientModTime;
-    scp->mask &= ~CM_SCACHEMASK_CLIENTMODTIME;
+    _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_CLIENTMODTIME);
 
     /* calculate truncation position */
     truncPos = scp->length;
     if ((scp->mask & CM_SCACHEMASK_TRUNCPOS)
         && LargeIntegerLessThan(scp->truncPos, truncPos))
         truncPos = scp->truncPos;
-    scp->mask &= ~CM_SCACHEMASK_TRUNCPOS;
+    _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_TRUNCPOS);
 
     if (LargeIntegerGreaterThan(truncPos,
                                 ConvertLongToLargeInteger(LONG_MAX))) {
@@ -532,7 +533,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
         }
 
         if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
-            scp->mask &= ~CM_SCACHEMASK_LENGTH;
+            _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH);
         cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
     }
     cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
@@ -785,7 +786,7 @@ void cm_ClearPrefetchFlag(long code, cm_scache_t *scp, osi_hyper_t *base, osi_hy
         if (LargeIntegerGreaterThan(end, scp->prefetch.end))
             scp->prefetch.end = end;
     }
-    scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
+    _InterlockedAnd(&scp->flags, ~CM_SCACHEFLAG_PREFETCHING);
 }
 
 /* do the prefetch.  if the prefetch fails, return 0 (success)
@@ -923,7 +924,7 @@ void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, afs_uint32 coun
         lock_ReleaseWrite(&scp->rw);
         return;
     }
-    scp->flags |= CM_SCACHEFLAG_PREFETCHING;
+    _InterlockedOr(&scp->flags, CM_SCACHEFLAG_PREFETCHING);
 
     /* start the scan at the latter of the end of this read or
      * the end of the last fetched region.
@@ -934,7 +935,7 @@ void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, afs_uint32 coun
     code = cm_CheckFetchRange(scp, &readBase, &readLength, userp, reqp,
                               &realBase);
     if (code) {
-        scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
+        _InterlockedAnd(&scp->flags, ~CM_SCACHEFLAG_PREFETCHING);
         lock_ReleaseWrite(&scp->rw);
         return;        /* can't find something to prefetch */
     }