[Python-checkins] CVS: python/dist/src/Mac/Python macglue.c,1.106,1.107

Jack Jansen jackjansen@users.sourceforge.net
2001年11月09日 16:41:45 -0800


Update of /cvsroot/python/python/dist/src/Mac/Python
In directory usw-pr-cvs1:/tmp/cvs-serv32290/Python/Mac/Python
Modified Files:
	macglue.c 
Log Message:
Fixed various problems with command-dot handling (some very old):
- Don't scan for cmd-. unless in the foreground
- Scan before switching out to other processes, not after
- don't scan if SchedParams.check_interrupt is false (!)
 - But: do scan if we're blocked on I/O
One problem remains: in the last case KeyboardInterrupt is raised
too late.
Index: macglue.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Python/macglue.c,v
retrieving revision 1.106
retrieving revision 1.107
diff -C2 -d -r1.106 -r1.107
*** macglue.c	2001年11月01日 23:17:35	1.106
--- macglue.c	2001年11月10日 00:41:43	1.107
***************
*** 299,308 ****
 #endif
 
- 	if (interrupted) return -1;
 
 	if ( msg == SP_AUTO_SPIN )
 		maxsleep = 0;
! 	if ( msg==SP_SLEEP||msg==SP_SELECT )
 		maxsleep = arg;
 
 	PyMac_DoYield(maxsleep, 0); /* XXXX or is it safe to call python here? */
--- 299,317 ----
 #endif
 
 
 	if ( msg == SP_AUTO_SPIN )
 		maxsleep = 0;
! 	if ( msg==SP_SLEEP||msg==SP_SELECT ) {
 		maxsleep = arg;
+ 		/*
+ 		** We force-scan for interrupts. Not pretty, but otherwise
+ 		** a program may hang in select or sleep forever.
+ 		*/
+ 		scan_event_queue(1);
+ 	}
+ 	if (interrupted) {
+ 		interrupted = 0;
+ 		return -1;
+ 	}
 
 	PyMac_DoYield(maxsleep, 0); /* XXXX or is it safe to call python here? */
***************
*** 454,469 ****
 }
 
 /*
 ** This routine scans the event queue looking for cmd-.
- ** This is the only way to get an interrupt under THINK (since it
- ** doesn't do SIGINT handling), but is also used under MW, when
- ** the full-fledged event loop is disabled. This way, we can at least
- ** interrupt a runaway python program.
 */
 static void
! scan_event_queue(flush)
! 	int flush;
 {
 #if !TARGET_API_MAC_OS8
 	if ( CheckEventQueueForUserCancel() )
 		interrupted = 1;
--- 463,496 ----
 }
 
+ /* Check whether we are in the foreground */
+ static int
+ PyMac_InForeground(void)
+ {
+ 	static ProcessSerialNumber ours;
+ 	static inited;
+ 	ProcessSerialNumber curfg;
+ 	Boolean eq;
+ 	
+ 	if ( inited == 0 ) {
+ 		(void)GetCurrentProcess(&ours);
+ 		inited = 1;
+ 	}
+ 	if ( GetFrontProcess(&curfg) < 0 )
+ 		eq = 1;
+ 	else if ( SameProcess(&ours, &curfg, &eq) < 0 )
+ 		eq = 1;
+ 	return (int)eq;
+ }
+ 
 /*
 ** This routine scans the event queue looking for cmd-.
 */
 static void
! scan_event_queue(force)
! 	int force;
 {
 #if !TARGET_API_MAC_OS8
+ 	if ( interrupted || (!schedparams.check_interrupt && !force) )
+ 		return;
 	if ( CheckEventQueueForUserCancel() )
 		interrupted = 1;
***************
*** 471,474 ****
--- 498,503 ----
 	register EvQElPtr q;
 	
+ 	if ( interrupted || (!schedparams.check_interrupt && !force) || !PyMac_InForeground() )
+ 		return;
 	q = (EvQElPtr) LMGetEventQueue()->qHead;
 	
***************
*** 489,504 ****
 PyErr_CheckSignals()
 {
 	if (schedparams.enabled) {
! 		if ( (unsigned long)LMGetTicks() > schedparams.next_check ) {
! 			if ( PyMac_Yield() < 0)
! 				return -1;
! 			schedparams.next_check = (unsigned long)LMGetTicks()
! 					 + schedparams.check_interval;
 			if (interrupted) {
- 				scan_event_queue(1);	/* Eat events up to cmd-. */
 				interrupted = 0;
 				PyErr_SetNone(PyExc_KeyboardInterrupt);
 				return -1;
 			}
 		}
 	}
--- 518,537 ----
 PyErr_CheckSignals()
 {
+ 	int xxx, xxx_old;
+ 	
 	if (schedparams.enabled) {
! 		if ( interrupted || (unsigned long)LMGetTicks() > schedparams.next_check ) {
! 			scan_event_queue(0);
 			if (interrupted) {
 				interrupted = 0;
 				PyErr_SetNone(PyExc_KeyboardInterrupt);
 				return -1;
 			}
+ 			if ( PyMac_Yield() < 0)
+ 				return -1;
+ 			xxx = LMGetTicks();
+ 			xxx_old = schedparams.next_check;
+ 			schedparams.next_check = (unsigned long)LMGetTicks()
+ 					 + schedparams.check_interval;
 		}
 	}
***************
*** 509,534 ****
 PyOS_InterruptOccurred()
 {
! 	scan_event_queue(1);
! 	return interrupted;
! }
! 
! /* Check whether we are in the foreground */
! static int
! PyMac_InForeground(void)
! {
! 	static ProcessSerialNumber ours;
! 	static inited;
! 	ProcessSerialNumber curfg;
! 	Boolean eq;
! 	
! 	if ( inited == 0 ) {
! 		(void)GetCurrentProcess(&ours);
! 		inited = 1;
! 	}
! 	if ( GetFrontProcess(&curfg) < 0 )
! 		eq = 1;
! 	else if ( SameProcess(&ours, &curfg, &eq) < 0 )
! 		eq = 1;
! 	return (int)eq;
 }
 #endif
--- 542,550 ----
 PyOS_InterruptOccurred()
 {
! 	scan_event_queue(0);
! 	if ( !interrupted )
! 		return 0;
! 	interrupted = 0;
! 	return 1;
 }
 #endif
***************
*** 617,629 ****
 	
 	in_here++;
- 	/*
- 	** First check for interrupts, if wanted.
- 	** This sets a flag that will be picked up at an appropriate
- 	** moment in the mainloop.
- 	*/
- 	if (schedparams.check_interrupt)
- 		scan_event_queue(0);
- 	
- 	/* XXXX Implementing an idle routine goes here */
 		
 	/*
--- 633,636 ----

AltStyle によって変換されたページ (->オリジナル) /