From 730021e079dc3654bdb6996e43f19c55132254f4 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 10 Aug 2011 11:42:59 -0400 Subject: [PATCH] Windows: Interlocked for cm_buf cmFlags Reviewed-on: http://gerrit.openafs.org/5196 Tested-by: BuildBot Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit 4876a416d2e59e87f9da8834db1ea4770f2c618c) Change-Id: I7416e0be7f0de82eddc366dbdb77e94ceabab797 Reviewed-on: http://gerrit.openafs.org/5217 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/WINNT/afsd/cm_buf.c | 2 +- src/WINNT/afsd/cm_dcache.c | 12 ++++++------ src/WINNT/afsd/cm_scache.c | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index 676bed6fb..5b8435996 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -2016,7 +2016,7 @@ long buf_CleanDirtyBuffers(cm_scache_t *scp) if (!cm_FidCmp(fidp, &bp->fid) && (bp->flags & CM_BUF_DIRTY)) { buf_Hold(bp); lock_ObtainMutex(&bp->mx); - bp->cmFlags &= ~CM_BUF_CMSTORING; + _InterlockedAnd(&bp->cmFlags, ~CM_BUF_CMSTORING); bp->flags &= ~CM_BUF_DIRTY; bp->dirty_offset = 0; bp->dirty_length = 0; diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index b7810fca5..9f01e0139 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -839,7 +839,7 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af lock_ObtainWrite(&scp->rw); rxheld = 1; } - bp->cmFlags &= ~CM_BUF_CMBKGFETCH; + _InterlockedAnd(&bp->cmFlags, ~CM_BUF_CMBKGFETCH); buf_Release(bp); bp = NULL; continue; @@ -854,7 +854,7 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af if (code == 0) fetched = LargeIntegerAdd(fetched, tblocksize); buf_Release(bp); - bp->cmFlags &= ~CM_BUF_CMBKGFETCH; + _InterlockedAnd(&bp->cmFlags, ~CM_BUF_CMBKGFETCH); } if (!rxheld) { @@ -869,7 +869,7 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af { bp = buf_Find(scp, &offset); if (bp) { - bp->cmFlags &= ~CM_BUF_CMBKGFETCH; + _InterlockedAnd(&bp->cmFlags, ~CM_BUF_CMBKGFETCH); buf_Release(bp); } } @@ -960,7 +960,7 @@ void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, afs_uint32 coun rwheld = 1; } - bp->cmFlags |= CM_BUF_CMBKGFETCH; + _InterlockedOr(&bp->cmFlags, CM_BUF_CMBKGFETCH); buf_Release(bp); } @@ -1952,7 +1952,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp * PREFETCHING flag, so the reader waiting for * this buffer will start a prefetch. */ - tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED; + _InterlockedOr(&tbufp->cmFlags, CM_BUF_CMFULLYFETCHED); lock_ObtainWrite(&scp->rw); if (scp->flags & CM_SCACHEFLAG_WAITING) { osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp); @@ -2009,7 +2009,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp * PREFETCHING flag, so the reader waiting for * this buffer will start a prefetch. */ - tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED; + _InterlockedOr(&tbufp->cmFlags, CM_BUF_CMFULLYFETCHED); lock_ObtainWrite(&scp->rw); if (scp->flags & CM_SCACHEFLAG_WAITING) { osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 3783710f2..22d7510bb 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -161,7 +161,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) osi_QDFree(qdp); if (bufp) { lock_ObtainMutex(&bufp->mx); - bufp->cmFlags &= ~CM_BUF_CMSTORING; + _InterlockedAnd(&bufp->cmFlags, ~CM_BUF_CMSTORING); bufp->flags &= ~CM_BUF_DIRTY; bufp->dirty_offset = 0; bufp->dirty_length = 0; @@ -183,7 +183,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) osi_QDFree(qdp); if (bufp) { lock_ObtainMutex(&bufp->mx); - bufp->cmFlags &= ~CM_BUF_CMFETCHING; + _InterlockedAnd(&bufp->cmFlags, ~CM_BUF_CMFETCHING); bufp->flags &= ~CM_BUF_DIRTY; bufp->dirty_offset = 0; bufp->dirty_length = 0; @@ -1383,7 +1383,7 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req osi_SetQData(qdp, bufp); buf_Hold(bufp); - bufp->cmFlags |= CM_BUF_CMFETCHING; + _InterlockedOr(&bufp->cmFlags, CM_BUF_CMFETCHING); osi_QAdd((osi_queue_t **) &scp->bufReadsp, &qdp->q); } @@ -1401,13 +1401,13 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req qdp = osi_QDAlloc(); osi_SetQData(qdp, bufp); buf_Hold(bufp); - bufp->cmFlags |= CM_BUF_CMSTORING; + _InterlockedOr(&bufp->cmFlags, CM_BUF_CMSTORING); osi_QAdd((osi_queue_t **) &scp->bufWritesp, &qdp->q); } if (bufp && (flags & CM_SCACHESYNC_WRITE)) { /* mark the buffer as being written to. */ - bufp->cmFlags |= CM_BUF_CMWRITING; + _InterlockedOr(&bufp->cmFlags, CM_BUF_CMWRITING); } return 0; @@ -1456,7 +1456,7 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags) osi_QDFree(qdp); release = 1; } - bufp->cmFlags &= ~(CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED); + _InterlockedAnd(&bufp->cmFlags, ~(CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)); if (bufp->flags & CM_BUF_WAITING) { osi_Log2(afsd_logp, "CM SyncOpDone FetchData Waking [scp 0x%p] bufp 0x%p", scp, bufp); osi_Wakeup((LONG_PTR) &bufp); @@ -1479,7 +1479,7 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags) osi_QDFree(qdp); release = 1; } - bufp->cmFlags &= ~CM_BUF_CMSTORING; + _InterlockedAnd(&bufp->cmFlags, ~CM_BUF_CMSTORING); if (bufp->flags & CM_BUF_WAITING) { osi_Log2(afsd_logp, "CM SyncOpDone StoreData Waking [scp 0x%p] bufp 0x%p", scp, bufp); osi_Wakeup((LONG_PTR) &bufp); @@ -1490,7 +1490,7 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags) if (bufp && (flags & CM_SCACHESYNC_WRITE)) { osi_assertx(bufp->cmFlags & CM_BUF_CMWRITING, "!CM_BUF_CMWRITING"); - bufp->cmFlags &= ~CM_BUF_CMWRITING; + _InterlockedAnd(&bufp->cmFlags, ~CM_BUF_CMWRITING); } /* and wakeup anyone who is waiting */ -- 2.39.5