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, DTName name, DTActGr *gr)
90 if(dtgverify(c, gr) < 0)
94 nl = dtpmatch(name, &l);
96 for(i = 0; i < nl; i++){
99 if(p->prov->enable(p) < 0)
101 ep = dtmalloc(sizeof(DTEnab));
102 ep->epid = c->epidalloc++;
105 ep->probnext = &p->enablist;
106 ep->probprev = p->enablist.probprev;
107 ep->probnext->probprev = ep;
108 ep->channext = c->enab;
113 /* careful, has to be atomic for dtptrigger */
115 ep->probprev->probnext = ep;
122 dtnamesplit(char *s, DTName *rp)
127 if(p == nil) return -1;
128 rp->provider = dtmalloc(p - s + 1);
129 memcpy(rp->provider, s, p - s);
137 rp->function = dtmalloc(p - s + 1);
138 memcpy(rp->function, s, p - s);
140 if(strchr(s, ':') != nil){
147 rp->name = dtstrdup(s);
152 dtcaddcl(DTChan *c, DTClause *cl)
158 for(i = 0; i < cl->nprob; i++){
159 if(dtnamesplit(cl->probs[i], &n) < 0){
160 werrstr("invalid probe name '%s'", cl->probs[i]);
163 rc += dtcaddgr(c, n, cl->gr);
172 dtcbufswap(DTChan *c, int n)
178 c->rdbufs[n] = c->wrbufs[n];
184 dtcread(DTChan *c, void *buf, int n)
188 if(c->state == DTCFAULT){
189 werrstr("%s", c->errstr);
192 for(i = 0; i < dtnmach; i++){
193 if(swapped = c->rdbufs[i]->wr == 0)
195 if(c->rdbufs[i]->wr != 0){
196 if(c->rdbufs[i]->wr > n){
197 werrstr("short read");
200 n = c->rdbufs[i]->wr;
201 memmove(buf, c->rdbufs[i]->data, n);
202 c->rdbufs[i]->wr = 0;
212 dtcaggbufswap(DTChan *c, int n)
218 c->aggrdbufs[n] = c->aggwrbufs[n];
224 dtcaggread(DTChan *c, void *buf, int n)
228 if(c->state == DTCFAULT){
229 werrstr("%s", c->errstr);
232 for(i = 0; i < dtnmach; i++){
233 if(swapped = c->aggrdbufs[i]->wr == 0)
235 if(c->aggrdbufs[i]->wr != 0){
236 if(c->aggrdbufs[i]->wr > n){
237 werrstr("short read");
240 n = c->aggrdbufs[i]->wr;
241 memmove(buf, c->aggrdbufs[i]->data, n);
242 c->aggrdbufs[i]->wr = 0;
243 memset(c->aggrdbufs[i]->data + DTABUCKETS, -1, 4 * DTANUMBUCKETS);
257 for(ep = c->enab; ep != nil; ep = ep->channext){
258 /* careful! has to look atomic for dtptrigger */
259 ep->probprev->probnext = ep->probnext;
260 ep->probnext->probprev = ep->probprev;
263 for(ep = c->enab; ep != nil; eq = ep->channext, free(ep), ep = eq){
264 if(--ep->gr->ref == 0)
266 if(--ep->prob->nenable == 0)
267 ep->prob->prov->disable(ep->prob);
273 dtcrun(DTChan *c, int newstate)
275 assert(newstate == DTCSTOP || newstate == DTCGO);