mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-21 06:33:31 +00:00
vfs: propagate I/O activity via 'wakeup_vfs_user'
This commit supplements the various I/O signal handlers of the VFS plugins with calls of the new 'Vfs::Env::User::wakeup_vfs_user' interface, which will subsequently replace the old 'Io_progress_handler' (issue #4697). Issue #4706
This commit is contained in:
parent
767632e1af
commit
bb904b9166
@ -438,7 +438,7 @@ struct Vfs::Block_file_system::Local_factory : File_system_factory
|
||||
Genode::Io_signal_handler<Local_factory> _block_signal_handler {
|
||||
_env.env().ep(), *this, &Local_factory::_handle_block_signal };
|
||||
|
||||
void _handle_block_signal() { }
|
||||
void _handle_block_signal() { _env.user().wakeup_vfs_user(); }
|
||||
|
||||
Data_file_system _data_fs;
|
||||
|
||||
|
@ -585,6 +585,7 @@ class Vfs::Fs_file_system : public File_system, private Remote_io
|
||||
_congested_handles.dequeue_all([] (Fs_vfs_handle &handle) {
|
||||
handle.io_progress_response(); });
|
||||
|
||||
_env.user().wakeup_vfs_user();
|
||||
}
|
||||
|
||||
Genode::Io_signal_handler<Fs_file_system> _signal_handler {
|
||||
|
@ -29,6 +29,8 @@ class Vfs::Rom_file_system : public Single_file_system
|
||||
|
||||
Genode::Env &_env;
|
||||
|
||||
Vfs::Env::User &_vfs_user;
|
||||
|
||||
typedef String<64> Label;
|
||||
|
||||
Label const _label;
|
||||
@ -125,6 +127,8 @@ class Vfs::Rom_file_system : public Single_file_system
|
||||
{
|
||||
_handle_registry.for_each([] (Registered_watch_handle &handle) {
|
||||
handle.watch_response(); });
|
||||
|
||||
_vfs_user.wakeup_vfs_user();
|
||||
}
|
||||
|
||||
Genode::Constructible<Genode::Io_signal_handler<Rom_file_system>>
|
||||
@ -137,7 +141,7 @@ class Vfs::Rom_file_system : public Single_file_system
|
||||
:
|
||||
Single_file_system(Node_type::CONTINUOUS_FILE, name(),
|
||||
Node_rwx::ro(), config),
|
||||
_env(env.env()),
|
||||
_env(env.env()), _vfs_user(env.user()),
|
||||
|
||||
/* use 'label' attribute if present, fall back to 'name' if not */
|
||||
_label(config.attribute_value("label",
|
||||
|
@ -57,6 +57,7 @@ class Vfs::Nic_file_system::Nic_vfs_handle : public Single_vfs_handle
|
||||
enum { BUF_SIZE = Uplink::Session::QUEUE_SIZE * PKT_SIZE };
|
||||
|
||||
Genode::Env &_env;
|
||||
Vfs::Env::User &_vfs_user;
|
||||
Nic::Packet_allocator _pkt_alloc;
|
||||
Nic::Connection _nic;
|
||||
bool _link_state;
|
||||
@ -99,6 +100,7 @@ class Vfs::Nic_file_system::Nic_vfs_handle : public Single_vfs_handle
|
||||
public:
|
||||
|
||||
Nic_vfs_handle(Genode::Env &env,
|
||||
Vfs::Env::User &vfs_user,
|
||||
Allocator &alloc,
|
||||
Label const &label,
|
||||
Net::Mac_address const &,
|
||||
@ -107,6 +109,7 @@ class Vfs::Nic_file_system::Nic_vfs_handle : public Single_vfs_handle
|
||||
int flags)
|
||||
: Single_vfs_handle { ds, fs, alloc, flags },
|
||||
_env(env),
|
||||
_vfs_user(vfs_user),
|
||||
_pkt_alloc(&alloc),
|
||||
_nic(_env, &_pkt_alloc, BUF_SIZE, BUF_SIZE, label.string()),
|
||||
_link_state(_nic.link_state())
|
||||
|
@ -41,6 +41,7 @@ class Genode::Uplink_client_base : Noncopyable
|
||||
enum { BUF_SIZE = Uplink::Session::QUEUE_SIZE * PKT_SIZE };
|
||||
|
||||
Env &_env;
|
||||
Vfs::Env::User &_vfs_user;
|
||||
Allocator &_alloc;
|
||||
Label const &_label;
|
||||
Net::Mac_address _drv_mac_addr;
|
||||
@ -63,6 +64,8 @@ class Genode::Uplink_client_base : Noncopyable
|
||||
|
||||
if (_custom_conn_rx_ready_to_ack_handler())
|
||||
_custom_conn_rx_handle_ready_to_ack();
|
||||
|
||||
_vfs_user.wakeup_vfs_user();
|
||||
}
|
||||
|
||||
void _conn_tx_handle_ack_avail()
|
||||
@ -72,6 +75,8 @@ class Genode::Uplink_client_base : Noncopyable
|
||||
|
||||
while (_conn->tx()->ack_avail()) {
|
||||
_conn->tx()->release_packet(_conn->tx()->get_acked_packet()); }
|
||||
|
||||
_vfs_user.wakeup_vfs_user();
|
||||
}
|
||||
|
||||
void _conn_rx_handle_packet_avail()
|
||||
@ -81,6 +86,8 @@ class Genode::Uplink_client_base : Noncopyable
|
||||
|
||||
if (_custom_conn_rx_packet_avail_handler())
|
||||
_custom_conn_rx_handle_packet_avail();
|
||||
|
||||
_vfs_user.wakeup_vfs_user();
|
||||
}
|
||||
|
||||
|
||||
@ -203,11 +210,13 @@ class Genode::Uplink_client_base : Noncopyable
|
||||
public:
|
||||
|
||||
Uplink_client_base(Env &env,
|
||||
Vfs::Env::User &vfs_user,
|
||||
Allocator &alloc,
|
||||
Net::Mac_address const &drv_mac_addr,
|
||||
Label const &label)
|
||||
:
|
||||
_env { env },
|
||||
_vfs_user { vfs_user },
|
||||
_alloc { alloc },
|
||||
_label { label },
|
||||
_drv_mac_addr { drv_mac_addr }
|
||||
|
@ -87,6 +87,7 @@ class Vfs::Uplink_file_system::Uplink_vfs_handle : public Single_vfs_handle,
|
||||
public:
|
||||
|
||||
Uplink_vfs_handle(Genode::Env &env,
|
||||
Vfs::Env::User &vfs_user,
|
||||
Allocator &alloc,
|
||||
Label const &label,
|
||||
Net::Mac_address const &mac,
|
||||
@ -94,7 +95,7 @@ class Vfs::Uplink_file_system::Uplink_vfs_handle : public Single_vfs_handle,
|
||||
File_io_service &fs,
|
||||
int flags)
|
||||
: Single_vfs_handle { ds, fs, alloc, flags },
|
||||
Uplink_client_base { env, alloc, mac, label }
|
||||
Uplink_client_base { env, vfs_user, alloc, mac, label }
|
||||
{ _drv_handle_link_state(true); }
|
||||
|
||||
bool notify_read_ready() override
|
||||
|
@ -124,12 +124,14 @@ class Vfs::Tap_file_system::Data_file_system : public FS
|
||||
Label const &_label;
|
||||
Net::Mac_address const &_default_mac;
|
||||
Genode::Env &_env;
|
||||
Vfs::Env::User &_vfs_user;
|
||||
Device_update_handler &_device_update_handler;
|
||||
Handle_registry _handle_registry { };
|
||||
|
||||
public:
|
||||
|
||||
Data_file_system(Genode::Env & env,
|
||||
Vfs::Env::User & vfs_user,
|
||||
Name const & name,
|
||||
Label const & label,
|
||||
Net::Mac_address const & mac,
|
||||
@ -137,7 +139,7 @@ class Vfs::Tap_file_system::Data_file_system : public FS
|
||||
:
|
||||
FS(name.string()),
|
||||
_name(name), _label(label), _default_mac(mac), _env(env),
|
||||
_device_update_handler(handler)
|
||||
_vfs_user(vfs_user), _device_update_handler(handler)
|
||||
{ }
|
||||
|
||||
/* must only be called if handle has been opened */
|
||||
@ -170,7 +172,7 @@ class Vfs::Tap_file_system::Data_file_system : public FS
|
||||
{
|
||||
if (!FS::_single_file(path))
|
||||
return Open_result::OPEN_ERR_UNACCESSIBLE;
|
||||
|
||||
|
||||
/* A tap device is exclusive open, thus return error if already opened. */
|
||||
unsigned handles = 0;
|
||||
_handle_registry.for_each([&handles] (Local_vfs_handle const &) {
|
||||
@ -180,8 +182,8 @@ class Vfs::Tap_file_system::Data_file_system : public FS
|
||||
|
||||
try {
|
||||
*out_handle = new (alloc)
|
||||
Registered_handle(_handle_registry, _env, alloc, _label.string(),
|
||||
_default_mac, *this, *this, flags);
|
||||
Registered_handle(_handle_registry, _env, _vfs_user, alloc,
|
||||
_label.string(), _default_mac, *this, *this, flags);
|
||||
_device_update_handler.device_state_changed();
|
||||
return Open_result::OPEN_OK;
|
||||
}
|
||||
@ -206,7 +208,8 @@ struct Vfs::Tap_file_system::Local_factory : File_system_factory,
|
||||
Net::Mac_address const _default_mac;
|
||||
Vfs::Env &_env;
|
||||
|
||||
Data_file_system<FS> _data_fs { _env.env(), _name, _label, _default_mac, *this };
|
||||
Data_file_system<FS> _data_fs { _env.env(), _env.user(), _name, _label,
|
||||
_default_mac, *this };
|
||||
|
||||
struct Info
|
||||
{
|
||||
|
@ -58,6 +58,8 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
|
||||
Genode::Entrypoint &_ep;
|
||||
|
||||
Vfs::Env::User &_vfs_user;
|
||||
|
||||
Terminal::Connection &_terminal;
|
||||
|
||||
Interrupt_handler &_interrupt_handler;
|
||||
@ -110,6 +112,7 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
struct Terminal_vfs_handle : Single_vfs_handle
|
||||
{
|
||||
Terminal::Connection &_terminal;
|
||||
Vfs::Env::User &_vfs_user;
|
||||
Read_buffer &_read_buffer;
|
||||
Interrupt_handler &_interrupt_handler;
|
||||
|
||||
@ -119,6 +122,7 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
bool blocked = false;
|
||||
|
||||
Terminal_vfs_handle(Terminal::Connection &terminal,
|
||||
Vfs::Env::User &vfs_user,
|
||||
Read_buffer &read_buffer,
|
||||
Interrupt_handler &interrupt_handler,
|
||||
Directory_service &ds,
|
||||
@ -129,6 +133,7 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
:
|
||||
Single_vfs_handle(ds, fs, alloc, flags),
|
||||
_terminal(terminal),
|
||||
_vfs_user(vfs_user),
|
||||
_read_buffer(read_buffer),
|
||||
_interrupt_handler(interrupt_handler),
|
||||
_raw(raw)
|
||||
@ -211,11 +216,14 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
handle.read_ready_response();
|
||||
}
|
||||
});
|
||||
|
||||
_vfs_user.wakeup_vfs_user();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Data_file_system(Genode::Entrypoint &ep,
|
||||
Vfs::Env::User &vfs_user,
|
||||
Terminal::Connection &terminal,
|
||||
Name const &name,
|
||||
Interrupt_handler &interrupt_handler,
|
||||
@ -223,7 +231,7 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
:
|
||||
Single_file_system(Node_type::TRANSACTIONAL_FILE, name.string(),
|
||||
Node_rwx::rw(), Genode::Xml_node("<data/>")),
|
||||
_name(name), _ep(ep), _terminal(terminal),
|
||||
_name(name), _ep(ep), _vfs_user(vfs_user), _terminal(terminal),
|
||||
_interrupt_handler(interrupt_handler),
|
||||
_raw(raw)
|
||||
{
|
||||
@ -243,9 +251,9 @@ class Vfs::Terminal_file_system::Data_file_system : public Single_file_system
|
||||
|
||||
try {
|
||||
*out_handle = new (alloc)
|
||||
Registered_handle(_handle_registry, _terminal, _read_buffer,
|
||||
_interrupt_handler, *this, *this, alloc, flags,
|
||||
_raw);
|
||||
Registered_handle(_handle_registry, _terminal, _vfs_user,
|
||||
_read_buffer, _interrupt_handler,
|
||||
*this, *this, alloc, flags, _raw);
|
||||
return OPEN_OK;
|
||||
}
|
||||
catch (Genode::Out_of_ram) { return OPEN_ERR_OUT_OF_RAM; }
|
||||
@ -274,11 +282,13 @@ struct Vfs::Terminal_file_system::Local_factory : File_system_factory,
|
||||
|
||||
Genode::Env &_env;
|
||||
|
||||
Vfs::Env::User &_vfs_user;
|
||||
|
||||
Terminal::Connection _terminal { _env, _label.string() };
|
||||
|
||||
bool const _raw;
|
||||
|
||||
Data_file_system _data_fs { _env.ep(), _terminal, _name, *this, _raw };
|
||||
Data_file_system _data_fs { _env.ep(), _vfs_user, _terminal, _name, *this, _raw };
|
||||
|
||||
struct Info
|
||||
{
|
||||
@ -336,6 +346,7 @@ struct Vfs::Terminal_file_system::Local_factory : File_system_factory,
|
||||
_label(config.attribute_value("label", Label(""))),
|
||||
_name(name(config)),
|
||||
_env(env.env()),
|
||||
_vfs_user(env.user()),
|
||||
_raw(config.attribute_value("raw", false))
|
||||
{
|
||||
_terminal.size_changed_sigh(_size_changed_handler);
|
||||
|
Loading…
Reference in New Issue
Block a user