mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-10-23 06:44:00 +03:00
When its server stops answering, a hard NFS mount (or SMB, SSHFS...) blocks every call on it, and
the blocked thread can't be interrupted. One dead mount used to take over the I/O pool, and
with it every local folder and the eefm UI waiting on them.
LocalIOScheduler (VirtualFileSystem::localIO()):
- Calls on local disks run on the I/O pool. Calls under a network mount run on that mount's own
lane of two threads. Mounts come from the mount table (/proc/self/mountinfo, getfsstat,
getvfsstat, UNC and mapped drives on Windows), which never blocks.
- A call that takes longer than Config::networkMountTimeout (15 s by default) fails with
TimedOut ("server:/export is not responding"), and so does every call queued behind it. Until
the stuck call returns, further calls on that mount fail at once; when it returns, its result
is discarded and the mount works again. Timeouts are delivered on their own thread, so they
never wait for a free pool worker.
- A path through a symbolic link into a mount runs on that mount's lane. While any network
mount is mounted, the links are read on the I/O pool, stopping where the path enters a mount.
Renames, opens and watches route the same way. On Windows, links are not followed yet.
- A timed-out read never writes into the caller's buffer afterwards: it reads into its own
buffer, which is copied only while the caller still waits. A network write works from a copy.
Closing a directory whose read is stuck doesn't wait; the read closes it when it ends.
- The scheduler holds the pool weakly. Once the pool is released, every call, network ones
included, fails with Cancelled. Destroying the scheduler, a lane or the watchdog on one of
their own threads detaches that thread instead of joining it.
- submit(), submitResolved( path, followLast ), submitOnSameRoute() and submitCommitted()
let applications run their own blocking work on a path with the same protection.
LocalProvider:
- Runs its calls through the scheduler. Listing a local folder never asks a mount's server: a
network mount inside it is listed as a folder without metadata, and a link into a mount
without its target's type. A rename across mounts fails with Unsupported, so a move copies
and removes instead. localpath.hpp is replaced by FileSystem helpers.
- LocalWatchBackend watches directories on network mounts by polling through the VFS
(PollingWatchBackend), whose calls time out, instead of with efsw.
eefm:
- Header checks when opening files, trash operations and the trash's .trashinfo cleanup run
through localIO(). Each opened file is routed by its own path.
- A timed-out or lost location shows "(F5 to retry)".
Rename: VFS::FileInfo is now VFSFileInfo, as with VFSTask and VFSError. It no longer clashes
with System::FileInfo, so sources can use `using namespace EE::System;`.
Fix: DataDrop is EE_API. eefm's arkdrop.cpp failed to link DataDrop::find() on MSVC.
Docs: vfs.md documents network mounts and localIO().
Tests: LocalIOScheduler unit tests cover routing, timeouts, fail-fast, links into a mount,
caller memory, teardown from lane threads and a released pool.
eepp articles
Use this page to find the guide for the task you are doing. The articles explain eepp's supported behavior; class headers and current source code remain the reference for API details.
| Task | Start here | Follow up with |
|---|---|---|
| Build a first UI with XML and CSS | UI introduction | Application UI authoring |
| Create or change an application screen | Application UI authoring | Native layout reference, CSS for application UI |
| Look up a CSS property, selector, or value | CSS specification | CSS for application UI when styling native widgets |
| Render HTML or Markdown content | HTML compatibility layer | CSS specification for supported properties and values |
| Preview and edit native XML/CSS layouts | UI editor | Application UI authoring, Runtime UI inspector |
Support right-to-left languages or logical start/end layouts |
UI direction and RTL | CSS specification for direction and flow-relative properties |
| Inspect or automate a running UI | Runtime UI inspector | Application UI authoring for a layout debugging workflow |
| Bind application data or commands to widgets | UI data binding | Application UI authoring for screen structure |
| Make native widgets accessible | UI accessibility | Application UI authoring for screen structure |
| Work on the accessibility implementation | UI accessibility architecture | UI accessibility for the application-facing behavior |
| Add an interactive chart | UI charts | Application UI authoring for placement and sizing |
| Run async work: tasks, results, executors, cancellation | Async core | include/eepp/core/task.hpp and the other headers it lists |
| Read or write files through URIs (local, packs, SFTP), watch directories | Virtual file system | Async core, the src/modules/vfs/include/eepp/vfs/ headers |
Work on eterm Kitty support |
Keyboard protocol, graphics protocol | The corresponding src/modules/eterm/ implementation and tests |
Native application widgets and HTML documents have different layout behavior. Start with
application UI authoring for toolbars, dialogs, forms, and editor windows;
start with HTML compatibility for UIWebView and UIMarkdownView.