summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorn <@>2024-01-08 17:52:02 +0200
committern <@>2024-01-08 17:52:02 +0200
commitbed82f443d340fffb687205b81fbe5fd1beb8336 (patch)
tree964179b2a0f3fb94d388e15a12656df313ad1946
parentc5a6e99248ec0bb68225d1180375fe389975fa56 (diff)
32
-rw-r--r--m.c9
-rw-r--r--makefile8
2 files changed, 11 insertions, 6 deletions
diff --git a/m.c b/m.c
index c3bffb56..731f0100 100644
--- a/m.c
+++ b/m.c
@@ -5,15 +5,20 @@
#ifndef MAP_NORESERVE
#define MAP_NORESERVE 0
#endif
+#if __i386__
+ #define AP(p) ((A)(U)(p)) //type A from pointer
+#else
+ #define AP(p) ((A)(p))
+#endif
Z ST{V*p;W n;B f;}reg[128];Z U nreg;Z UC pnd[128];Z U npnd;
Z V mc(){P(!npnd)F(npnd,U j=pnd[i];munmap(reg[j].p,reg[j].n);reg[j].p=0)npnd=0;U j=0;F(nreg,I(reg[i].p,MC(reg+j,reg+i,SZ*reg);j++))nreg=j;}
Z A mu(V*p)_(F(nreg,P(reg[i].p==p,pnd[npnd++]=i;0))die("UNMAP"))
Z V*mm(W n,U f)_(V*p=mmap(0,n,PROT_READ|PROT_WRITE,MAP_NORESERVE|MAP_PRIVATE|MAP_ANON,-1,0);P((L)p==(C)p,(V*)0)I(nreg==L(reg),mc();I(nreg==L(reg),die("MMAP")))reg[nreg++]=(TY(*reg)){p,n,f};p)
-A mf(U f,U i,U n)_(V*p=mm(pg+n,1);P(!p,eo0())P(mmap(p+pg,n,PROT_READ|PROT_WRITE,MAP_NORESERVE|MAP_PRIVATE|MAP_FIXED,f,i)!=p+pg,mu(p);eo0())A x=(A)p+pg;xb=0;xr=REFB;xT=tC;xn=n;x)
+A mf(U f,U i,U n)_(V*p=mm(pg+n,1);P(!p,eo0())P(mmap(p+pg,n,PROT_READ|PROT_WRITE,MAP_NORESERVE|MAP_PRIVATE|MAP_FIXED,f,i)!=p+pg,mu(p);eo0())A x=AP(p+pg);xb=0;xr=REFB;xT=tC;xn=n;x)
Z A bkt[24];DBG(Z U lck;)
Z W cap(A x/*0*/)_((HD<<xb)-HD)
-Z A mb(U i)_(P(i>=L(bkt),V*p=mm(HD<<i,0);P(!p,die("OOM"))HD+(A)p)A x=bkt[i];P(x,bkt[i]=xX;DBG(xX=0);x)x=mb(i+1);A y=x+(HD<<i);MS(yV-HD,0,HD);yb=i;yX=bkt[i];bkt[i]=y;x)
+Z A mb(U i)_(P(i>=L(bkt),V*p=mm(HD<<i,0);P(!p,die("OOM"))AP(p+HD))A x=bkt[i];P(x,bkt[i]=xX;DBG(xX=0);x)x=mb(i+1);A y=x+(HD<<i);MS(yV-HD,0,HD);yb=i;yX=bkt[i];bkt[i]=y;x)
A1(m0,DBG(lck++;)Q(x)XP(0)P(xr>REFB,xr--;0)I(TR(xT),mrn(xn|!xn,xA);xT=tL)U i=xb;P(!i,mu(xV-pg))P(i>=L(bkt),mu(xV-HD))xX=bkt[i];bkt[i]=x;xr=0;x)
DBG(A1(m1,lck--;P(!x||!xb,0)MS(xV,0xab,cap(x));xn=-1;xT=0;0))
A1(_R,Q(x)XP(x)xr++;x)
diff --git a/makefile b/makefile
index 55d0e995..09d9d785 100644
--- a/makefile
+++ b/makefile
@@ -27,10 +27,10 @@ o/w/x/%.k:w/x/%.k;$M;ln -f $< $@
o/w/index.html:w/index.html k w/inl.k w/*.js;$M;cd w && ./inl.k index.html *.js >../$@ && cd -
o/w/http:w/http.c;$(CC) $< -o $@
-# #nyi
-# O_32=@opts -m32
-# o/32/%.o:%.c *.h;$M;$(CC) $(O_32) -o $@ -c $<
-# k32:$(patsubst %.c,o/32/%.o,$(wildcard *.c));$(CC) $(O_32) -o $@ $^ -lgcc -lm -ldl
+#nyi
+O_32=@opts -m32
+o/32/%.o:%.c *.h;$M;$(CC) $(O_32) -o $@ -c $<
+k32:$(patsubst %.c,o/32/%.o,$(wildcard *.c));$(CC) $(O_32) -o $@ $^ -lgcc -lm -ldl
o/t:t/t.c;$(CC) $< -o $@ -Wall -Wno-unused-result -Werror