diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-03-11 18:57:22 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-03-11 18:57:22 +0100 |
commit | 25f04a68a168a948783618910e115316eb0ed3fc (patch) | |
tree | b3cb88e49ef21b5855569918634937bdbf78b19e /sys/src/ape | |
parent | 34ec2056041a193a471701dd50e2032dc300fb0e (diff) |
ape: threadsafe errno
store errno on the private process stack so its always per process
and not just per memory space. errno itself becomes a macro
dereferencing int *_errnoloc; which is initialized from main9.s
pointing to the private stack location.
various fixes in programs that just imported errno variable with
"extern int errno;" instead of including <errno.h>.
Diffstat (limited to 'sys/src/ape')
-rw-r--r-- | sys/src/ape/lib/ap/386/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/386/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/68020/main9.s | 6 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/68020/main9p.s | 6 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/alpha/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/alpha/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/arm/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/mips/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/mips/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_envsetup.c | 2 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_errno.c | 4 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_fdinfo.c | 4 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/power/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/power/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/sparc/main9.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/sparc/main9p.s | 7 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/stdio/iolib.h | 2 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/stdio/perror.c | 3 |
19 files changed, 76 insertions, 35 deletions
diff --git a/sys/src/ape/lib/ap/386/main9.s b/sys/src/ape/lib/ap/386/main9.s index 04ee73dd1..a5f351df9 100644 --- a/sys/src/ape/lib/ap/386/main9.s +++ b/sys/src/ape/lib/ap/386/main9.s @@ -1,14 +1,17 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) /* _tos = arg */ MOVL AX, _tos(SB) - LEAL 8(SP), AX + LEAL 12(SP), AX + MOVL AX, _errnoloc(SB) + LEAL 16(SP), AX MOVL AX, _privates(SB) MOVL $NPRIVATES, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/386/main9p.s b/sys/src/ape/lib/ap/386/main9p.s index 0ca3004a4..1cd317eba 100644 --- a/sys/src/ape/lib/ap/386/main9p.s +++ b/sys/src/ape/lib/ap/386/main9p.s @@ -1,14 +1,17 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) /* _tos = arg */ MOVL AX, _tos(SB) - LEAL 8(SP), AX + LEAL 12(SP), AX + MOVL AX, _errnoloc(SB) + LEAL 16(SP), AX MOVL AX, _privates(SB) MOVL $NPRIVATES, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/68020/main9.s b/sys/src/ape/lib/ap/68020/main9.s index 715331ff4..6b80251b6 100644 --- a/sys/src/ape/lib/ap/68020/main9.s +++ b/sys/src/ape/lib/ap/68020/main9.s @@ -1,15 +1,17 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVL $a6base(SB), A6 /* _tos = arg */ MOVL R0, _tos(SB) /* return value of sys exec!! */ - LEA private+8(SP), _privates(SB) + LEA errno+12(SB), _errnoloc(SB) + LEA private+16(SP), _privates(SB) MOVL $NPRIVATES, _nprivates(SB) PEA inargv+0(FP) diff --git a/sys/src/ape/lib/ap/68020/main9p.s b/sys/src/ape/lib/ap/68020/main9p.s index 171355c5f..e24faeddc 100644 --- a/sys/src/ape/lib/ap/68020/main9p.s +++ b/sys/src/ape/lib/ap/68020/main9p.s @@ -1,15 +1,17 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVL $a6base(SB), A6 /* _tos = arg */ MOVL R0, _tos(SB) /* return value of sys exec!! */ - LEA private+8(SP), _privates(SB) + LEA errno+12(SP), _errnoloc(SB) + LEA private+16(SP), _privates(SB) MOVL $NPRIVATES, _nprivates(SB) /* _profmain(); */ diff --git a/sys/src/ape/lib/ap/alpha/main9.s b/sys/src/ape/lib/ap/alpha/main9.s index d92ac3d89..d863eeb8e 100644 --- a/sys/src/ape/lib/ap/alpha/main9.s +++ b/sys/src/ape/lib/ap/alpha/main9.s @@ -1,15 +1,18 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVQ $setSB(SB), R29 /* _tos = arg */ MOVL R0, _tos(SB) - MOVQ $8(SP), R1 + MOVQ $12(SP), R1 + MOVL R1, _errnoloc(SB) + MOVQ $16(SP), R1 MOVL R1, _privates(SB) MOVQ $NPRIVATES, R1 MOVL R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/alpha/main9p.s b/sys/src/ape/lib/ap/alpha/main9p.s index 3312100cd..f8472fcd3 100644 --- a/sys/src/ape/lib/ap/alpha/main9p.s +++ b/sys/src/ape/lib/ap/alpha/main9p.s @@ -1,15 +1,18 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVQ $setSB(SB), R29 /* _tos = arg */ MOVL R0, _tos(SB) - MOVQ $8(SP), R1 + MOVQ $12(SP), R1 + MOVL R1, _errnoloc(SB) + MOVQ $16(SP), R1 MOVL R1, _privates(SB) MOVQ $NPRIVATES, R1 MOVL R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/arm/main9.s b/sys/src/ape/lib/ap/arm/main9.s index 9913ea59d..3e291ac61 100644 --- a/sys/src/ape/lib/ap/arm/main9.s +++ b/sys/src/ape/lib/ap/arm/main9.s @@ -5,16 +5,19 @@ sb=12 #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVW $setR12(SB), R(sb) /* _tos = arg */ MOVW R(arg), _tos(SB) - MOVW $private+8(SP), R1 + MOVW $errno+12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $private+16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/arm/main9p.s b/sys/src/ape/lib/ap/arm/main9p.s index f5dc65344..e1ae6443e 100644 --- a/sys/src/ape/lib/ap/arm/main9p.s +++ b/sys/src/ape/lib/ap/arm/main9p.s @@ -5,16 +5,19 @@ sb=12 #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVW $setR12(SB), R(sb) /* _tos = arg */ MOVW R(arg), _tos(SB) - MOVW $private+8(SP), R1 + MOVW $errno+12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $private+16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/mips/main9.s b/sys/src/ape/lib/ap/mips/main9.s index 03db87a98..ef36522de 100644 --- a/sys/src/ape/lib/ap/mips/main9.s +++ b/sys/src/ape/lib/ap/mips/main9.s @@ -1,10 +1,11 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVW $setR30(SB), R30 /* _tos = arg */ @@ -17,7 +18,9 @@ TEXT _main(SB), 1, $(3*4+NPRIVATES*4) ADDD F26, F26, F28 ADDD F28, F28, F30 */ - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/mips/main9p.s b/sys/src/ape/lib/ap/mips/main9p.s index adc6e00b3..a5430763a 100644 --- a/sys/src/ape/lib/ap/mips/main9p.s +++ b/sys/src/ape/lib/ap/mips/main9p.s @@ -1,10 +1,11 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVW $setR30(SB), R30 /* _tos = arg */ @@ -17,7 +18,9 @@ TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) ADDD F26, F26, F28 ADDD F28, F28, F30 */ - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/plan9/_envsetup.c b/sys/src/ape/lib/ap/plan9/_envsetup.c index 21d6be3f4..083a75d17 100644 --- a/sys/src/ape/lib/ap/plan9/_envsetup.c +++ b/sys/src/ape/lib/ap/plan9/_envsetup.c @@ -19,7 +19,7 @@ */ char **environ; -int errno; +int *_errnoloc; unsigned long _clock; static void fdsetup(char *, char *); static void sigsetup(char *, char *); diff --git a/sys/src/ape/lib/ap/plan9/_errno.c b/sys/src/ape/lib/ap/plan9/_errno.c index 8e5caad7d..e7e1e355b 100644 --- a/sys/src/ape/lib/ap/plan9/_errno.c +++ b/sys/src/ape/lib/ap/plan9/_errno.c @@ -10,7 +10,7 @@ char _plan9err[ERRMAX]; static struct errmap { - int errno; + int num; char *ename; } map[] = { /* from /sys/src/9/port/errstr.h */ @@ -119,6 +119,6 @@ _syserrno(void) if(strstr(_plan9err, map[i].ename) != 0) break; _ERRSTR(_plan9err, sizeof _plan9err); - errno = (i < NERRMAP)? map[i].errno : EINVAL; + errno = (i < NERRMAP)? map[i].num : EINVAL; } } diff --git a/sys/src/ape/lib/ap/plan9/_fdinfo.c b/sys/src/ape/lib/ap/plan9/_fdinfo.c index 0252fb6d1..7a3415c93 100644 --- a/sys/src/ape/lib/ap/plan9/_fdinfo.c +++ b/sys/src/ape/lib/ap/plan9/_fdinfo.c @@ -1,12 +1,12 @@ #define _BSDTIME_EXTENSION #include "lib.h" #include <sys/stat.h> -#include <stdlib.h> #include <unistd.h> +#include <errno.h> +#include <stdlib.h> #include "sys9.h" #include <string.h> -extern int errno; Fdinfo _fdinfo[OPEN_MAX]; /* diff --git a/sys/src/ape/lib/ap/power/main9.s b/sys/src/ape/lib/ap/power/main9.s index 8323e463e..5ecf0f2c1 100644 --- a/sys/src/ape/lib/ap/power/main9.s +++ b/sys/src/ape/lib/ap/power/main9.s @@ -1,16 +1,19 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVW $setSB(SB), R2 /* _tos = arg */ MOVW R3, _tos(SB) - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/power/main9p.s b/sys/src/ape/lib/ap/power/main9p.s index 865616980..4565b9d06 100644 --- a/sys/src/ape/lib/ap/power/main9p.s +++ b/sys/src/ape/lib/ap/power/main9p.s @@ -1,16 +1,19 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBAL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVW $setSB(SB), R2 /* _tos = arg */ MOVW R3, _tos(SB) - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/sparc/main9.s b/sys/src/ape/lib/ap/sparc/main9.s index 1284fb267..72a828da8 100644 --- a/sys/src/ape/lib/ap/sparc/main9.s +++ b/sys/src/ape/lib/ap/sparc/main9.s @@ -1,10 +1,11 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _main(SB), 1, $(3*4+NPRIVATES*4) +TEXT _main(SB), 1, $(16+NPRIVATES*4) MOVW $setSB(SB), R2 /* _tos = arg */ @@ -16,7 +17,9 @@ TEXT _main(SB), 1, $(3*4+NPRIVATES*4) FADDD F26, F26, F28 FADDD F28, F28, F30 */ - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/sparc/main9p.s b/sys/src/ape/lib/ap/sparc/main9p.s index 17cc3e2af..0bd9b5aa6 100644 --- a/sys/src/ape/lib/ap/sparc/main9p.s +++ b/sys/src/ape/lib/ap/sparc/main9p.s @@ -1,10 +1,11 @@ #define NPRIVATES 16 GLOBL _tos(SB), $4 +GLOBL _errnoloc(SB), $4 GLOBL _privates(SB), $4 GLOBL _nprivates(SB), $4 -TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) +TEXT _mainp(SB), 1, $(16+NPRIVATES*4) MOVW $setSB(SB), R2 /* _tos = arg */ @@ -16,7 +17,9 @@ TEXT _mainp(SB), 1, $(3*4+NPRIVATES*4) FADDD F26, F26, F28 FADDD F28, F28, F30 */ - MOVW $8(SP), R1 + MOVW $12(SP), R1 + MOVW R1, _errnoloc(SB) + MOVW $16(SP), R1 MOVW R1, _privates(SB) MOVW $NPRIVATES, R1 MOVW R1, _nprivates(SB) diff --git a/sys/src/ape/lib/ap/stdio/iolib.h b/sys/src/ape/lib/ap/stdio/iolib.h index 57eb96085..564ddff24 100644 --- a/sys/src/ape/lib/ap/stdio/iolib.h +++ b/sys/src/ape/lib/ap/stdio/iolib.h @@ -37,7 +37,7 @@ #define WR 4 /* open, buffer allocated, ok to write but not read */ #define ERR 5 /* open, but an uncleared error occurred */ #define END 6 /* open, but at eof */ -char *strerror(int errno); +char *strerror(int); int _IO_setvbuf(FILE *); FILE *_IO_sopenr(const char*); FILE *_IO_sopenw(void); diff --git a/sys/src/ape/lib/ap/stdio/perror.c b/sys/src/ape/lib/ap/stdio/perror.c index 71f5c41f0..19a078b39 100644 --- a/sys/src/ape/lib/ap/stdio/perror.c +++ b/sys/src/ape/lib/ap/stdio/perror.c @@ -2,8 +2,9 @@ * pANS stdio -- perror */ #include "iolib.h" +#include <errno.h> + void perror(const char *s){ - extern int errno; if(s!=NULL && *s != '\0') fputs(s, stderr), fputs(": ", stderr); fputs(strerror(errno), stderr); putc('\n', stderr); |