mirror of
https://github.com/RGBCube/serenity
synced 2025-05-28 19:35:09 +00:00
Kernel: Make Inode::register_watcher() OOM-fallible
This commit is contained in:
parent
87bd930e7e
commit
a9cd8ca841
3 changed files with 14 additions and 7 deletions
|
@ -154,11 +154,12 @@ bool Inode::unbind_socket()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inode::register_watcher(Badge<InodeWatcher>, InodeWatcher& watcher)
|
ErrorOr<void> Inode::register_watcher(Badge<InodeWatcher>, InodeWatcher& watcher)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_inode_lock);
|
MutexLocker locker(m_inode_lock);
|
||||||
VERIFY(!m_watchers.contains(&watcher));
|
VERIFY(!m_watchers.contains(&watcher));
|
||||||
m_watchers.set(&watcher);
|
TRY(m_watchers.try_set(&watcher));
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inode::unregister_watcher(Badge<InodeWatcher>, InodeWatcher& watcher)
|
void Inode::unregister_watcher(Badge<InodeWatcher>, InodeWatcher& watcher)
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
|
|
||||||
bool has_watchers() const { return !m_watchers.is_empty(); }
|
bool has_watchers() const { return !m_watchers.is_empty(); }
|
||||||
|
|
||||||
void register_watcher(Badge<InodeWatcher>, InodeWatcher&);
|
ErrorOr<void> register_watcher(Badge<InodeWatcher>, InodeWatcher&);
|
||||||
void unregister_watcher(Badge<InodeWatcher>, InodeWatcher&);
|
void unregister_watcher(Badge<InodeWatcher>, InodeWatcher&);
|
||||||
|
|
||||||
ErrorOr<NonnullRefPtr<FIFO>> fifo();
|
ErrorOr<NonnullRefPtr<FIFO>> fifo();
|
||||||
|
|
|
@ -124,13 +124,19 @@ ErrorOr<int> InodeWatcher::register_inode(Inode& inode, unsigned event_mask)
|
||||||
auto description = TRY(WatchDescription::create(wd, inode, event_mask));
|
auto description = TRY(WatchDescription::create(wd, inode, event_mask));
|
||||||
|
|
||||||
TRY(m_inode_to_watches.try_set(inode.identifier(), description.ptr()));
|
TRY(m_inode_to_watches.try_set(inode.identifier(), description.ptr()));
|
||||||
auto result = m_wd_to_watches.try_set(wd, move(description));
|
auto set_result = m_wd_to_watches.try_set(wd, move(description));
|
||||||
if (result.is_error()) {
|
if (set_result.is_error()) {
|
||||||
m_inode_to_watches.remove(inode.identifier());
|
m_inode_to_watches.remove(inode.identifier());
|
||||||
return result.release_error();
|
return set_result.release_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto register_result = inode.register_watcher({}, *this);
|
||||||
|
if (register_result.is_error()) {
|
||||||
|
m_inode_to_watches.remove(inode.identifier());
|
||||||
|
m_wd_to_watches.remove(wd);
|
||||||
|
return register_result.release_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
inode.register_watcher({}, *this);
|
|
||||||
return wd;
|
return wd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue