Ver Fonte

Patched errno (get address for each thread separately)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6946 8c9fc860-2736-0410-a75d-ab315db34111
felixf há 8 anos atrás
pai
commit
9ce4992d78
1 ficheiros alterados com 5 adições e 3 exclusões
  1. 5 3
      source/Generic.Linux.I386.Unix.Mod

+ 5 - 3
source/Generic.Linux.I386.Unix.Mod

@@ -517,7 +517,7 @@ VAR
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
 	exit-			: PROCEDURE {C} ( status: LONGINT );
 	perror-		: PROCEDURE {C} ( msg: ADDRESS );
-	errnum			: ADDRESS; (* PROCEDURE {C} ( ): LONGINT;*)
+	errno_location: PROCEDURE {C} ( ): ADDRESS;
 
 	xSetErrorHandler: PROCEDURE {C} (h: ADDRESS): WORD;
 	xSetIOErrorHandler: PROCEDURE {C} (h: ADDRESS): WORD;
@@ -1021,8 +1021,10 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	END InitSignalHandler;
 	
 	PROCEDURE errno*(): LONGINT;
+	VAR loc: ADDRESS;
 	BEGIN
-		RETURN S.GET32(errnum);
+		loc := errno_location();
+		RETURN S.GET32(loc);
 	END errno;
 	
 	TYPE OberonXErrorHandler* = PROCEDURE (disp, err: ADDRESS): LONGINT;
@@ -1176,7 +1178,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
 		Dlsym( libc, "kill",		ADDRESSOF( kill ) );
 		Dlsym( libc, "perror",	ADDRESSOF( perror ) );
-		Dlsym( libc, "errno",	ADDRESSOF( errnum ) );
+		Dlsym( libc, "__errno_location",	ADDRESSOF(errno_location ) );
 		
 		Dlsym( libx, "XSetErrorHandler", ADDRESS OF xSetErrorHandler);
 		Dlsym( libx, "XSetIOErrorHandler", ADDRESS OF xSetIOErrorHandler);