[Issue 8960] DMD tester: Unable to set thread priority

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Jun 11 05:06:29 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=8960


Maxim Fomin <maxim at maxim-fomin.ru> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |maxim at maxim-fomin.ru


--- Comment #3 from Maxim Fomin <maxim at maxim-fomin.ru> 2013-06-11 05:06:28 PDT ---
Reduced (compile with -unittest)
-------------------------------------
import std.parallelism;
import std.stdio;
import core.thread;

unittest
{
    static void refFun(ref uint num)
    {
        num++;
    }

    uint x;

    // Test executeInNewThread().
    auto ct = scopedTask!refFun(x);
    ct.executeInNewThread(Thread.PRIORITY_MAX);
    ct.yieldForce;
    assert(ct.args[0] == 1);


}

void main(){}
---------------------------------

According to observations it can fail in getter or in setter of thread
priority. It seems that return code from pthread setters/getters is 3 which is
ESRCH, which in pthread context means non-existing thread. Following snippet
from std.parallelism gives a clue:

    this(AbstractTask* task, int priority = int.max)
    {
        assert(task);

        // Dummy value, not used.
        instanceStartIndex = 0;

        this.isSingleTask = true;
        task.taskStatus = TaskStatus.inProgress;
        this.head = task;
        singleTaskThread = new Thread(&doSingleTask);
        singleTaskThread.start();

        if(priority != int.max)
        {
            singleTaskThread.priority = priority;
        }
    }

Thread may finish before setting priorities as it was started before applying
them. It seems that thread ID is same in three cases 1) before getter 2) before
setter 3) in gdb message informing that thread has finished. Originally I got
approx 1-2 per 100 executions but after inserting debug outputs the failure
percentage increased (as I suppose) because thread had more chances to
terminate before applying priorities. Also, there were cases when gdb reported
that thread has finished before priority setter started execution.

Can someone who uses FreeBSD check this?

https://github.com/mxfm/phobos/commit/50854c479e4d965271fbb91f9203d24ac81b6820

https://github.com/mxfm/druntime/commit/0d60b15efdaebae65ee9109ca3a90aaee177a341

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list