coroutines.nut 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. function coroutine_test(a,b)
  2. {
  3. local gca = dad_utils.gc_scope_alert(@(ud) print(ud), "<<Gone !>> : " + __LINE__);
  4. ::print(a+" "+b+"\n");
  5. local ret = ::suspend("suspend 1");
  6. gca = dad_utils.gc_scope_alert(@(ud) print(ud), "<<Gone !>> : " + __LINE__);
  7. ::print("the coroutine says "+ret+"\n");
  8. ret = ::suspend("suspend 2");
  9. gca = dad_utils.gc_scope_alert(@(ud) print(ud), "<<Gone !>> : " + __LINE__);
  10. ::print("the coroutine says "+ret+"\n");
  11. ret = ::suspend("suspend 3");
  12. gca = dad_utils.gc_scope_alert(@(ud) print(ud), "<<Gone !>> : " + __LINE__);
  13. ::print("the coroutine says "+ret+"\n");
  14. gca = dad_utils.gc_scope_alert(@(ud) print(ud), "<<Gone !>> : " + __LINE__);
  15. ::print(getstacktop());
  16. return "I'm done"
  17. }
  18. local coro = ::newthread(coroutine_test);
  19. local susparam = coro.call("test","coroutine"); //starts the coroutine
  20. function doIt(str : string){
  21. print(str);
  22. }
  23. local a = 23;
  24. print(a);
  25. local i = 1;
  26. do
  27. {
  28. ::print("suspend passed ["+susparam+"]\n")
  29. susparam = coro.wakeup("ciao "+i);
  30. ++i;
  31. }while(coro.getstatus()=="suspended")
  32. ::print("getstacktop", getstacktop());
  33. ::print("return passed ["+susparam+"]\n")
  34. ::print("getstacktop", getstacktop());
  35. print(a);