commit b65f95f6d862d4177d6c50b7fc5715d04b215a8d from: rsc date: Fri Feb 17 19:30:59 2006 UTC add locking commit - 19256e0dd9c3c383ada7cc28b67487400c9162e3 commit + b65f95f6d862d4177d6c50b7fc5715d04b215a8d blob - 9e4ac4af3d9e7333feb02ed16a855d0bb0e59307 blob + 7ac3ac2e9c8de9aab087a95261e9d1592e5a626a --- src/cmd/ndb/dnudpserver.c +++ src/cmd/ndb/dnudpserver.c @@ -21,6 +21,7 @@ struct Inprogress int id; }; Inprogress inprog[Maxactive+2]; +QLock inproglk; /* * record client id and ignore retransmissions. @@ -32,6 +33,7 @@ clientrxmit(DNSmsg *req, uchar *buf) Inprogress *p, *empty; Udphdr *uh; + qlock(&inproglk); uh = (Udphdr *)buf; empty = 0; for(p = inprog; p < &inprog[Maxactive]; p++){ @@ -43,17 +45,22 @@ clientrxmit(DNSmsg *req, uchar *buf) if(req->id == p->id) if(req->qd->owner == p->owner) if(req->qd->type == p->type) - if(memcmp(uh, &p->uh, Udphdrsize) == 0) + if(memcmp(uh, &p->uh, Udphdrsize) == 0){ + qunlock(&inproglk); return 0; + } } - if(empty == 0) + if(empty == 0){ + qunlock(&inproglk); return 0; /* shouldn't happen - see slave() and definition of Maxactive */ + } empty->id = req->id; empty->owner = req->qd->owner; empty->type = req->qd->type; memmove(&empty->uh, uh, Udphdrsize); empty->inuse = 1; + qunlock(&inproglk); return empty; }