Fibers
Flamencofantasy via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Sep 17 04:26:14 PDT 2014
if (++count >= fibs.length)...
On Wednesday, 17 September 2014 at 10:00:49 UTC, Andrew Edwards
wrote:
> The script below is borrowed form a unit test in core.thread
> and modified slightly. If fails with "segmentation fault: 11"
> but I'm not sure why.
>
> Basically what I'm trying to do is to transact on every file in
> give directory at the same time exact time.
>
> In this exam, I'm removing the file/directory but that's just a
> test to see if I could get it to work.
>
> Guidance is requested and appreciated.
>
> Thanks,
> Andrew
>
> ---------------------------------
> import core.thread;
> import std.process;
> import std.file;
> import std.stdio;
>
> void main(string[] args)
> {
> auto f = args[1];
> deleteWithFibers(f);
> }
>
> class TestFiber : Fiber
> {
> string file;
>
> this(string file)
> {
> this.file = file;
> super(&run);
> }
>
> void run()
> {
> while (file.exists) {
> if (file.isFile)
> file.remove;
> else if (file.isDir)
> file.rmdir;
> Fiber.yield();
> }
> }
> }
>
> void deleteWithFibers(string dir)
> {
> auto fibs = new TestFiber[100];
>
> int count = 0;
> foreach (entry; dirEntries(dir, SpanMode.depth))
> {
> fibs[count] = new TestFiber(entry);
>
> if (++count > fibs.length)
> fibs.length *= 2;
> }
>
> fibs.length = count+1;
>
> bool cont;
> do {
> cont = false;
> foreach(fib; fibs) {
> if (fib.state == Fiber.State.HOLD)
> {
> fib.call();
> cont |= fib.state != Fiber.State.TERM;
> }
> }
> } while (cont);
> }
More information about the Digitalmars-d-learn
mailing list