Bläddra i källkod

fixed Unix.ThrExit()

git-svn-id: https://svn-dept.inf.ethz.ch/svn/lecturers/a2/trunk@8829 8c9fc860-2736-0410-a75d-ab315db34111
infsvn.guenter 6 år sedan
förälder
incheckning
323e258cd1
2 ändrade filer med 20 tillägg och 11 borttagningar
  1. 10 5
      source/Darwin.Unix.Mod
  2. 10 6
      source/Solaris.Unix.Mod

+ 10 - 5
source/Darwin.Unix.Mod

@@ -461,6 +461,7 @@ TYPE
 VAR
 	mainthread: Thread_t;
 	handler_done: BOOLEAN;
+	thread_exit: Key_t;
 
 	argc-: LONGINT;  argv-: ADDRESS;  environ-: ADDRESS;
 
@@ -717,7 +718,7 @@ VAR
 
 	PROCEDURE ThrExit*( );
 	BEGIN
-		pthread_exit( 0 );
+		siglongjmp( pthread_getspecific( thread_exit ), 1 )
 	END ThrExit;
 
 	PROCEDURE ThrSetPriority*( thr: Thread_t; prio: LONGINT );
@@ -753,6 +754,8 @@ VAR
 	VAR
 		me: Thread_t;
 		old, new: Sigset;
+		state: ARRAY 2048 OF CHAR;
+		
 		param: Sched_param;
 		res: WORD;
 	BEGIN
@@ -776,9 +779,9 @@ VAR
 		param.sched_priority := 0;
 		res := pthread_setschedparam( me, SCHED_RR, ADDRESSOF( param ) );
 
-		proc();
+		ASSERT( pthread_setspecific( thread_exit, ADDRESSOF( state ) ) = 0 );
+		IF sigsetjmp( ADDRESSOF( state ), 0 ) = 0 THEN proc() END;
 
-		pthread_exit( NIL );
 		RETURN NIL;
 	END Starter;
 
@@ -817,7 +820,7 @@ VAR
 		IF (thr # mainthread) THEN
 	    		pthread_detach( thr );
     			IF (thr = pthread_self()) THEN
-				pthread_exit( 0 );
+				ThrExit
 			ELSE
 				pthread_cancel( thr );
 			END
@@ -859,7 +862,9 @@ VAR
 		low := sched_get_priority_min(SCHED_OTHER);
 
 		param.sched_priority := high;
-		IF pthread_setschedparam( mainthread, SCHED_RR, ADDRESSOF( param ) ) # 0 THEN END;
+		ASSERT( pthread_setschedparam( mainthread, SCHED_RR, ADDRESSOF( param ) ) = 0 );
+
+		ASSERT( pthread_key_create( ADDRESSOF( thread_exit ), NIL ) = 0);
 
 		RETURN TRUE;
 	END ThrInitialize;

+ 10 - 6
source/Solaris.Unix.Mod

@@ -457,6 +457,7 @@ TYPE
 VAR
 	handler_done: BOOLEAN;
 	mainthread: Thread_t;
+	thread_exit: Key_t;
 
 	argc-: LONGINT;  argv-: ADDRESS;  environ: ADDRESS;
 
@@ -706,6 +707,8 @@ VAR
 		high := sched_get_priority_max( SCHED_OTHER );
 		low := sched_get_priority_min( SCHED_OTHER );
 
+		ASSERT( pthread_key_create( ADDRESSOF( thread_exit ), NIL ) = 0);	
+		
 		RETURN TRUE;
 	END ThrInitialize;
 
@@ -750,7 +753,8 @@ VAR
 	VAR
 		me: Thread_t;
 		old, new: Sigset;
-
+		state: ARRAY 2048 OF CHAR;
+		
 		param: Sched_param;
 		r: LONGINT;
 	BEGIN
@@ -774,9 +778,9 @@ VAR
 		param.sched_priority := 0;
 		r := pthread_setschedparam( me, SCHED_OTHER, ADDRESSOF( param ) );
 
-		proc();
-
-		pthread_exit( NIL );
+		ASSERT( pthread_setspecific( thread_exit, ADDRESSOF( state ) ) = 0 );
+		IF sigsetjmp( ADDRESSOF( state ), 0 ) = 0 THEN proc() END;
+		
 		RETURN NIL;
 	END Starter;
 
@@ -814,7 +818,7 @@ VAR
 		IF (thr # mainthread) THEN
 		    	pthread_detach( thr );
 		    	IF (thr = pthread_self( )) THEN
-		    		pthread_exit( 0 );
+		    		ThrExit
 			ELSE
 		    		pthread_cancel( thr );
 		    	END
@@ -833,7 +837,7 @@ VAR
 
 	PROCEDURE ThrExit*( );
 	BEGIN
-		pthread_exit( 0 );
+		siglongjmp( pthread_getspecific( thread_exit ), 1 )
 	END ThrExit;
 
 	PROCEDURE ThrSetPriority*( thr: Thread_t; prio: LONGINT );