aboutsummaryrefslogtreecommitdiff
path: root/lib/memfs
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-11-08 03:25:09 +0700
committerShulhan <ms@kilabit.info>2023-11-08 03:26:14 +0700
commitfdb1c05d62a22b0f178fdf710145a3a7d3bb0d8c (patch)
tree124d173d9bf94042f33abefa0e57cd9d61546619 /lib/memfs
parent8b208559ad6a8f4c8e4553e2dafbcf0a0afc7d51 (diff)
downloadpakakeh.go-fdb1c05d62a22b0f178fdf710145a3a7d3bb0d8c.tar.xz
lib/memfs: split handling deleted directory and file on DirWatcher
When a directory being deleted we recursively unmap all its sub directory. When a file being deleted we stop its watcher.
Diffstat (limited to 'lib/memfs')
-rw-r--r--lib/memfs/dirwatcher.go68
1 files changed, 32 insertions, 36 deletions
diff --git a/lib/memfs/dirwatcher.go b/lib/memfs/dirwatcher.go
index 9bfd910b..c4011788 100644
--- a/lib/memfs/dirwatcher.go
+++ b/lib/memfs/dirwatcher.go
@@ -213,42 +213,41 @@ func (dw *DirWatcher) onCreated(parent, child *Node) (err error) {
return nil
}
-// onDelete remove the node from being watched and from memfs, including its
-// childs if its a directory.
-func (dw *DirWatcher) onDelete(node *Node) {
- var (
- child *Node
- watcher *Watcher
- )
+// onDirDeleted remove the node from being watched and from memfs, including
+// its childs if its a directory.
+func (dw *DirWatcher) onDirDeleted(node *Node) {
+ var child *Node
+
for _, child = range node.Childs {
if child.IsDir() {
- dw.onDelete(child)
+ dw.onDirDeleted(child)
}
-
dw.fs.RemoveChild(node, child)
+ }
- // Push changes for file deletion.
- var ns = NodeState{
- State: FileStateDeleted,
- Node: *child,
- }
- select {
- case dw.qchanges <- ns:
- default:
- }
+ dw.dirsLocker.Lock()
+ delete(dw.dirs, node.Path)
+ dw.dirsLocker.Unlock()
+
+ dw.fs.RemoveChild(node.Parent, node)
+
+ var ns = NodeState{
+ State: FileStateDeleted,
+ Node: *node,
}
- if node.IsDir() {
- dw.dirsLocker.Lock()
- delete(dw.dirs, node.Path)
- dw.dirsLocker.Unlock()
- } else {
- // Stop the file watcher.
- watcher = dw.fileWatcher[node.Path]
- if watcher != nil {
- watcher.Stop()
- delete(dw.fileWatcher, node.Path)
- }
+ select {
+ case dw.qchanges <- ns:
+ default:
+ }
+}
+
+func (dw *DirWatcher) onFileDeleted(node *Node) {
+ var watcher = dw.fileWatcher[node.Path]
+ if watcher != nil {
+ watcher.Stop()
+ delete(dw.fileWatcher, node.Path)
}
+
dw.fs.RemoveChild(node.Parent, node)
var ns = NodeState{
@@ -337,7 +336,7 @@ func (dw *DirWatcher) onUpdateDir(node *Node) {
if child.IsDir() {
// Only process directory, files is processed by
// qFileChanges.
- dw.onDelete(child)
+ dw.onDirDeleted(child)
}
}
}
@@ -501,15 +500,12 @@ func (dw *DirWatcher) start() {
node, err = dw.fs.Get(ns.Node.Path)
if err != nil {
log.Printf("%s: on file changes %s: %s", logp, ns.Node.Path, err)
- var watcher = dw.fileWatcher[ns.Node.Path]
- if watcher != nil {
- watcher.Stop()
- }
+ dw.onFileDeleted(&ns.Node)
} else {
ns.Node = *node
switch ns.State {
case FileStateDeleted:
- dw.onDelete(node)
+ dw.onFileDeleted(node)
case FileStateUpdateMode:
dw.onUpdateMode(node, nil)
case FileStateUpdateContent:
@@ -539,7 +535,7 @@ func (dw *DirWatcher) processSubdirs() {
newDirInfo, err = os.Stat(node.SysPath)
if err != nil {
if os.IsNotExist(err) {
- dw.onDelete(node)
+ dw.onDirDeleted(node)
} else {
log.Printf("%s: %q: %s", logp, node.SysPath, err)
}