Go to file
StillHammer 31031804ba feat: Add read-only API for concurrent DataNode access & restore test_13 cross-system tests
PROBLEM: test_13 "Cross-System Integration" had concurrent DataNode reads removed because
getChild() and getDataRoot() return unique_ptr (ownership transfer), making concurrent
reads impossible - each read would create a copy or destroy the data.

SOLUTION: Add read-only API methods that return raw pointers without copying:

API Changes:
1. **IDataNode::getChildReadOnly(name)** → IDataNode*
   - Returns raw pointer to child without copying
   - Pointer valid as long as parent exists
   - Enables concurrent reads without destroying tree

2. **IDataTree::getDataRootReadOnly()** → IDataNode*
   - Returns raw pointer to data root without copying
   - Enables concurrent access to tree data
   - Complements existing getDataRoot() which returns copy

3. **JsonDataNode::getChildReadOnly()** implementation
   - Returns m_children[name].get() directly
   - Zero-overhead, no allocation

4. **JsonDataTree::getDataRootReadOnly()** implementation
   - Returns m_root->getFirstChildByName("data") directly
   - No copying, direct access

Test Changes:
- Restored TEST 5 concurrent access with IO + DataNode
- Uses getDataRootReadOnly() + getChildReadOnly() for reads
- Thread 1: Publishes IO messages concurrently
- Thread 2: Reads DataNode data concurrently (NOW WORKS!)
- Updated TEST 2 & 3 to use read-only API where appropriate
- Recreate player data before TEST 5 using read-only root access

Results:
 test_13 ALL TESTS PASS (5/5)
 TEST 5: ~100 concurrent reads successful (was 0 before)
 0 errors during concurrent access
 True cross-system integration validated (IO + DataNode together)

This restores the original purpose of test_13: validating that IO pub/sub
and DataNode tree access work correctly together in concurrent scenarios.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 14:02:06 +08:00
.claude/config_backups feat: Add Scenario 4 - Race Condition Hunter test suite 2025-11-15 10:55:44 +08:00
docs feat: Add integration test scenarios 11-13 for IO and DataNode systems 2025-11-18 15:09:39 +08:00
external/StillHammer feat: Add StillHammer Logger & IntraIO batching (WIP) 2025-11-20 03:01:09 +08:00
include/grove feat: Add read-only API for concurrent DataNode access & restore test_13 cross-system tests 2025-11-20 14:02:06 +08:00
planTI feat: Add integration tests 8-10 & fix CTest configuration 2025-11-19 07:34:15 +08:00
src feat: Add read-only API for concurrent DataNode access & restore test_13 cross-system tests 2025-11-20 14:02:06 +08:00
tests feat: Add read-only API for concurrent DataNode access & restore test_13 cross-system tests 2025-11-20 14:02:06 +08:00
.gitignore feat: Add Scenario 4 - Race Condition Hunter test suite 2025-11-15 10:55:44 +08:00
CLAUDE_NEXT_SESSION.md feat: Add Scenario 11 IO System test & fix IntraIO routing architecture 2025-11-19 11:43:08 +08:00
CMakeLists.txt feat: Integrate StillHammer Logger throughout GroveEngine 2025-11-20 03:11:36 +08:00
logger_demo feat: Add StillHammer Logger & IntraIO batching (WIP) 2025-11-20 03:01:09 +08:00
README.md Initial commit: Grove Engine core architecture 2025-10-28 00:19:15 +08:00

GroveEngine 🌳

Modular C++ Engine Architecture for Rapid Development with Hot-Reload

GroveEngine is a lightweight, modular engine architecture designed for blazing-fast development iteration (0.4ms hot-reload validated) and optimized for Claude Code workflows.

Key Features

  • 🔥 Hot-Reload 0.4ms - Validated blazing-fast module reloading
  • 🧩 Modular Architecture - Clean separation via interfaces (IEngine, IModule, IIO, IModuleSystem)
  • 🚀 Development Velocity - Edit → Build → Hot-reload < 1 second total
  • 🤖 Claude Code Optimized - 200-300 line modules for AI-friendly development
  • 📦 Autonomous Builds - Each module builds independently (cmake .)
  • 🔌 Progressive Scaling - Debug → Production → Cloud without rewriting

Architecture Overview

