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));
60 for(i = 0; i < dtnmach; i++){
70 dtcaddgr(DTChan *c, DTName name, DTActGr *gr)
80 nl = dtpmatch(name, &l);
82 for(i = 0; i < nl; i++){
85 if(p->prov->enable(p) < 0)
87 ep = dtmalloc(sizeof(DTEnab));
88 ep->epid = c->epidalloc++;
91 ep->probnext = &p->enablist;
92 ep->probprev = p->enablist.probprev;
93 ep->probnext->probprev = ep;
94 ep->channext = c->enab;
99 /* careful, has to be atomic for dtptrigger */
101 ep->probprev->probnext = ep;
108 dtnamesplit(char *s, DTName *rp)
113 if(p == nil) return -1;
114 rp->provider = dtmalloc(p - s + 1);
115 memcpy(rp->provider, s, p - s);
123 rp->function = dtmalloc(p - s + 1);
124 memcpy(rp->function, s, p - s);
126 if(strchr(s, ':') != nil){
133 rp->name = dtstrdup(s);
138 dtcaddcl(DTChan *c, DTClause *cl)
144 for(i = 0; i < cl->nprob; i++){
145 if(dtnamesplit(cl->probs[i], &n) < 0){
146 werrstr("invalid probe name '%s'", cl->probs[i]);
149 rc += dtcaddgr(c, n, cl->gr);
158 dtcbufswap(DTChan *c, int n)
164 c->rdbufs[n] = c->wrbufs[n];
170 dtcread(DTChan *c, void *buf, int n)
174 if(c->state == DTCFAULT){
175 werrstr("%s", c->errstr);
178 for(i = 0; i < dtnmach; i++){
179 if(swapped = c->rdbufs[i]->wr == 0)
181 if(c->rdbufs[i]->wr != 0){
182 if(c->rdbufs[i]->wr > n){
183 werrstr("short read");
186 n = c->rdbufs[i]->wr;
187 memmove(buf, c->rdbufs[i]->data, n);
188 c->rdbufs[i]->wr = 0;
202 for(ep = c->enab; ep != nil; ep = ep->channext){
203 /* careful! has to look atomic for etptrigger */
204 ep->probprev->probnext = ep->probnext;
205 ep->probnext->probprev = ep->probprev;
208 for(ep = c->enab; ep != nil; eq = ep->channext, free(ep), ep = eq){
209 if(--ep->gr->ref == 0)
211 if(--ep->prob->nenable == 0)
212 ep->prob->prov->disable(ep->prob);
218 dtcrun(DTChan *c, int newstate)
220 assert(newstate == DTCSTOP || newstate == DTCGO);