mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
tst: memfs: atomically update FileNode::RefCount (issue #93)
This commit is contained in:
parent
8090b7c666
commit
98a329e81b
@ -192,7 +192,7 @@ typedef struct _MEMFS_FILE_NODE
|
|||||||
SIZE_T ReparseDataSize;
|
SIZE_T ReparseDataSize;
|
||||||
PVOID ReparseData;
|
PVOID ReparseData;
|
||||||
#endif
|
#endif
|
||||||
ULONG RefCount;
|
volatile LONG RefCount;
|
||||||
#if defined(MEMFS_NAMED_STREAMS)
|
#if defined(MEMFS_NAMED_STREAMS)
|
||||||
struct _MEMFS_FILE_NODE *MainFileNode;
|
struct _MEMFS_FILE_NODE *MainFileNode;
|
||||||
#endif
|
#endif
|
||||||
@ -260,13 +260,13 @@ VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode)
|
|||||||
static inline
|
static inline
|
||||||
VOID MemfsFileNodeReference(MEMFS_FILE_NODE *FileNode)
|
VOID MemfsFileNodeReference(MEMFS_FILE_NODE *FileNode)
|
||||||
{
|
{
|
||||||
FileNode->RefCount++;
|
InterlockedIncrement(&FileNode->RefCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
VOID MemfsFileNodeDereference(MEMFS_FILE_NODE *FileNode)
|
VOID MemfsFileNodeDereference(MEMFS_FILE_NODE *FileNode)
|
||||||
{
|
{
|
||||||
if (0 == --FileNode->RefCount)
|
if (0 == InterlockedDecrement(&FileNode->RefCount))
|
||||||
MemfsFileNodeDelete(FileNode);
|
MemfsFileNodeDelete(FileNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,14 +850,18 @@ static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
#if defined(MEMFS_NAMED_STREAMS)
|
#if defined(MEMFS_NAMED_STREAMS)
|
||||||
MEMFS_FILE_NODE_MAP_ENUM_CONTEXT Context = { FALSE };
|
MEMFS_FILE_NODE_MAP_ENUM_CONTEXT Context = { TRUE };
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
|
|
||||||
MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode,
|
MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode,
|
||||||
MemfsFileNodeMapEnumerateFn, &Context);
|
MemfsFileNodeMapEnumerateFn, &Context);
|
||||||
for (Index = 0; Context.Count > Index; Index++)
|
for (Index = 0; Context.Count > Index; Index++)
|
||||||
if (1 >= Context.FileNodes[Index]->RefCount)
|
{
|
||||||
|
LONG RefCount = Context.FileNodes[Index]->RefCount;
|
||||||
|
MemoryBarrier();
|
||||||
|
if (2 >= RefCount)
|
||||||
MemfsFileNodeMapRemove(Memfs->FileNodeMap, Context.FileNodes[Index]);
|
MemfsFileNodeMapRemove(Memfs->FileNodeMap, Context.FileNodes[Index]);
|
||||||
|
}
|
||||||
MemfsFileNodeMapEnumerateFree(&Context);
|
MemfsFileNodeMapEnumerateFree(&Context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user