This way you won't need to install raylib as a dependency in order to
use it. You'll still need its dependencies, like glfw, but this
should remove one layer of indirection.
commit a763bff532
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:33:13 2025 +0000
Added release mode building
Now the build script enables you to:
- Build in debug mode (default no arguments)
- Build in debug mode then run (`run` argument)
- Build in release mode (`release` argument)
commit 7112937b0b
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:30:50 2025 +0000
Better thread pool constructor
statically define a number of threads, then setup the necessary
machinery to make it work.
commit a5666328b7
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:29:32 2025 +0000
Fixed the heap-use-after-free issue.
Just standard multithreading stuff; access to the allocator while hot
threads are running means stuff can change underneath us even /during/
a read. I've mutex locked state for stuff in the drawing domain which
stops this issue.
commit 5d78cb20df
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:28:21 2025 +0000
Adjust TODOs
commit 9d3a202c27
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:09:50 2025 +0000
Implement stepping via KEY_SPACE
commit 424fab2e40
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:08:01 2025 +0000
Weird bug in draw_tree
Seems near the 100,000 node mark, the vector craps itself? I keep
getting "heap use after free" errors here when trying to access the
allocator vector. Disabling fsan just leads to a segment fault near
the same point.
I think we might need to introduce our own vector :)
commit 6ffa63f7ac
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 04:07:43 2025 +0000
Make general delay 1ms
Just for my puny eyes to see.
commit 2dbe3d0a58
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 03:54:30 2025 +0000
merge generate_children into do_iteration
Also fix this really weird slow down we get from doing direct mutation
to a state.allocator.get_ref (i.e. a Node by reference). Maybe the
compiler just can't inline that instruction? Regardless, this patch
fixes the slow downs!
commit 7e801df280
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 03:53:51 2025 +0000
no more numerics
commit f70517cf41
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Dec 12 03:08:56 2025 +0000
Simplify mutex locking scheme (lock at start, unlock at end)
commit 00858cf74f
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Nov 28 17:24:33 2025 +0000
Rewrite main to draw based on our new state/draw_state
Arranges a thread set, draws based on draw_state. No need to lock the
mutex since drawing should only require reading. Still has a timer in
case we need to do timed checks.
commit 3e065e50a9
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Nov 28 17:24:12 2025 +0000
Disable previous work
We're going to rewrite this
commit ab0f152742
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Nov 28 17:23:05 2025 +0000
Define `worker` function which a thread should run
Pauses until state.pause_work is false (checking every
THREAD_PAUSE_DELAY), then performs an iteration. Quits when
state.quit_work is true (based on loop). Generally delays itself by
THREAD_GENERAL_DELAY.
commit 014821ceb5
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Nov 28 17:22:39 2025 +0000
Added booleans for thread workers to look at when running
pause_work temporarily stops work, but should keep the thread alive.
stop_work should kill the thread.
commit 1bd8a9f7b2
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Fri Nov 28 17:21:21 2025 +0000
Add run component to build script, activated by passing argument `run`
commit 6f620644bf
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:57:10 2025 +0000
Define constructors for state.hpp explicitly
commit 0008c31f53
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:53:10 2025 +0000
Add src/worker.cpp to build pipeline
commit f8068c4a15
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:52:52 2025 +0000
Implement the two worker functions
commit 66c56f2c15
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:51:41 2025 +0000
Define thread safe worker functions for generating new children on the tree
commit 6247f2af49
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:44:23 2025 +0000
Add src/state.cpp to the build pipeline
commit 40e07e03f2
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:42:24 2025 +0000
Add mutexes to state for the queue and the allocator
Our threads need to negotiate access and mutation to the two
resources - we don't want them treading on each others toes when
generating new child nodes /or/ when trying to remove/add work to the
queue. The former situation is particularly worrisome due to how weak
the indexing system is with the allocator.
commit 0abd353368
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:30:35 2025 +0000
Implement cw::state::DrawState::compute_bounds
commit 0ac316ada4
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:30:21 2025 +0000
Define the general state of the sim (extract from main.cpp)
commit a03fa13a07
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:19:52 2025 +0000
Implementation (copied from numerics)
commit ff9a2851d4
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:19:41 2025 +0000
Switch to using i64's instead of optional u64 in Node
commit 6c2bc93874
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:12:35 2025 +0000
remove index_t definition
conflicts with prev code base.
Also std::optional doubles the size of the underlying type.
horrifying! I don't want to have to give 16 bytes over for something
that could be embedded in the 8 bytes of the u64 directly. I'm
thinking we could just use i64's instead, sacrificing that top bit to
indicate if the value is present or not.
commit 7a4d158d2f
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 01:02:31 2025 +0000
Add gcd to base.hpp
commit e032303773
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 00:56:45 2025 +0000
Define node.hpp (move definitions away from numerics.hpp)
commit 9821a2ab15
Author: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu Nov 27 00:55:44 2025 +0000
Define basic type aliases and useful functions/macros for use throughout the system
The left, currently processed (centre) and right fractions are
returned by iterate. This allows us to see exactly what fractions
have been generated/worked on in every iteration.
One God structure which will hold all the necessary state, ensuring I
only need to compute stuff like bounds at most once, better than
computing it on every draw (which is WAY slower at scale).
Using a stack or queue, we can replace a function recursive tree
traversal with a single call. A stack would make it a DFS while a
queue would be a BFS. Since there's only ever two children, and at
high iteration counts we're getting quite large depth, it would be
best to do a DFS, hence the stack.
Draws the current node by converting its norm value (which is in
(lower, upper)) to a screen value, drawing a line there.
It then recurs on the children of the node.
Abstracting the interface more, such that callers can use functions
rather than accessing internals directly, allows me to refactor the
allocator without having to do a ton of edits all across the source
tree.
Node constructor is now completely default constructed i.e. no
constructor arguments required. The iterate function takes the queue
by reference, so it can update the caller's state.
Finally, to_string for a Node now uses the node allocator and an index
to print out trees. Seems simpler and more in line with the current
implementation.
Separates the (basically) completed cw_tree implementation in a
separate module so we can spend time implementing graphics in main.
NOTE: nodes are now generated from a node allocator, which just wraps
around the vector. We also take an allocator and queue by reference
in the iterate procedure now.
An index is a pointer, and they don't change if the vector decides to
reallocate internally unlike the bastardised pointers I was rolling up
before. This simplifies design a bit.