|
|
1.1 root 1: #include "u.h"
2: #include "../port/lib.h"
3: #include "mem.h"
4: #include "dat.h"
5: #include "fns.h"
6: #include "../port/error.h"
7: #include "io.h"
8:
9: /*
10: * The following routines
11: * scsibufreset, scsibuf, scsifree and scsialloc
12: * provide a pool of buffers used for scsi i/o.
13: * This is simplistic at best, and opportunities for
14: * deadlock abound.
15: */
16: #define Nbuf 1
17:
18: struct {
19: Lock;
20: Scsibuf *free;
21: } scsibufalloc;
22:
23: void
24: scsibufreset(ulong datasize)
25: {
26: int i;
27:
28: for(i = 0; i < Nbuf; i++)
29: scsifree(scsialloc(datasize));
30: lock(&scsibufalloc);
31: unlock(&scsibufalloc);
32: }
33:
34: /*
35: * get a scsi io buffer of DATASIZE size
36: */
37: Scsibuf *
38: scsibuf(void)
39: {
40: Scsibuf *b;
41:
42: for(;;) {
43: lock(&scsibufalloc);
44: b = scsibufalloc.free;
45: if(b != 0) {
46: scsibufalloc.free = b->next;
47: unlock(&scsibufalloc);
48: return b;
49: }
50: unlock(&scsibufalloc);
51: resrcwait(0);
52: }
53: return 0; /* not reached */
54: }
55:
56: void
57: scsifree(Scsibuf *b)
58: {
59: lock(&scsibufalloc);
60: b->next = scsibufalloc.free;
61: scsibufalloc.free = b;
62: unlock(&scsibufalloc);
63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.