15 for(p = dtproviders; *p != nil; p++){
16 assert((*p)->name != nil);
17 assert((*p)->provide != nil);
18 assert((*p)->enable != nil);
19 assert((*p)->disable != nil);
28 for(i = 0; i < dtnmach; i++){
40 c = dtmalloc(sizeof(DTChan));
41 c->rdbufs = dtmalloc(sizeof(DTBuf *) * dtnmach);
42 c->wrbufs = dtmalloc(sizeof(DTBuf *) * dtnmach);
43 for(i = 0; i < dtnmach; i++){
44 c->rdbufs[i] = dtmalloc(sizeof(DTBuf));
45 c->wrbufs[i] = dtmalloc(sizeof(DTBuf));
47 c->aggrdbufs = dtmalloc(sizeof(DTBuf *) * dtnmach);
48 c->aggwrbufs = dtmalloc(sizeof(DTBuf *) * dtnmach);
49 for(i = 0; i < dtnmach; i++){
50 c->aggrdbufs[i] = dtmalloc(sizeof(DTBuf));
51 c->aggwrbufs[i] = dtmalloc(sizeof(DTBuf));
52 memset(c->aggrdbufs[i]->data, -1, DTBUFSZ);
53 memset(c->aggwrbufs[i]->data, -1, DTBUFSZ);
68 for(i = 0; i < dtnmach; i++){
74 for(i = 0; i < dtnmach; i++){
75 free(ch->aggrdbufs[i]);
76 free(ch->aggwrbufs[i]);
84 dtcaddgr(DTChan *c, char *name, DTActGr *gr)
90 if(dtgverify(c, gr) < 0)
94 nl = dtpmatch(name, &l);
97 werrstr("no match for %s", name);
101 for(i = 0; i < nl; i++){
104 if(p->prov->enable(p) < 0)
106 ep = dtmalloc(sizeof(DTEnab));
107 ep->epid = c->epidalloc++;
110 ep->probnext = &p->enablist;
111 ep->probprev = p->enablist.probprev;
112 ep->probnext->probprev = ep;
113 ep->channext = c->enab;
118 /* careful, has to be atomic for dtptrigger */
120 ep->probprev->probnext = ep;
127 dtcaddcl(DTChan *c, DTClause *cl)
132 for(i = 0; i < cl->nprob; i++)
133 rc += dtcaddgr(c, cl->probs[i], cl->gr);
138 dtcbufswap(DTChan *c, int n)
144 c->rdbufs[n] = c->wrbufs[n];
150 dtcread(DTChan *c, void *buf, int n)
154 if(c->state == DTCFAULT){
155 werrstr("%s", c->errstr);
158 for(i = 0; i < dtnmach; i++){
159 if(swapped = c->rdbufs[i]->wr == 0)
161 if(c->rdbufs[i]->wr != 0){
162 if(c->rdbufs[i]->wr > n){
163 werrstr("short read");
166 n = c->rdbufs[i]->wr;
167 memmove(buf, c->rdbufs[i]->data, n);
168 c->rdbufs[i]->wr = 0;
178 dtcaggbufswap(DTChan *c, int n)
184 c->aggrdbufs[n] = c->aggwrbufs[n];
190 dtcaggread(DTChan *c, void *buf, int n)
194 if(c->state == DTCFAULT){
195 werrstr("%s", c->errstr);
198 for(i = 0; i < dtnmach; i++){
199 if(swapped = c->aggrdbufs[i]->wr == 0)
201 if(c->aggrdbufs[i]->wr != 0){
202 if(c->aggrdbufs[i]->wr > n){
203 werrstr("short read");
206 n = c->aggrdbufs[i]->wr;
207 memmove(buf, c->aggrdbufs[i]->data, n);
208 c->aggrdbufs[i]->wr = 0;
209 memset(c->aggrdbufs[i]->data + DTABUCKETS, -1, 4 * DTANUMBUCKETS);
223 for(ep = c->enab; ep != nil; ep = ep->channext){
224 /* careful! has to look atomic for dtptrigger */
225 ep->probprev->probnext = ep->probnext;
226 ep->probnext->probprev = ep->probprev;
229 for(ep = c->enab; ep != nil; eq = ep->channext, free(ep), ep = eq){
230 if(--ep->gr->ref == 0)
232 if(--ep->prob->nenable == 0)
233 ep->prob->prov->disable(ep->prob);
239 dtcrun(DTChan *c, int newstate)
241 assert(newstate == DTCSTOP || newstate == DTCGO);