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