History

xfreememimage

yiyus committed 15 years ago

Commit 07aba3b1 parent 8a342c84 files · +40 −8Browse files

Unified · Split

4 files
  1. devwsys/devdraw.c +14 −6
  2. devwsys/fns.h +2 −0
  3. devwsys/ixp_fsys.c +1 −0
  4. devwsys/x11/alloc.c +23 −2
devwsys/devdraw.c+14−6
@@ -53,7 +53,7 @@ drawnewclient(Draw *draw) · 52 unmodified lines
5353 }
5454
5555 void
56−drawreplacescreenimage(Client *cl, Memimage *m)
56+drawreplacescreenimage(Window *w, Memimage *m)
5757 {
5858 /*
5959 * Replace the screen image because the screen
@@ -70,10 +70,10 @@ drawreplacescreenimage(Client *cl, Memimage *m) · 10 unmodified lines
7070 Memimage *om;
7171 Memimage *screenimage;
7272
73− screenimage = cl->draw->screenimage;
73+ screenimage = w->draw.screenimage;
7474 // qlock(&sdraw.lk);
7575 om = screenimage;
76− cl->draw->screenimage = m;
76+ w->draw.screenimage = m;
7777 // m->screenref = 1;
7878 // if(om && --om->screenref == 0){
7979 // freememimage(om);
@@ -288,6 +288,10 @@ drawfreedimage(Draw *draw, DImage *dimage) · 208 unmodified lines
288288 Memimage *l;
289289 DScreen *ds;
290290
291+if(!dimage){
292+print("XXX drawfreedimage on nil dimage\n");
293+return;
294+}
291295 dimage->ref--;
292296 if(dimage->ref < 0)
293297 fprint(2, "negative ref in drawfreedimage\n");
@@ -319,8 +323,12 @@ drawfreedimage(Draw *draw, DImage *dimage) · 25 unmodified lines
319323 else
320324 memlfree(l);
321325 drawfreedscreen(draw, ds);
322− }else
323− freememimage(dimage->image);
326+ }else{
327+ // if(l->screenref==0)
328+ xfreememimage(l);
329+ // else if(--l->screenref==0)
330+ // freememimage(l);
331+ }
324332 Return:
325333 free(dimage->fchar);
326334 free(dimage);
@@ -849,7 +857,7 @@ drawmesg(Client *client, void *av, int n) · 522 unmodified lines
849857 if(!repl)
850858 rectclip(&i->clipr, r);
851859 if(drawinstall(client, dstid, i, 0) == 0){
852− freememimage(i);
860+ xfreememimage(i);
853861 goto Edrawmem;
854862 }
855863 memfillcolor(i, value);
devwsys/fns.h+2−0
@@ -26,6 +26,7 @@ void* nextreq(Reqbuf *reqs); · 25 unmodified lines
2626 void deletewin(Window*);
2727 Window* newwin(char*, char*);
2828 int parsewinsize(char*, Rectangle*, int*);
29+void drawreplacescreenimage(Window*, Memimage*);
2930 void setlabel(Window*, char*);
3031
3132 /* Ixp */
@@ -40,6 +41,7 @@ void xclose(void); · 8 unmodified lines
4041
4142 /* X window */
4243 Memimage* xallocmemimage(Window*, Rectangle, ulong, int);
44+void xfreememimage(Memimage*);
4345 void xattach(Window*, char*);
4446 void xdeletewin(Window*);
4547 void xflushmemscreen(Window*, Rectangle);
devwsys/ixp_fsys.c+1−0
@@ -393,6 +393,7 @@ fs_read(Ixp9Req *r) { · 392 unmodified lines
393393 return;
394394 }
395395 readrefresh(buf, r->ifcall.io.count, cl);
396+ ixp_srv_readbuf(r, buf, strlen(buf));
396397 ixp_respond(r, nil);
397398 return;
398399 }
devwsys/x11/alloc.c+23−2
@@ -36,7 +36,7 @@ xallocmemimage(Window *w, Rectangle r, ulong chan, int pixmap) · 35 unmodified lines
3636
3737 xm = mallocz(sizeof(Xmem), 1);
3838 if(xm == nil){
39− freememimage(m);
39+ xfreememimage(m);
4040 return nil;
4141 }
4242
@@ -71,7 +71,7 @@ xallocmemimage(Window *w, Rectangle r, ulong chan, int pixmap) · 28 unmodified lines
7171 ZPixmap, 0, (char*)m->data->bdata, Dx(r), Dy(r),
7272 32, m->width*sizeof(u32int));
7373 if(xi == nil){
74− freememimage(m);
74+ xfreememimage(m);
7575 if(xm->pixmap != pixmap)
7676 XFreePixmap(xconn.display, xm->pixmap);
7777 return nil;
@@ -97,3 +97,24 @@ xallocmemimage(Window *w, Rectangle r, ulong chan, int pixmap) · 19 unmodified lines
9797 // XXX! TODO m->X = xm;
9898 return m;
9999 }
100+
101+void
102+xfreememimage(Memimage *m)
103+{
104+ Xmem *xm;
105+
106+ if(m == nil)
107+ return;
108+
109+ xm = nil; // m->X;
110+ if(xm && m->data->ref == 1){
111+ if(xm->xi){
112+ xm->xi->data = nil;
113+ XFree(xm->xi);
114+ }
115+ XFreePixmap(xconn.display, xm->pixmap);
116+ free(xm);
117+ // m->X = nil;
118+ }
119+ freememimage(m);
120+}