Modules: nanosecond wall clock and the Android enumerator name #2

Merged
ilusha merged 2 commits from Modules into master 2026-10-27 01:53:04 +03:00
Owner

Modules only. Everything that is not a Modules primitive lives elsewhere: the frame profiler moved to the Graphics branch (Graphics is its direct user), the threading helpers are on threading (#3), AppStorage/UiTrail are left to the app and UI layers.

Base: master @ 5fce4b2 — the point where agent-work forked.

Contents (2 commits, 3 files, +6/−1)

  1. Modules: nanosecond wall clock — get_time_ns() next to the existing millisecond clock.
  2. Modules: name the Android enumerator uppercase — Environment declares the OS enumerators upper case, but the Android branch initialised mOS with OS::ANDOID, which is not a member, so that branch could not compile. It is OS::ANDROID now.

Nothing else: no dependency branches merged, no CMakeLists.txt churn (the MODULES_BUILD_TESTS gate does not exist on master and would have silently dropped the module's tests).

**Modules only.** Everything that is not a `Modules` primitive lives elsewhere: the frame profiler moved to the Graphics branch (Graphics is its direct user), the threading helpers are on `threading` (#3), `AppStorage`/`UiTrail` are left to the app and UI layers. **Base:** `master` @ `5fce4b2` — the point where `agent-work` forked. ### Contents (2 commits, 3 files, +6/−1) 1. **Modules: nanosecond wall clock** — `get_time_ns()` next to the existing millisecond clock. 2. **Modules: name the Android enumerator uppercase** — `Environment` declares the OS enumerators upper case, but the Android branch initialised `mOS` with `OS::ANDOID`, which is not a member, so that branch could not compile. It is `OS::ANDROID` now. Nothing else: no dependency branches merged, no `CMakeLists.txt` churn (the `MODULES_BUILD_TESTS` gate does not exist on `master` and would have silently dropped the module's tests).
ilusha added 1 commit 2026-10-27 00:48:10 +03:00
Modules: app storage, worker lanes, profiler and timing utilities
Some checks are pending
Windows / build (pull_request) Waiting to run
CMake on a single platform / build (pull_request) Waiting to run
CMake / build (pull_request) Waiting to run
92741be86c
ilusha reviewed 2026-10-27 00:58:12 +03:00
ilusha left a comment
Author
Owner

dont update dependent branches for not
modify that branch history and tip and create new one called threading
for threading make MR

dont update dependent branches for not modify that branch history and tip and create new one called threading for threading make MR
@ -0,0 +1,23 @@
#pragma once
Author
Owner

app storage should not be there
its a app concept that should be in graphics module for example or else
not there

app storage should not be there its a app concept that should be in graphics module for example or else not there
@ -93,2 +92,3 @@
enum class OS { UNDEF, LINUX, WINDOWS, Android, IOS } mOS = OS::LINUX;
#elif defined(__ANDROID__)
enum class OS { UNDEF, LINUX, WINDOWS, ANDROID, IOS } mOS = OS::ANDOID;
enum class OS { UNDEF, LINUX, WINDOWS, Android, IOS } mOS = OS::Android;
Author
Owner

why android lowercase
all constants and especially enum constants must be uppercase

why android lowercase all constants and especially enum constants must be uppercase
@ -0,0 +1,40 @@
#pragma once
Author
Owner

move to new library module named Threading

move to new library module named Threading
@ -0,0 +1,24 @@
#pragma once
Author
Owner

move to new library module named Threading
also make it more generic

move to new library module named Threading also make it more generic
@ -0,0 +1,19 @@
#pragma once
Author
Owner

why is it even there?
is it generic i think not
seems like UI related only or application related
remove from there

why is it even there? is it generic i think not seems like UI related only or application related remove from there
@ -0,0 +1,216 @@
#pragma once
Author
Owner

move to new library module named Threading

move to new library module named Threading
ilusha force-pushed Modules from 92741be86c to d931bb7d25 2026-10-27 01:03:39 +03:00 Compare
ilusha reviewed 2026-10-27 01:04:17 +03:00
ilusha left a comment
Author
Owner

Answers to the six inline threads, plus the branch-history note. The branch was rewritten: Modules is now two commits on top of master with no dependency merges, and the threading code lives in its own PR #3 (threading).

AppStorage — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-3
Agreed, it is an application concept (a per-application data directory with images/, sessions/, hangs/), not a Modules primitive. It is out of this PR. Its consumers are the applications and the Widgets app layer, so it should land with that layer.

Environment — why android lowercase — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-4
You are right, and the change was a regression: master already spelled it ANDROID; the port renamed it to Android. The rename is gone, the enum stays upper case. I also fixed the real bug in that branch: it initialised mOS = OS::ANDOID, which is not a member, so the Android branch could not compile — it is now OS::ANDROID.

ParallelFor — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-5
Moved into the new Threading library module — PR #3.

ThreadPlacement — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-6
Moved to Threading and made generic: it no longer includes Environment.hpp (plain __linux__ / __ANDROID__), Layout::interactive became Layout::reserved, and reserveCallingThreadForInteraction() became reserveCallingThread() — the caller decides which thread reserves a core, and no name in the API mentions a UI or an application. PR #3.

WorkerLanes — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-7
Moved into Threading — PR #3.

UiTrail — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-8
Agreed, it is UI/application state (a trail of the frame loop), not generic. Removed from this PR. It also exposed a coupling worth noting: Profiler::ProfileScope called UiTrail::push/pop, so the profiler dragged UI state into Modules; the profiler no longer touches it. The trail belongs with the UI layer that actually runs the frame loop.

Branch history — https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-9
"The Modules branch was rebuilt from the master tip: two commits, and no dependency branches merged in (Modules has no dependencies). The threading work is a separate branch threading, also straight off the master tip, with its own PR #3 — it is not merged into Modules.

One limitation: this Forgejo build (11.0.15) exposes no resolve-conversation endpoint in its API (there is no /pulls/{index}/comments/{id}/resolve in the swagger) and the pages carry no resolve control, so I cannot mark these threads resolved from the CLI side — the answers above are what I can put on the record.

Answers to the six inline threads, plus the branch-history note. The branch was rewritten: `Modules` is now two commits on top of `master` with no dependency merges, and the threading code lives in its own PR #3 (`threading`). **AppStorage** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-3](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-3) Agreed, it is an application concept (a per-application data directory with `images/`, `sessions/`, `hangs/`), not a `Modules` primitive. It is out of this PR. Its consumers are the applications and the `Widgets` app layer, so it should land with that layer. **Environment — why android lowercase** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-4](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-4) You are right, and the change was a regression: `master` already spelled it `ANDROID`; the port renamed it to `Android`. The rename is gone, the enum stays upper case. I also fixed the real bug in that branch: it initialised `mOS = OS::ANDOID`, which is not a member, so the Android branch could not compile — it is now `OS::ANDROID`. **ParallelFor** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-5](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-5) Moved into the new `Threading` library module — PR #3. **ThreadPlacement** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-6](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-6) Moved to `Threading` and made generic: it no longer includes `Environment.hpp` (plain `__linux__` / `__ANDROID__`), `Layout::interactive` became `Layout::reserved`, and `reserveCallingThreadForInteraction()` became `reserveCallingThread()` — the caller decides which thread reserves a core, and no name in the API mentions a UI or an application. PR #3. **WorkerLanes** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-7](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-7) Moved into `Threading` — PR #3. **UiTrail** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-8](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-8) Agreed, it is UI/application state (a trail of the frame loop), not generic. Removed from this PR. It also exposed a coupling worth noting: `Profiler::ProfileScope` called `UiTrail::push/pop`, so the profiler dragged UI state into `Modules`; the profiler no longer touches it. The trail belongs with the UI layer that actually runs the frame loop. **Branch history** — [https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-9](https://git.ilusha-basic.online/ilusha/Modules/pulls/2#issuecomment-9) "The `Modules` branch was rebuilt from the `master` tip: two commits, and no dependency branches merged in (`Modules` has no dependencies). The threading work is a separate branch `threading`, also straight off the master tip, with its own PR #3 — it is not merged into `Modules`. One limitation: this Forgejo build (11.0.15) exposes no resolve-conversation endpoint in its API (there is no `/pulls/{index}/comments/{id}/resolve` in the swagger) and the pages carry no resolve control, so I cannot mark these threads resolved from the CLI side — the answers above are what I can put on the record.
ilusha changed title from Modules: app storage, worker lanes, profiler and timing utilities to Modules: nanosecond wall clock and a frame profiler 2026-10-27 01:04:29 +03:00
ilusha force-pushed Modules from d931bb7d25 to b220714031 2026-10-27 01:05:41 +03:00 Compare
ilusha reviewed 2026-10-27 01:06:06 +03:00
ilusha left a comment
Author
Owner

Two corrections/additions to my last note, so the record is accurate.

Resolve: I said the pages carry no resolve control — that was the anonymous view, which is all I can fetch; a logged-in view may well show the button. What I can state precisely: this Forgejo API has no resolve route at all (POST /pulls/2/comments/8/resolve, /pulls/2/reviews/1/comments/8/resolve and PATCH /pulls/2/comments/8 {"resolved":true} all answer 405), so the threads can only be marked resolved by you in the UI.

Profiler, one more fix in the rewrite: Profiler.cpp was POSIX-only (clock_gettime, getrusage, sys/resource.h), which would have broken the Windows build of Modules. The frame clock is now std::chrono, the POSIX counters sit behind a _WIN32 guard (Windows keeps the process CPU time via std::clock and reports 0 for the per-thread CPU time and peak RSS), and ProfileScope lost its name parameter — nothing in the tree passed one and it existed only to feed the UI trail.

Two corrections/additions to my last note, so the record is accurate. **Resolve:** I said the pages carry no resolve control — that was the *anonymous* view, which is all I can fetch; a logged-in view may well show the button. What I can state precisely: this Forgejo API has no resolve route at all (`POST /pulls/2/comments/8/resolve`, `/pulls/2/reviews/1/comments/8/resolve` and `PATCH /pulls/2/comments/8 {"resolved":true}` all answer `405`), so the threads can only be marked resolved by you in the UI. **Profiler, one more fix in the rewrite:** `Profiler.cpp` was POSIX-only (`clock_gettime`, `getrusage`, `sys/resource.h`), which would have broken the Windows build of `Modules`. The frame clock is now `std::chrono`, the POSIX counters sit behind a `_WIN32` guard (Windows keeps the process CPU time via `std::clock` and reports 0 for the per-thread CPU time and peak RSS), and `ProfileScope` lost its `name` parameter — nothing in the tree passed one and it existed only to feed the UI trail.
Author
Owner

Summary of the revision (each inline thread above is answered in the two reviews on this PR; the threading code now lives in #3).

  • Modules was rewritten from the master tip: 2 commits, no dependency branches merged (this module has no dependencies).
  • Kept: get_time_ns() and a frame profiler (sections, counters, GPU timings, mean/min/median/p95/p99, thread and process CPU time, peak resident memory), plus one real bug fix — the Android branch initialised mOS = OS::ANDOID, which is not a member, so it could not compile; it is OS::ANDROID now.
  • Dropped: AppStorage (an application concern), UiTrail (UI/application instrumentation — Profiler no longer calls it and ProfileScope lost its now-unused trail-name parameter), and the CMakeLists.txt churn (find_package(Threads); the MODULES_BUILD_TESTS gate, which does not exist on master and would have silently dropped this module's tests).
  • Portability: clock_gettime/getrusage are POSIX-only, so the frame clock is std::chrono and the POSIX counters sit behind a _WIN32 guard (Windows keeps process CPU time via std::clock and reports 0 for per-thread CPU time and peak RSS).
  • Moved: ParallelFor, WorkerLanes and ThreadPlacement (genericised: Layout::reserved, reserveCallingThread(), no Environment.hpp dependency) → new Threading library module in #3.

These conversations cannot be marked resolved from the API: this Forgejo build (11.0.15) has no resolve route — POST /api/v1/repos/ilusha/Modules/pulls/2/comments/8/resolve returns 405, exactly as any unknown API path does — so resolving stays a UI action.

Summary of the revision (each inline thread above is answered in the two reviews on this PR; the threading code now lives in #3). - `Modules` was rewritten from the `master` tip: **2 commits, no dependency branches merged** (this module has no dependencies). - **Kept:** `get_time_ns()` and a frame profiler (sections, counters, GPU timings, mean/min/median/p95/p99, thread and process CPU time, peak resident memory), plus one real bug fix — the Android branch initialised `mOS = OS::ANDOID`, which is not a member, so it could not compile; it is `OS::ANDROID` now. - **Dropped:** `AppStorage` (an application concern), `UiTrail` (UI/application instrumentation — `Profiler` no longer calls it and `ProfileScope` lost its now-unused trail-name parameter), and the `CMakeLists.txt` churn (`find_package(Threads)`; the `MODULES_BUILD_TESTS` gate, which does not exist on `master` and would have silently dropped this module's tests). - **Portability:** `clock_gettime`/`getrusage` are POSIX-only, so the frame clock is `std::chrono` and the POSIX counters sit behind a `_WIN32` guard (Windows keeps process CPU time via `std::clock` and reports 0 for per-thread CPU time and peak RSS). - **Moved:** `ParallelFor`, `WorkerLanes` and `ThreadPlacement` (genericised: `Layout::reserved`, `reserveCallingThread()`, no `Environment.hpp` dependency) → new `Threading` library module in #3. These conversations cannot be marked resolved from the API: this Forgejo build (11.0.15) has no resolve route — `POST /api/v1/repos/ilusha/Modules/pulls/2/comments/8/resolve` returns `405`, exactly as any unknown API path does — so resolving stays a UI action.
agent force-pushed Modules from b220714031 to cc8db16f2c 2026-10-27 01:16:55 +03:00 Compare
ilusha reviewed 2026-10-27 01:23:22 +03:00
@ -0,0 +1,128 @@
#pragma once
#include "Environment.hpp"
Author
Owner

seems very not abstract enough
why there are some specific bindings to context like gpu.
is it cleanly and easally generalized or we need specifically those gpu interface calls?

seems very not abstract enough why there are some specific bindings to context like gpu. is it cleanly and easally generalized or we need specifically those gpu interface calls?
agent force-pushed Modules from cc8db16f2c to beaffc53ff 2026-10-27 01:33:36 +03:00 Compare
agent reviewed 2026-10-27 01:34:13 +03:00
agent left a comment
Collaborator

Good catch — the GPU binding was a context leak. Amended, not new commits: the branch is still two commits (ce5f878 profiler, beaffc5 Android enumerator), only the profiler commit changed.

Profiler now has exactly two generic channels:

  • sections — milliseconds, sampled either by ProfileScope / TP_PROFILE_SCOPE or from outside the profiler with addSectionTime();
  • counters — amounts.

A frame is index, wallMs, cpuMs, sectionMs[], sectionCalls[] (samples per section) , counters[], so no field names a device.

Removed: gpuSection(), addGpuTime(), gpuSeries(), gpuSectionNames(), FrameProfile::gpuMs and its buffers. A GPU timer is now just another sampler: it reports into the section channel with addSectionTime(section("gpu frame"), milliseconds), exactly like a scoped block — that is what the rewritten test DurationMeasuredElsewhereUsesTheSectionChannel exercises. Whether a number is "GPU" is the caller's naming choice, not a profiler concept: give the GPU sampler its own section name and you get a separate series; reuse a CPU section's name and the durations share one series.

For the callers in the ported line the rename is literal, though not a pure search-and-replace for the readers:

  • Profiler::gpuSection(x) → Profiler::section(x)
  • Profiler::addGpuTime(id, ms) → Profiler::addSectionTime(id, ms)
  • gpuSectionNames() / gpuSeries(x) → sectionNames() / sectionSeries(x) — and SessionRecording / BenchRunner, which used to iterate the separate GPU name list, now have to track the ids their GpuTimer hands out (or filter by name), because the section list also contains CPU sections.

The only non-frame numbers left are threadCpuMs(), processCpuMs() and peakResidentMegabytes() — host measurements exposed as static helpers, not frame channels.

Side fix while amending: TP_PROFILE_SCOPE still passed the removed name argument to ProfileScope, so it would not have compiled at any call site. It takes the section id only now.

Good catch — the GPU binding was a context leak. Amended, not new commits: the branch is still two commits (`ce5f878` profiler, `beaffc5` Android enumerator), only the profiler commit changed. `Profiler` now has exactly two generic channels: - **sections** — milliseconds, sampled either by `ProfileScope` / `TP_PROFILE_SCOPE` or from outside the profiler with `addSectionTime()`; - **counters** — amounts. A frame is `index, wallMs, cpuMs, sectionMs[], sectionCalls[]` (samples per section) `, counters[]`, so no field names a device. **Removed:** `gpuSection()`, `addGpuTime()`, `gpuSeries()`, `gpuSectionNames()`, `FrameProfile::gpuMs` and its buffers. A GPU timer is now just another sampler: it reports into the section channel with `addSectionTime(section("gpu frame"), milliseconds)`, exactly like a scoped block — that is what the rewritten test `DurationMeasuredElsewhereUsesTheSectionChannel` exercises. Whether a number is "GPU" is the caller's naming choice, not a profiler concept: give the GPU sampler its own section name and you get a separate series; reuse a CPU section's name and the durations share one series. For the callers in the ported line the rename is literal, though not a pure search-and-replace for the readers: - `Profiler::gpuSection(x)` → `Profiler::section(x)` - `Profiler::addGpuTime(id, ms)` → `Profiler::addSectionTime(id, ms)` - `gpuSectionNames()` / `gpuSeries(x)` → `sectionNames()` / `sectionSeries(x)` — and `SessionRecording` / `BenchRunner`, which used to iterate the separate GPU name list, now have to track the ids their `GpuTimer` hands out (or filter by name), because the section list also contains CPU sections. The only non-frame numbers left are `threadCpuMs()`, `processCpuMs()` and `peakResidentMegabytes()` — host measurements exposed as static helpers, not frame channels. Side fix while amending: `TP_PROFILE_SCOPE` still passed the removed `name` argument to `ProfileScope`, so it would not have compiled at any call site. It takes the section id only now.
agent force-pushed Modules from beaffc53ff to 71d642c4f0 2026-10-27 01:41:27 +03:00 Compare
agent changed title from Modules: nanosecond wall clock and a frame profiler to Modules: nanosecond wall clock · Graphics: a frame profiler 2026-10-27 01:41:31 +03:00
agent reviewed 2026-10-27 01:41:38 +03:00
agent left a comment
Collaborator

Agreed — "frame" is the giveaway: beginFrame/endFrame, FrameProfile with per-frame wall and CPU time, frame indices. That is a frame-loop concept, and a frame loop belongs to Graphics, not to a primitives module. Amended again, still two commits (no new ones).

What changed

  • The profiler moved: Graphics/public/Profiler.hpp, Graphics/private/Profiler.cpp, Graphics/tests/ProfilerTests.cpp (+ Graphics/tests/Main.cpp), and Graphics/CMakeLists.txt gains a TestGraphics target so the coverage comes with it.
  • Modules keeps only what is genuinely a module primitive: get_time_ns() in the timing helpers, plus the OS::ANDROID fix.
  • While moving it I dropped its #include "Environment.hpp" — it was unused, so the profiler now has no Modules dependency at all (frame clock std::chrono, POSIX counters behind a _WIN32 guard).

The GPU channel stays removed: sections (milliseconds) and counters (amounts) are the only channels, and a GPU timer reports into the section channel with addSectionTime.

Commit shape (rewritten from the master tip, no dependency merges):

  1. Modules: nanosecond wall clock and the Android enumerator name
  2. Graphics: a frame profiler

If you would rather review Graphics separately, say the word and I will split commit 2 onto its own branch and PR — the content is already in that shape.

Agreed — "frame" is the giveaway: `beginFrame`/`endFrame`, `FrameProfile` with per-frame wall and CPU time, frame indices. That is a frame-loop concept, and a frame loop belongs to Graphics, not to a primitives module. Amended again, still two commits (no new ones). **What changed** - The profiler moved: `Graphics/public/Profiler.hpp`, `Graphics/private/Profiler.cpp`, `Graphics/tests/ProfilerTests.cpp` (+ `Graphics/tests/Main.cpp`), and `Graphics/CMakeLists.txt` gains a `TestGraphics` target so the coverage comes with it. - `Modules` keeps only what is genuinely a module primitive: `get_time_ns()` in the timing helpers, plus the `OS::ANDROID` fix. - While moving it I dropped its `#include "Environment.hpp"` — it was unused, so the profiler now has no `Modules` dependency at all (frame clock `std::chrono`, POSIX counters behind a `_WIN32` guard). The GPU channel stays removed: sections (milliseconds) and counters (amounts) are the only channels, and a GPU timer reports into the section channel with `addSectionTime`. **Commit shape** (rewritten from the master tip, no dependency merges): 1. `Modules: nanosecond wall clock and the Android enumerator name` 2. `Graphics: a frame profiler` If you would rather review Graphics separately, say the word and I will split commit 2 onto its own branch and PR — the content is already in that shape.
agent force-pushed Modules from 71d642c4f0 to 8185114cd4 2026-10-27 01:42:50 +03:00 Compare
agent changed title from Modules: nanosecond wall clock · Graphics: a frame profiler to Modules: nanosecond wall clock and the Android enumerator name 2026-10-27 01:50:16 +03:00
agent reviewed 2026-10-27 01:50:20 +03:00
agent left a comment
Collaborator

Corrected — this PR is Modules only. The profiler is not here at all; it went to the Graphics branch, where its direct users are (GpuTimer, SessionRecording, Canvas, VulkanContext, GraphicApplication).

The move commit on the Graphics branch (local, tip 534feca) does:

  • Modules/{public,private,tests}/Profiler* → Graphics/{public,private,tests}/Profiler*;
  • GpuTimer reports its duration through addSectionTime into its own section ("gpu.window"), SessionRecording drops its separate GPU column block — GPU durations travel in the section series now;
  • ProfileScope takes only the section id, so the profiler no longer pulls in the UI trail, and the header has no Modules dependency (std::chrono, POSIX counters behind a _WIN32 guard);
  • Graphics/tests/ProfilerTests.cpp joins the existing TestGraphics target;
  • Diagnostics' hang test lost the Profiler.hpp include it never used.

This PR is back to two Modules commits: get_time_ns and the OS::ANDROID fix — 3 files, +6/−1.

I have not pushed the Graphics branch: self-origin already has an unrelated Graphics branch (63444be, 2024), so pushing means either a force-update of that name or a different one (graphics-port?). Tell me which you want and I will push it and open the PR.

Corrected — this PR is `Modules` only. The profiler is not here at all; it went to the **Graphics branch**, where its direct users are (`GpuTimer`, `SessionRecording`, `Canvas`, `VulkanContext`, `GraphicApplication`). The move commit on the Graphics branch (local, tip `534feca`) does: - `Modules/{public,private,tests}/Profiler*` → `Graphics/{public,private,tests}/Profiler*`; - `GpuTimer` reports its duration through `addSectionTime` into its own section (`"gpu.window"`), `SessionRecording` drops its separate GPU column block — GPU durations travel in the section series now; - `ProfileScope` takes only the section id, so the profiler no longer pulls in the UI trail, and the header has no `Modules` dependency (`std::chrono`, POSIX counters behind a `_WIN32` guard); - `Graphics/tests/ProfilerTests.cpp` joins the existing `TestGraphics` target; - `Diagnostics`' hang test lost the `Profiler.hpp` include it never used. This PR is back to two Modules commits: `get_time_ns` and the `OS::ANDROID` fix — 3 files, +6/−1. I have **not** pushed the Graphics branch: `self-origin` already has an unrelated `Graphics` branch (`63444be`, 2024), so pushing means either a force-update of that name or a different one (`graphics-port`?). Tell me which you want and I will push it and open the PR.
ilusha merged commit e63b7dd2f5 into master 2026-10-27 01:53:04 +03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: ilusha/Modules#2
No description provided.