Beispiel #1
0
 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);
     }
 }
Beispiel #2
0
 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);
             }
         }
     }
 }