1 module neton.util.Future; 2 import core.sync.condition; 3 import core.sync.mutex; 4 import hunt.logging; 5 import hunt.util.Serialize; 6 7 class Future(Req , Res) 8 { 9 10 Req _in; 11 Res _out; 12 Condition _condition; 13 14 this(Req in_ ) 15 { 16 _in = in_; 17 // trace("**** key : ",cast(string)(_in.key)); 18 _condition = new Condition(new Mutex()); 19 } 20 21 22 Res get() 23 { 24 _condition.mutex().lock(); 25 trace("condition waiting ..."); 26 _condition.wait(5.seconds); 27 trace("condition waiting done ..."); 28 _condition.mutex().unlock(); 29 return _out; 30 } 31 32 void done(Res out_) 33 { 34 trace("condition notify ... "); 35 _out = out_; 36 _condition.notify(); 37 } 38 39 Req data() @property 40 { 41 return _in; 42 } 43 44 ref Res ExtraData() @property 45 { 46 return _out; 47 } 48 49 void setExtraData(Res res) 50 { 51 _out = res; 52 } 53 } 54 55 56 unittest 57 { 58 import core.thread; 59 import std.stdio; 60 auto f = new Future!(string,string)("hello"); 61 new Thread((){ 62 Thread.sleep(dur!"secs"(1)); 63 if(f.data == "hello") 64 f.done("world"); 65 }).start(); 66 writeln(f.get()); 67 }