Thread overview
Passing delegate indirectly to createLowLevelThread doesn't work
Jul 26, 2021
Tejas
Jul 26, 2021
Paul Backus
Jul 26, 2021
Tejas
Jul 26, 2021
Tejas
Jul 26, 2021
JG
Jul 26, 2021
Tejas
Jul 26, 2021
Adam D Ruppe
Jul 26, 2021
Tejas
July 26, 2021
import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    createLowLevelThread(&func, 2<<30);//works
    createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Can someone help?

July 26, 2021

On Monday, 26 July 2021 at 15:29:26 UTC, Tejas wrote:

>
import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    createLowLevelThread(&func, 2<<30);//works
    createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Can someone help?

The delegate must be nothrow:

void delegate() nothrow f;
July 26, 2021

On Monday, 26 July 2021 at 15:42:44 UTC, Paul Backus wrote:

>

On Monday, 26 July 2021 at 15:29:26 UTC, Tejas wrote:

>
import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    createLowLevelThread(&func, 2<<30);//works
    createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Can someone help?

The delegate must be nothrow:

void delegate() nothrow f;

Doesn't seem to matter. I tried that beforehand. And even if it did why does passing it directly work without explicitly qualifying it as nothrow then?

July 26, 2021

On Monday, 26 July 2021 at 16:46:40 UTC, Tejas wrote:

>

On Monday, 26 July 2021 at 15:42:44 UTC, Paul Backus wrote:

>

On Monday, 26 July 2021 at 15:29:26 UTC, Tejas wrote:

>
import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    createLowLevelThread(&func, 2<<30);//works
    createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Can someone help?

The delegate must be nothrow:

void delegate() nothrow f;

Doesn't seem to matter. I tried that beforehand. And even if it did why does passing it directly work without explicitly qualifying it as nothrow then?

Sorry, it seems to work now.

But why didn't it fail when I didn't qualify func as nothrow?

July 26, 2021

On Monday, 26 July 2021 at 16:46:40 UTC, Tejas wrote:

>

On Monday, 26 July 2021 at 15:42:44 UTC, Paul Backus wrote:

>

On Monday, 26 July 2021 at 15:29:26 UTC, Tejas wrote:

>
import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    createLowLevelThread(&func, 2<<30);//works
    createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Can someone help?

The delegate must be nothrow:

void delegate() nothrow f;

Doesn't seem to matter. I tried that beforehand. And even if it did why does passing it directly work without explicitly qualifying it as nothrow then?

It does work for me. To me running the following explains why:

import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    pragma(msg,typeof(&func));
    pragma(msg,typeof(f));
    createLowLevelThread(&func, 2<<30);//works
    //createLowLevelThread(f, 2<<30);// doesn't  work!!
}
July 26, 2021

On Monday, 26 July 2021 at 17:01:13 UTC, JG wrote:

>

On Monday, 26 July 2021 at 16:46:40 UTC, Tejas wrote:

>

On Monday, 26 July 2021 at 15:42:44 UTC, Paul Backus wrote:

>

On Monday, 26 July 2021 at 15:29:26 UTC, Tejas wrote:

>

[...]

The delegate must be nothrow:

void delegate() nothrow f;

Doesn't seem to matter. I tried that beforehand. And even if it did why does passing it directly work without explicitly qualifying it as nothrow then?

It does work for me. To me running the following explains why:

import std;
import core.thread.osthread;

void delegate() f;
void main()
{
    void func(){}
    f = &func;
    pragma(msg,typeof(&func));
    pragma(msg,typeof(f));
    createLowLevelThread(&func, 2<<30);//works
    //createLowLevelThread(f, 2<<30);// doesn't  work!!
}

Yeah after reading the error diagnostics carefully I realized that the compiler is inferring many attributes when passing func directly but not when passing via delegate

July 26, 2021

On Monday, 26 July 2021 at 17:14:45 UTC, Tejas wrote:

>

Yeah after reading the error diagnostics carefully I realized that the compiler is inferring many attributes when passing func directly but not when passing via delegate

Well, technically, it is inferred there too, but since you specified void delegate() it implicitly casts to that and drops the detail.

Similar to the difference between like

Object o = new MyClass;
// now o is still Object since the class implicitly casted and thus drops the extensions in the child class

and

auto c = new MyClass;
// no conversion requested there, c has the full type of MyClass

July 26, 2021

On Monday, 26 July 2021 at 17:21:04 UTC, Adam D Ruppe wrote:

>

On Monday, 26 July 2021 at 17:14:45 UTC, Tejas wrote:

>

Yeah after reading the error diagnostics carefully I realized that the compiler is inferring many attributes when passing func directly but not when passing via delegate

Well, technically, it is inferred there too, but since you specified void delegate() it implicitly casts to that and drops the detail.

Similar to the difference between like

Object o = new MyClass;
// now o is still Object since the class implicitly casted and thus drops the extensions in the child class

and

auto c = new MyClass;
// no conversion requested there, c has the full type of MyClass

Thank you very much for further explaining this :D