fixed an IO thread termination bug
This commit is contained in:
		@ -202,6 +202,7 @@ class MyObject(Object)
 | 
				
			|||||||
			while (true)
 | 
								while (true)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				System handleAsyncEvent.
 | 
									System handleAsyncEvent.
 | 
				
			||||||
 | 
									
 | 
				
			||||||
			}.
 | 
								}.
 | 
				
			||||||
			s close dump.
 | 
								s close dump.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -4044,13 +4044,20 @@ static MOO_INLINE int switch_process_if_needed (moo_t* moo)
 | 
				
			|||||||
switch_to_next:
 | 
					switch_to_next:
 | 
				
			||||||
	/* TODO: implement different process switching scheme - time-slice or clock based??? */
 | 
						/* TODO: implement different process switching scheme - time-slice or clock based??? */
 | 
				
			||||||
#if defined(MOO_EXTERNAL_PROCESS_SWITCH)
 | 
					#if defined(MOO_EXTERNAL_PROCESS_SWITCH)
 | 
				
			||||||
	if (!moo->proc_switched && moo->switch_proc) { switch_to_next_runnable_process (moo); }
 | 
						if (moo->switch_proc)
 | 
				
			||||||
	moo->switch_proc = 0;
 | 
						{
 | 
				
			||||||
#else
 | 
					#endif
 | 
				
			||||||
	if (!moo->proc_switched) { switch_to_next_runnable_process (moo); }
 | 
							if (!moo->proc_switched) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								switch_to_next_runnable_process (moo);
 | 
				
			||||||
 | 
								moo->proc_switched = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#if defined(MOO_EXTERNAL_PROCESS_SWITCH)
 | 
				
			||||||
 | 
							moo->switch_proc = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else moo->proc_switched = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	moo->proc_switched = 0;
 | 
					 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1536,6 +1536,8 @@ static void vm_muxwait (moo_t* moo, const moo_ntime_t* dur, moo_vmprim_muxwait_c
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (xtn->iothr_abort) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (xtn->ev.len <= 0) 
 | 
						if (xtn->ev.len <= 0) 
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		struct timespec ts;
 | 
							struct timespec ts;
 | 
				
			||||||
@ -1908,15 +1910,16 @@ static void setup_tick (void)
 | 
				
			|||||||
	struct itimerval itv;
 | 
						struct itimerval itv;
 | 
				
			||||||
	struct sigaction act;
 | 
						struct sigaction act;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset (&act, 0, sizeof(act));
 | 
				
			||||||
	sigemptyset (&act.sa_mask);
 | 
						sigemptyset (&act.sa_mask);
 | 
				
			||||||
	act.sa_handler = arrange_process_switching;
 | 
						act.sa_handler = arrange_process_switching;
 | 
				
			||||||
	act.sa_flags = SA_RESTART;
 | 
						act.sa_flags = SA_RESTART;
 | 
				
			||||||
	sigaction (SIGVTALRM, &act, MOO_NULL);
 | 
						sigaction (SIGVTALRM, &act, MOO_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	itv.it_interval.tv_sec = 0;
 | 
						itv.it_interval.tv_sec = 0;
 | 
				
			||||||
	itv.it_interval.tv_usec = 100; /* 100 microseconds */
 | 
						itv.it_interval.tv_usec = 10000; /* microseconds */
 | 
				
			||||||
	itv.it_value.tv_sec = 0;
 | 
						itv.it_value.tv_sec = 0;
 | 
				
			||||||
	itv.it_value.tv_usec = 100;
 | 
						itv.it_value.tv_usec = 10000;
 | 
				
			||||||
	setitimer (ITIMER_VIRTUAL, &itv, MOO_NULL);
 | 
						setitimer (ITIMER_VIRTUAL, &itv, MOO_NULL);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user