mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-31 16:35:28 +00:00
vfs: watch support for Readonly_value_file_system
This patch adds support for watch notifications for the 'Readonly_value_file_system', which is often used by VFS plugins to implement pseudo files. It thereby enables VFS clients to respond to VFS-plugin events (think of terminal resize) dynamically. Fixes #3523
This commit is contained in:
parent
a5bc031cca
commit
7549189f88
@ -84,6 +84,11 @@ class Vfs::Readonly_value_file_system : public Vfs::Single_file_system
|
|||||||
return Config(Genode::Cstring(buf));
|
return Config(Genode::Cstring(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef Genode::Registered<Vfs_watch_handle> Registered_watch_handle;
|
||||||
|
typedef Genode::Registry<Registered_watch_handle> Watch_handle_registry;
|
||||||
|
|
||||||
|
Watch_handle_registry _handle_registry { };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Readonly_value_file_system(Name const &name, T const &initial_value)
|
Readonly_value_file_system(Name const &name, T const &initial_value)
|
||||||
@ -99,7 +104,13 @@ class Vfs::Readonly_value_file_system : public Vfs::Single_file_system
|
|||||||
|
|
||||||
char const *type() override { return type_name(); }
|
char const *type() override { return type_name(); }
|
||||||
|
|
||||||
void value(T const &value) { _buffer = Buffer(value); }
|
void value(T const &value)
|
||||||
|
{
|
||||||
|
_buffer = Buffer(value);
|
||||||
|
|
||||||
|
_handle_registry.for_each([this] (Registered_watch_handle &handle) {
|
||||||
|
handle.watch_response(); });
|
||||||
|
}
|
||||||
|
|
||||||
bool matches(Xml_node node) const
|
bool matches(Xml_node node) const
|
||||||
{
|
{
|
||||||
@ -107,6 +118,7 @@ class Vfs::Readonly_value_file_system : public Vfs::Single_file_system
|
|||||||
node.attribute_value("name", Name()) == _file_name;
|
node.attribute_value("name", Name()) == _file_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
** Directory-service interface **
|
** Directory-service interface **
|
||||||
*********************************/
|
*********************************/
|
||||||
@ -134,6 +146,29 @@ class Vfs::Readonly_value_file_system : public Vfs::Single_file_system
|
|||||||
out.size = _buffer.length();
|
out.size = _buffer.length();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Watch_result watch(char const *path,
|
||||||
|
Vfs_watch_handle **handle,
|
||||||
|
Allocator &alloc) override
|
||||||
|
{
|
||||||
|
if (!_single_file(path))
|
||||||
|
return WATCH_ERR_UNACCESSIBLE;
|
||||||
|
|
||||||
|
try {
|
||||||
|
*handle = new (alloc)
|
||||||
|
Registered_watch_handle(_handle_registry, *this, alloc);
|
||||||
|
|
||||||
|
return WATCH_OK;
|
||||||
|
}
|
||||||
|
catch (Genode::Out_of_ram) { return WATCH_ERR_OUT_OF_RAM; }
|
||||||
|
catch (Genode::Out_of_caps) { return WATCH_ERR_OUT_OF_CAPS; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void close(Vfs_watch_handle *handle) override
|
||||||
|
{
|
||||||
|
Genode::destroy(handle->alloc(),
|
||||||
|
static_cast<Registered_watch_handle *>(handle));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__VFS__READONLY_VALUE_FILE_SYSTEM_H_ */
|
#endif /* _INCLUDE__VFS__READONLY_VALUE_FILE_SYSTEM_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user