Photon v0.13.0 with offload
Paolo Invernizzi
paolo.invernizzi at gmail.com
Sun Aug 31 14:38:27 UTC 2025
On Monday, 18 August 2025 at 15:20:14 UTC, Dmitry Olshansky wrote:
> On Saturday, 16 August 2025 at 14:51:45 UTC, Dmitry Olshansky
> wrote:
>> [...]
>
> Actually that should be 0.5.5 :)
>
> And v0.13.0 brings new feature - offload to run compute
> intensive tasks outside of scheduler. Certain syscalls are
> automatically routed through it to avoid blocking fibers such
> as file I/O. Here is simple example using goOnSameThread to
> make sure we are actually sharing just a single eventloop
> thread out of many and yet it doesn't block.
>
> import photon;
>
> double gauss(double a, double b, double function(double) f,
> double step) {
> double sum = 0.0;
> for (double x = a; x < b; x += step) {
> sum += (f(x+step) + f(x))/2 * step;
> }
> return sum;
> }
>
> void boom() {
> throw new Exception("Boom!");
> }
>
> long fib(long n) {
> if (n <= 2) return 1;
> else {
> return offload(() => fib(n-1)) + offload(() =>
> fib(n-2));
> }
> }
>
> void main() {
> startloop();
> go({
> goOnSameThread({
> writeln("Blocking computation");
> writeln("Integral:", gauss(0.0, 10.0, x => x*x,
> 1e-7));
> });
> goOnSameThread({
> writeln("Blocking computation");
> writeln("Integral:", gauss(0.0, 10.0, x => x*x,
> 1e-7));
> });
> goOnSameThread({
> writeln("Nonblocking computation");
> writeln("Integral: ", offload(() => gauss(0.0,
> 10.0, x => x*x, 1e-7)));
> });
> goOnSameThread({
> writeln("Nonblocking computation");
> writeln("Integral: ", offload(() => gauss(0.0,
> 10.0, x => x*x, 1e-7)));
> });
> goOnSameThread({
> writeln("Catching exception from offloaded
> computation");
> try {
> offload(&boom);
> assert(0);
> } catch(Exception e) {
> assert(e.msg == "Boom!");
> }
> });
> goOnSameThread({
> writeln("Recursive offload");
> writeln("Fib(15):", offload(() => fib(15)));
> });
> });
> runFibers();
> }
>
> Other photon examples:
> https://github.com/DmitryOlshansky/photon/tree/master
I tried to include all the sources of photon in a application
that it's cross-compiled to linux (Pi5, AArch64) and cross-linked
with some C libs, and I'm seeing this:
```
2025-08-31T16:22:18.438 [error] extern(C) private ssize_t
close(int fd) nothrow
src/photon/linux/core.d(1150,27): Previous IR type: i32
(i32)
src/photon/linux/core.d(1150,27): New IR type: i64
(i32)
```
In linux.core.d: extern(C) private ssize_t close(int fd) nothrow
but `man 2 close` is `int close(int fd)`, it's a bug?
More information about the Digitalmars-d-announce
mailing list