22 snprint(buf, sizeof buf, "/tmp/X%d.%.4sacme", getpid(), getuser());
23 for(i='A'; i<='Z'; i++){
25 if(access(buf, AEXIST) == 0)
27 fd = create(buf, ORDWR|ORCLOSE|OCEXEC, 0600);
39 d = emalloc(sizeof(Disk));
42 fprint(2, "acme: can't create temp file: %r\n");
43 threadexitsall("diskinit");
50 ntosize(uint n, uint *ip)
55 error("internal error: ntosize");
57 if(size & (Blockincr-1))
58 size += Blockincr - (size & (Blockincr-1));
59 /* last bucket holds blocks of exactly Maxblock */
62 return size * sizeof(Rune);
66 disknewblock(Disk *d, uint n)
71 size = ntosize(n, &i);
74 d->free[i] = b->u.next;
76 /* allocate in chunks to reduce malloc overhead */
78 blist = emalloc(100*sizeof(Block));
79 for(j=0; j<100-1; j++)
80 blist[j].u.next = &blist[j+1];
92 diskrelease(Disk *d, Block *b)
97 b->u.next = d->free[i];
102 diskwrite(Disk *d, Block **bp, Rune *r, uint n)
108 size = ntosize(b->u.n, nil);
109 nsize = ntosize(n, nil);
112 b = disknewblock(d, n);
115 if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
116 error("write error to temp file");
121 diskread(Disk *d, Block *b, Rune *r, uint n)
124 error("internal error: diskread");
126 ntosize(b->u.n, nil);
127 if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
128 error("read error from temp file");