mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:37:35 +00:00
Kernel: Implement multi-watch InodeWatcher :^)
This patch modifies InodeWatcher to switch to a one watcher, multiple watches architecture. The following changes have been made: - The watch_file syscall is removed, and in its place the create_iwatcher, iwatcher_add_watch and iwatcher_remove_watch calls have been added. - InodeWatcher now holds multiple WatchDescriptions for each file that is being watched. - The InodeWatcher file descriptor can be read from to receive events on all watched files. Co-authored-by: Gunnar Beutner <gunnar@beutner.name>
This commit is contained in:
parent
2de11b0dc8
commit
fe5ca6ca27
16 changed files with 521 additions and 262 deletions
|
@ -1,21 +1,37 @@
|
|||
/*
|
||||
* Copyright (c) 2020, the SerenityOS developers.
|
||||
* Copyright (c) 2020-2021, the SerenityOS developers.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/EnumBits.h>
|
||||
#include <AK/Types.h>
|
||||
|
||||
#ifdef KERNEL
|
||||
# include <LibC/limits.h>
|
||||
#else
|
||||
# include <limits.h>
|
||||
#endif
|
||||
|
||||
struct [[gnu::packed]] InodeWatcherEvent {
|
||||
enum class Type {
|
||||
enum class Type : u32 {
|
||||
Invalid = 0,
|
||||
Modified,
|
||||
ChildAdded,
|
||||
ChildRemoved,
|
||||
MetadataModified = 1 << 0,
|
||||
ContentModified = 1 << 1,
|
||||
Deleted = 1 << 2,
|
||||
ChildCreated = 1 << 3,
|
||||
ChildDeleted = 1 << 4,
|
||||
};
|
||||
|
||||
int watch_descriptor { 0 };
|
||||
Type type { Type::Invalid };
|
||||
unsigned inode_index { 0 };
|
||||
size_t name_length { 0 };
|
||||
// This is a VLA which is written during the read() from the descriptor.
|
||||
const char name[];
|
||||
};
|
||||
|
||||
AK_ENUM_BITWISE_OPERATORS(InodeWatcherEvent::Type);
|
||||
|
||||
constexpr unsigned MAXIMUM_EVENT_SIZE = sizeof(InodeWatcherEvent) + NAME_MAX + 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue