"Segmentation Fault" on ubuntu linux
    davesun 
    davesun at 126.com
       
    Sat May  9 09:36:51 PDT 2009
    
    
  
hello,I use dmd2.029 on ubuntu linux.
Segmentation Fault accur when run the code
code:
module dsun.Fiber;
private import core.thread;
private import std.stdio;
private class SyncQueue(T)
{
    private T[] queue;
    public synchronized void push(T o)
    {
        queue ~= o;
    }
    public synchronized T pop()
    {
        T o = null;
        if(queue.length > 1){
            o = queue[0];
            queue = queue[1..$];
        }
        else if (queue.length == 0)
        {
            o = queue[0];
            queue = [];
        }
        return o;
    }
}
private class Scheduler
{
    private SyncQueue!(Fiber) runQueue;
    private SyncQueue!(Fiber) reusePool;
    private Thread[] threads;
    public this ()
    {
        runQueue  = new SyncQueue!(Fiber);
        reusePool = new SyncQueue!(Fiber);
    }
    public void addFiber(Fiber fiber)
    {
        runQueue.push(fiber);
    }
    public void run()
    {
        while (true)
        {
            Fiber fiber = runQueue.pop();
            if (fiber is null)
            {
                continue;
            }
            else
            {
                fiber.call();
                if (fiber.state == Fiber.State.TERM)
                {
                    fiber.reset();
                    reusePool.push(fiber);
                }
                else
                    runQueue.push(fiber);
            }
        }
    }
    public void schedule(int num = 4)
    {
        assert(num>0);
        for (int i=0; i< num; i++)
        {
            Thread t = new Thread(&run);
            threads ~= t;
            t.start();
        }
        for (int i=0; i< num; i++)
        {
            threads[i].join();
        }
    }
}
class WorkFiber:Fiber
{
    this(){
        super(&run);
    }
    void run()
    {
        while (true)
        {
          Fiber.yield();
        }
    }
}
void main()
{
    Scheduler p = new Scheduler;
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.addFiber(new WorkFiber);
    p.schedule(4);
}
    
    
More information about the Digitalmars-d-learn
mailing list