예제 #1
0
        public override SyncBlockComFlags GetComFlags(ulong obj)
        {
            if (obj == 0)
            {
                return(SyncBlockComFlags.None);
            }

            const ulong mask         = ~0xe000000000000000;
            ulong       lastComFlags = _lastComFlags;

            if ((lastComFlags & mask) == obj)
            {
                return((SyncBlockComFlags)(lastComFlags >> 61));
            }

            VolatileSyncBlockData?syncBlocks = _volatileSyncBlocks;

            if (syncBlocks is null)
            {
                syncBlocks          = new VolatileSyncBlockData(_helpers);
                _volatileSyncBlocks = syncBlocks;
            }

            SyncBlockComFlags flags = syncBlocks.GetComFlags(obj);

            _lastComFlags = ((ulong)flags << 61) | (obj & mask);
            return(flags);
        }
예제 #2
0
        public override SyncBlock?GetSyncBlock(ulong obj)
        {
            VolatileSyncBlockData?syncBlocks = _volatileSyncBlocks;

            if (syncBlocks is null)
            {
                syncBlocks          = new VolatileSyncBlockData(_helpers);
                _volatileSyncBlocks = syncBlocks;
            }

            return(syncBlocks.GetSyncBlock(obj));
        }