private IEnumerator mainLoop() { while (true) { if (localqueue.Count > 0) { current_cotask = localqueue.Dequeue(); task_num = localqueue.Count; current_task_name = current_cotask.call_funcname; bool is_suspend = false; while (current_cotask.ie.MoveNext()) { var c = current_cotask.ie.Current; if (c is Promise) { var p = (Promise)c; p.Then(value => { localqueue.Enqueue(current_cotask); }); is_suspend = true; break; } else if (c is YieldInstruction) { yield return(null); } else if (c is WWW) { yield return(null); } if (c is IEnumerator) { yield return(fork(c as IEnumerator)); } else { yield return(c); } } if (!is_suspend) { if (!ie_ret.Contains(current_cotask)) { rawret(current_cotask.call_addr, current_cotask.call_type, current_cotask.call_session); } } if (ie_ret.Contains(current_cotask)) { ie_ret.Remove(current_cotask); } } yield return(null); } }
void handleQueue() { if (localqueue.Count > 0) { current_cotask = localqueue.Dequeue(); task_num = localqueue.Count; current_task_name = current_cotask.call_funcname; bool is_suspend = false; bool ok = current_cotask.ie.MoveNext(); if (ok) { var c = current_cotask.ie.Current; if (c is Promise) { var p = (Promise)c; p.Then(value => { localqueue.Enqueue(current_cotask); }); is_suspend = true; } else if (c is YieldInstruction) { } else if (c is WWW) { } if (c is IEnumerator) { } else { } } else { if (!is_suspend) { if (!ie_ret.Contains(current_cotask)) { rawret(current_cotask.call_addr, current_cotask.call_type, current_cotask.call_session); } } if (ie_ret.Contains(current_cotask)) { ie_ret.Remove(current_cotask); } } } }