summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-03-11 18:57:22 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-03-11 18:57:22 +0100
commit25f04a68a168a948783618910e115316eb0ed3fc (patch)
treeb3cb88e49ef21b5855569918634937bdbf78b19e /sys/src/ape/lib
parent34ec2056041a193a471701dd50e2032dc300fb0e (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/lib')
-rw-r--r--sys/src/ape/lib/ap/386/main9.s7
-rw-r--r--sys/src/ape/lib/ap/386/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/68020/main9.s6
-rw-r--r--sys/src/ape/lib/ap/68020/main9p.s6
-rw-r--r--sys/src/ape/lib/ap/alpha/main9.s7
-rw-r--r--sys/src/ape/lib/ap/alpha/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/arm/main9.s7
-rw-r--r--sys/src/ape/lib/ap/arm/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/mips/main9.s7
-rw-r--r--sys/src/ape/lib/ap/mips/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/plan9/_envsetup.c2
-rw-r--r--sys/src/ape/lib/ap/plan9/_errno.c4
-rw-r--r--sys/src/ape/lib/ap/plan9/_fdinfo.c4
-rw-r--r--sys/src/ape/lib/ap/power/main9.s7
-rw-r--r--sys/src/ape/lib/ap/power/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/sparc/main9.s7
-rw-r--r--sys/src/ape/lib/ap/sparc/main9p.s7
-rw-r--r--sys/src/ape/lib/ap/stdio/iolib.h2
-rw-r--r--sys/src/ape/lib/ap/stdio/perror.c3
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);