venti: avoid race in mirrorarenas (Michael Kaminsky)

This commit is contained in:
Russ Cox 2007-08-23 11:10:58 -04:00
parent 92baf59b69
commit 6610dac99c

View file

@ -93,6 +93,7 @@ ewritepart(Part *p, u64int offset, u8int *buf, u32int count)
* src with writing dst during copy. This is an easy factor of two * src with writing dst during copy. This is an easy factor of two
* (almost) in performance. * (almost) in performance.
*/ */
static Write wsync;
static void static void
writeproc(void *v) writeproc(void *v)
{ {
@ -100,7 +101,7 @@ writeproc(void *v)
USED(v); USED(v);
while((w = recvp(writechan)) != nil){ while((w = recvp(writechan)) != nil){
if(w->n == 0) if(w == &wsync)
continue; continue;
if(ewritepart(dst, w->o, w->p, w->n) < 0) if(ewritepart(dst, w->o, w->p, w->n) < 0)
w->error = 1; w->error = 1;
@ -147,11 +148,7 @@ copy(uvlong start, uvlong end, char *what, DigestState *ds)
/* /*
* wait for queued write to finish * wait for queued write to finish
*/ */
w[i].p = nil; sendp(writechan, &wsync);
w[i].o = 0;
w[i].n = 0;
w[i].error = 0;
sendp(writechan, &w[i]);
i = 1-i; i = 1-i;
if(w[i].error) if(w[i].error)
return -1; return -1;