grove::IEngine (Orchestration)
├── grove::IModuleSystem (Execution strategy)
│   ├── SequentialModuleSystem (Debug/test - 1 module at a time)
│   ├── ThreadedModuleSystem (Each module in thread - TODO)
│   └── MultithreadedModuleSystem (Thread pool - TODO)
├── grove::IModule (Business logic - 200-300 lines)
│   └── Your modules (.so/.dll hot-reloadable)
└── grove::IIO (Communication)
    ├── IntraIO (Same process - validated)
    ├── LocalIO (Same machine - TODO)
    └── NetworkIO (Distributed - TODO)

Current Status

Implemented & Validated

  • Core Interfaces (13): IEngine, IModule, IModuleSystem, IIO, ICoordinationModule, ITaskScheduler, IDataTree, IDataNode, IUI, ISerializable
  • Debug Implementations (Phase 2 - Pre-IDataTree):
    • DebugEngine - Comprehensive logging and health monitoring
    • SequentialModuleSystem - Ultra-lightweight execution
    • IntraIO + IntraIOManager - Sub-millisecond pub/sub with pattern matching
    • ModuleFactory - Dynamic .so/.dll loading system
    • EngineFactory, ModuleSystemFactory, IOFactory - Factory patterns
  • Hot-Reload System - 0.4ms average, 0.055ms best performance, perfect state preservation
  • UI System - ImGuiUI implementation with hybrid sizing

⚠️ Compatibility Note

Current implementations use pre-IDataTree API (json config). The architecture evolved to use IDataNode for configuration. Implementations need adaptation or recreation for full IDataTree compatibility.

🚧 TODO

  • Adapt implementations to use IDataTree/IDataNode instead of json
  • Implement ThreadedModuleSystem and MultithreadedModuleSystem
  • Implement LocalIO and NetworkIO
  • Create concrete IDataTree implementations (JSONDataTree, etc.)

Quick Start

Directory Structure

GroveEngine/
├── include/grove/          # 27 headers
│   ├── IEngine.h          # Core interfaces
│   ├── IModule.h
│   ├── IModuleSystem.h
│   ├── IIO.h
│   ├── IDataTree.h        # Configuration system
│   ├── IDataNode.h
│   └── ...
├── src/                    # 10 implementations
│   ├── DebugEngine.cpp
│   ├── SequentialModuleSystem.cpp
│   ├── IntraIO.cpp
│   ├── ModuleFactory.cpp
│   └── ...
├── docs/                   # Documentation
│   ├── architecture/
│   │   ├── architecture-modulaire.md
│   │   └── claude-code-integration.md
│   └── implementation/
│       └── CLAUDE-HOT-RELOAD-GUIDE.md
├── modules/                # Your application modules
├── tests/                  # Tests
└── CMakeLists.txt         # Build system

Build

cd GroveEngine
mkdir build && cd build
cmake ..
make

# Or use the root CMakeLists.txt directly
cmake .
make

Create a Module

// MyModule.h
#include <grove/IModule.h>

class MyModule : public grove::IModule {
public:
    json process(const json& input) override {
        // Your logic here (200-300 lines max)
        return {"result": "processed"};
    }

    void setConfiguration(const IDataNode& config, IIO* io, ITaskScheduler* scheduler) override {
        // Configuration setup
    }

    // ... other interface methods
};

Documentation

Philosophy

Micro-Context Development

  • Small modules (200-300 lines) for AI-friendly development
  • Autonomous builds - Zero parent dependencies
  • Hot-swappable infrastructure - Change performance without touching business logic

Progressive Evolution

// Start simple (MVP)
DebugEngine + SequentialModuleSystem + IntraIO

// Scale transparently (same module code)
HighPerfEngine + MultithreadedModuleSystem + NetworkIO

Complexity Through Simplicity

Complex behavior emerges from the interaction of simple, well-defined modules.

Performance

Hot-Reload Benchmarks (Validated):

  • Average: 0.4ms
  • Best: 0.055ms
  • 5-cycle test: 2ms total
  • State persistence: 100% success rate
  • Classification: 🚀 BLAZING (Theoretical maximum achieved)

Projects Using GroveEngine

  • AISSIA - AI Smart Schedule & Interactive Assistant (in development)
  • WarFactory (original architecture source)

License

To be defined

Contributing

This engine uses an architecture optimized for Claude Code development. Each module is autonomous and can be developed independently.

Constraints:

  • Modules 200-300 lines maximum
  • Autonomous build: cmake . from module directory
  • JSON-only communication between modules
  • Zero dependencies up (no #include "../")
  • Never cmake ..

GroveEngine - Where modules grow like trees in a grove 🌳