summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/libdraw/init.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/src/libdraw/init.c b/sys/src/libdraw/init.c
index c0ed2edbf..f7370e3b4 100644
--- a/sys/src/libdraw/init.c
+++ b/sys/src/libdraw/init.c
@@ -129,10 +129,12 @@ int
gengetwindow(Display *d, char *winname, Image **winp, Screen **scrp, int ref)
{
int n, fd;
- char buf[64+1];
+ char buf[64+1], obuf[64+1];
Image *image;
Rectangle r;
+ obuf[0] = 0;
+retry:
fd = open(winname, OREAD);
if(fd<0 || (n=read(fd, buf, sizeof buf-1))<=0){
if((image=d->image) == nil){
@@ -147,12 +149,22 @@ gengetwindow(Display *d, char *winname, Image **winp, Screen **scrp, int ref)
buf[n] = '\0';
if(*winp != nil){
_freeimage1(*winp);
+ *winp = nil;
freeimage((*scrp)->image);
freescreen(*scrp);
*scrp = nil;
}
image = namedimage(d, buf);
if(image == 0){
+ /*
+ * theres a race where the winname can change after
+ * we read it, so keep trying as long as the name
+ * keeps changing.
+ */
+ if(strcmp(buf, obuf) != 0){
+ strcpy(obuf, buf);
+ goto retry;
+ }
fprint(2, "namedimage %s failed: %r\n", buf);
*winp = nil;
d->screenimage = nil;