[PATCH libX11] include: Add GetReqSized() for request buffers of specific size

Peter Hutterer peter.hutterer at who-t.net
Sun Oct 16 16:19:02 PDT 2011


On Fri, Oct 14, 2011 at 06:42:02PM +0200, Jamey Sharp wrote:
> The GetReq family of macros is so evil. I'm not going to go so far as
> to NAK this patch or anything, but please consider whether you can
> implement this as a proper function or something. Perhaps:
> 
> void *XGetReq(CARD8 reqType, size_t sz);
> 
> (I think the other macros could be re-implemented on top of that
> function, so long as the function continues to behave in a manner
> compatible with code compiled using the current macros.)
> 
> Also, do you care about big-requests here? I can't remember how Xlib
> handles that extension.

fwiw, GetReqSized is more-or-less a copy of GetReqExtra with one parameter
replaced. And GetReqExtra in turn is a copy of GetReq. From a quick glance
neither of them handle big-req directly.

I'll have a look at getting this to a function instead of a macro.

Cheers,
  Peter

> On 10/14/11, Peter Hutterer <peter.hutterer at who-t.net> wrote:
> > Some XI2 requests change in size over different versions and libXi would
> > need to hack around GetReq and GetReqExtra. Add a new GetReqSized so the
> > library can explicitly specify the size of the request in 4-byte units.
> >
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> > Instead of hacking around in libXi with GetReq, let's just add a new macro.
> >
> >  include/X11/Xlibint.h |   25 +++++++++++++++++++++++++
> >  1 files changed, 25 insertions(+), 0 deletions(-)
> >
> > diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h
> > index 2ce356d..083498f 100644
> > --- a/include/X11/Xlibint.h
> > +++ b/include/X11/Xlibint.h
> > @@ -478,6 +478,31 @@ extern LockInfoPtr _Xglobal_lock;
> >  	dpy->request++
> >  #endif
> >
> > +/* GetReqSized is the same as GetReq but allows the caller to specify the
> > + * size in 4-byte units */
> > +#if !defined(UNIXCPP) || defined(ANSICPP)
> > +#define GetReqSized(name, sz, req) \
> > +        WORD64ALIGN\
> > +	if ((dpy->bufptr + sz * 4) > dpy->bufmax)\
> > +		_XFlush(dpy);\
> > +	req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
> > +	req->reqType = X_##name;\
> > +	req->length = sz; \
> > +	dpy->bufptr += sz * 4;\
> > +	dpy->request++
> > +#else
> > +#define GetReqSized(name, sz, req) \
> > +        WORD64ALIGN\
> > +	if ((dpy->bufptr + sz * 4) > dpy->bufmax)\
> > +		_XFlush(dpy);\
> > +	req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
> > +	req->reqType = X_/**/name;\
> > +	req->length = sz; \
> > +	dpy->bufptr += sz * 4; \
> > +	dpy->request++
> > +#endif
> > +
> > +
> >
> >  /*
> >   * GetResReq is for those requests that have a resource ID
> > --
> > 1.7.6.4
> >
> > _______________________________________________
> > xorg-devel at lists.x.org: X.Org development
> > Archives: http://lists.x.org/archives/xorg-devel
> > Info: http://lists.x.org/mailman/listinfo/xorg-devel
> >


More information about the xorg-devel mailing list