[phobos] State of std.parallelism unit tests
SK
sk at metrokings.com
Wed Jun 8 07:12:56 PDT 2011
On Wed, Jun 8, 2011 at 5:54 AM, David Simcha <dsimcha at gmail.com> wrote:
> On 6/7/2011 11:04 PM, SK wrote:
>
>> I have a test (~100 loc) that fails immediately on 64-bit Linux without
>> resorting to fiber migration. Using the FiberFixes branch allows it to
>> pass. If you're interested I'd be happy to provide.
>> Also, will I asked before but never got an answer: Is there any plan to
>> merge FiberFixes with the the trunk?
>>
> Yes, please provide. I know there is still an outstanding issue with
> std.parallelism, but I can't reproduce it so there's not much I can do about
> it. I'll take any help I can get
>
>
>
This test launches 10 threads that each launch 100 fibers that each yield
1000 times. I compile with /usr/bin/dmd -w -wi -gc.
HTH,
-steve
//import std.stdio;
import core.thread;
import std.stdio;
import std.exception;
shared uint join_done = 0;
version( Windows ) { import core.sys.windows.windows; }
class fiber_worker_t
{
this( uint yield_count )
{
m_done = false;
m_yield_count = yield_count;
m_fiber = new Fiber( &func );
}
bool call()
{
m_fiber.call();
return is_term();
}
bool is_term() { return( m_fiber.state() == m_fiber.State.TERM ); }
bool is_done() { return( m_done ); }
protected:
uint m_yield_count;
Fiber m_fiber;
bool m_done;
void func()
{
uint i = m_yield_count;
while( --i )
m_fiber.yield();
m_done = true;
}
}
class thread_worker_t
{
this( uint fiber_worker_count, uint fiber_yield_count )
{
m_fiber_worker_count = fiber_worker_count;
m_fiber_yield_count = fiber_yield_count;
m_thread = new Thread( &func );
/*
// I moved this to the thread itself
m_fib_array = new fiber_worker_t[fiber_worker_count];
foreach( ref f; m_fib_array )
f = new fiber_worker_t(fiber_yield_count);
*/
}
void start()
{
m_thread.start();
}
protected:
uint m_fiber_worker_count;
uint m_fiber_yield_count;
Thread m_thread;
// func() executes in each thread's context
void func()
{
fiber_worker_t[] m_fib_array = new
fiber_worker_t[m_fiber_worker_count];
foreach( ref f; m_fib_array )
f = new fiber_worker_t(m_fiber_yield_count);
// fibers are cooperative and need a driver loop
bool done;
do
{
done = true;
foreach( f; m_fib_array )
{
done &= f.call();
// writeln( &this, " ", f, " ", &f );
}
} while( !done );
// verify that fibers are really done
foreach( f; m_fib_array )
enforce( f.is_done() );
}
}
void thread_fiber_test( const uint thread_count, const uint fiber_count,
const uint fiber_yield_count )
{
thread_worker_t[] thread_worker_array = new
thread_worker_t[thread_count];
foreach( ref t; thread_worker_array )
t = new thread_worker_t(fiber_count, fiber_yield_count);
foreach( t; thread_worker_array ) t.start();
thread_joinAll();
join_done = 1;
}
int main()
{
const uint thread_count = 10;
const uint fiber_count = 100;
const uint fiber_yield_count = 1000;
thread_fiber_test( thread_count, fiber_count, fiber_yield_count );
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/phobos/attachments/20110608/6495f5ed/attachment.html>
More information about the phobos
mailing list