[Refactor] Shared VFS template for CoW foundation.

Refactors the Virtual file System creation process to improve memory
efficiency at scale. This is laying the ground work for a copy-on-write
system.

Previously, each new VFS instance was a full copy, which won't scale to
a large number of NPC's. Especially now that we are loading in entire
Lua scripts.

- Added VFSManager class which now manages the lifecycle of all VFS
  instances.
- VFSManager creates a single "template" VFS on initilisation. The
  template holds the shared, read-only directories like '/bin' and their
command scripts.
- When a new VFS is created (for a client or NPC), it links it's 'bin'
  directory to the shared template's '/bin' by pointer rather than
creating a copy of it.

this makes sure the content for *all* common command scripts exists in
memory only once, regardless of the number of NPC's we will later
generate.
This commit is contained in:
Ritchie Cunningham 2025-09-21 21:50:06 +01:00
parent 62d5f0526f
commit ea0605711d
4 changed files with 47 additions and 24 deletions

View File

@ -20,7 +20,8 @@ Terminal::Terminal(void) {
_should_close = false;
/* Create local file system for the client. */
_local_vfs = vfs_manager::create_root_system("local");
VFSManager vfs_manager;
_local_vfs = vfs_manager.create_vfs("local");
_local_cmd_processor = new CommandProcessor(_local_vfs);
_current_path = get_full_path(_local_cmd_processor->get_current_dir());
_scroll_offset = 0;

View File

@ -10,25 +10,16 @@ vfs_node* new_node(std::string name, vfs_node_type type, vfs_node* parent) {
return node;
}
vfs_node* vfs_manager::create_root_system(const std::string& system_type) {
/* Rood directory. */
vfs_node* root = new_node("/", DIR_NODE, nullptr);
/* Subdirectories. */
vfs_node* home = new_node("home", DIR_NODE, root);
vfs_node* bin = new_node("bin", DIR_NODE, root);
root->children["home"] = home;
root->children["bin"] = bin;
/* User diractory. */
vfs_node* user = new_node("user", DIR_NODE, home);
home->children["user"] = user;
/* Create file. */
vfs_node* readme = new_node("readme.txt", FILE_NODE, user);
readme->content = "Welcome to your new virtual machine.";
user->children["readme.txt"] = readme;
VFSManager::VFSManager(void) {
/* Create template VFS that holds shared, read-only directories. */
_vfs_root = new_node("/", DIR_NODE, nullptr);
vfs_node* bin = new_node("bin", DIR_NODE, _vfs_root);
_vfs_root->children["bin"] = bin;
/* TODO:
* Load all scripts from assets/scripts/bin into the bind node.
* We'll create ls.lua manually for now.
*/
vfs_node* ls_script = new_node("ls.lua", FILE_NODE, bin);
ls_script->content = R"lua(-- /bin/ls.lua - Lists files in a directory.
local dir = current_dir -- Get directory object from C++.
@ -46,6 +37,26 @@ vfs_node* vfs_manager::create_root_system(const std::string& system_type) {
)lua";
bin->children["ls.lua"] = ls_script;
}
VFSManager::~VFSManager(void) {
/* TODO: Implement recursive deletion of all created VFS nodes.*/
//delete _vfs_root;
}
vfs_node* VFSManager::create_vfs(const std::string& system_type) {
vfs_node* root = new_node("/", DIR_NODE, nullptr);
/* Create directories for this specific VFS. */
vfs_node* home = new_node("home", DIR_NODE, root);
vfs_node* user = new_node("user", DIR_NODE, home);
home->children["user"] = user;
vfs_node* readme = new_node("readme.txt", FILE_NODE, user);
readme->content = "Welcome to your new virtual machine.";
user->children["readme.txt"] = readme;
/* Link to the shared directories from the template. */
root->children["bin"] = _vfs_root->children["bin"];
if(system_type == "npc") {
vfs_node* npc_file = new_node("npc_system.txt", FILE_NODE, root);

View File

@ -1,7 +1,16 @@
#pragma once
#include <string>
#include "vfs.h"
namespace vfs_manager {
vfs_node* create_root_system(const std::string& system_type);
}
class VFSManager {
public:
VFSManager(void);
~VFSManager(void); /* TODO: Implement recursive VFS deletion. */
vfs_node* create_vfs(const std::string& system_type);
private:
vfs_node* _vfs_root;
};

View File

@ -9,10 +9,12 @@
int main(int argc, char** argv) {
printf("=== Server starting ===\n");
VFSManager vfs_manager;
/* Create the world map of networks. */
std::map<std::string, vfs_node*> world_vfs;
world_vfs["8.8.8.8"] = vfs_manager::create_root_system("npc"); /* Basic npc system. */
world_vfs["10.0.2.15"] = vfs_manager::create_root_system("npc"); /* Another one. */
world_vfs["8.8.8.8"] = vfs_manager.create_vfs("npc"); /* Basic npc system. */
world_vfs["10.0.2.15"] = vfs_manager.create_vfs("npc"); /* Another one. */
printf("Created world with %zu networks.\n", world_vfs.size());
/* Network manager now managed the whole world. */