summaryrefslogtreecommitdiff
path: root/emu/port/discall.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2009-03-25 15:55:14 +0000
committerCharles.Forsyth <devnull@localhost>2009-03-25 15:55:14 +0000
commitdfd1934d5e1ddbeb326f77fc0e52307c801a1a3e (patch)
treef1e8b23278caae95e01d88b00421d6c3642357ef /emu/port/discall.c
parent78dfdcbd59dc8f36975e7695933e3f753957474c (diff)
x20090325-1554
Diffstat (limited to 'emu/port/discall.c')
-rw-r--r--emu/port/discall.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/emu/port/discall.c b/emu/port/discall.c
new file mode 100644
index 00000000..56470d77
--- /dev/null
+++ b/emu/port/discall.c
@@ -0,0 +1,179 @@
+#include "dat.h"
+#include "fns.h"
+#include <interp.h>
+
+#define QP(l) (Prog**)((char*)(l)+sizeof(QLock))
+
+void*
+libqlowner(void *l)
+{
+ return *QP(l);
+}
+
+void
+libqlock(void *l)
+{
+ Prog *p;
+ QLock *q;
+
+ q = l;
+ p = currun();
+ if(p == nil)
+ abort();
+
+ if(!canqlock(q)) {
+ release();
+ qlock(q);
+ acquire();
+ }
+ *QP(l) = p;
+}
+
+void
+libqunlock(void *l)
+{
+ Prog *p;
+ QLock *q;
+
+ q = l;
+ p = currun();
+ if(p == nil)
+ abort();
+ if(*QP(l) != p)
+ abort();
+
+ *QP(l) = nil;
+ qunlock(q);
+}
+
+void*
+libqlalloc(void)
+{
+ QLock *q;
+
+ q = mallocz(sizeof(QLock)+sizeof(Prog*), 1);
+ return q;
+}
+
+void
+libqlfree(void *l)
+{
+ free(l);
+}
+
+vlong
+libseek(int fd, vlong off, int whence)
+{
+ release();
+ off = kseek(fd, off, whence);
+ acquire();
+ return off;
+}
+
+int
+libread(int fd, void *buf, int n)
+{
+ release();
+ n = kread(fd, buf, n);
+ acquire();
+ return n;
+}
+
+int
+libreadn(int fd, void *av, long n)
+{
+ char *a;
+ long m, t;
+
+ a = av;
+ t = 0;
+ release();
+ while(t < n){
+ m = kread(fd, a+t, n-t);
+ if(m <= 0){
+ if(t == 0){
+ acquire();
+ return m;
+ }
+ break;
+ }
+ t += m;
+ }
+ acquire();
+ return t;
+}
+
+int
+libwrite(int fd, void *buf, int n)
+{
+ release();
+ n = kwrite(fd, buf, n);
+ acquire();
+ return n;
+}
+
+int
+libopen(char *name, int omode)
+{
+ int fd;
+
+ release();
+ fd = kopen(name, omode);
+ acquire();
+ return fd;
+}
+
+int
+libclose(int fd)
+{
+ release();
+ fd = kclose(fd);
+ acquire();
+ return fd;
+}
+
+Dir*
+libdirfstat(int fd)
+{
+ Dir *d;
+
+ release();
+ d = kdirfstat(fd);
+ acquire();
+ return d;
+}
+
+int
+libbind(char *s, char *t, int f)
+{
+ int n;
+
+ release();
+ n = kbind(s, t, f);
+ acquire();
+ return n;
+}
+
+void
+libchanclose(void *chan)
+{
+ release();
+ cclose(chan);
+ acquire();
+}
+
+void*
+libfdtochan(int fd, int mode)
+{
+ Chan *c;
+
+ release();
+ if(waserror()) {
+ acquire();
+ return nil;
+ }
+ c = fdtochan(up->env->fgrp, fd, mode, 0, 1);
+ poperror();
+ acquire();
+ return c;
+}