[RFC] [PATCH 6/8] [libXRes] Implemented second part of XResource extension v1.2: XResQueryResourceBytes
ext Tiago Vignatti
tiago.vignatti at nokia.com
Wed Dec 29 05:06:08 PST 2010
On Wed, Dec 29, 2010 at 02:59:53PM +0200, ext Tiago Vignatti wrote:
> On Mon, Dec 27, 2010 at 04:57:00PM +0200, ext Erkki Sepp�l� wrote:
> > Reviewed-by: Rami Ylim??ki <rami.ylimaki at vincit.fi>
> > ---
> > include/X11/extensions/XRes.h | 32 +++++++++++++
> > src/XRes.c | 102 +++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 134 insertions(+), 0 deletions(-)
> >
> > diff --git a/include/X11/extensions/XRes.h b/include/X11/extensions/XRes.h
> > index d674423..c16c417 100644
> > --- a/include/X11/extensions/XRes.h
> > +++ b/include/X11/extensions/XRes.h
> > @@ -45,6 +45,24 @@ typedef struct {
> > void *value;
> > } XResClientIdValue;
> >
> > +typedef struct {
> > + XID resource;
> > + Atom type;
> > +} XResResourceIdSpec;
> > +
> > +typedef struct {
> > + XResResourceIdSpec spec;
> > + long bytes;
> > + long ref_count;
> > + long use_count;
> > +} XResResourceSizeSpec;
> > +
> > +typedef struct {
> > + XResResourceSizeSpec size;
> > + long num_cross_references;
> > + XResResourceSizeSpec *cross_references;
> > +} XResResourceSizeValue;
> > +
> > _XFUNCPROTOBEGIN
> >
> > /* v1.0 */
> > @@ -100,6 +118,20 @@ void XResClientIdsDestroy (
> > XResClientIdValue *client_ids
> > );
> >
> > +Status XResQueryResourceBytes (
> > + Display *dpy,
> > + XID client,
> > + long num_specs,
> > + XResResourceIdSpec *resource_specs, /* in */
> > + long *num_sizes, /* out */
> > + XResResourceSizeValue **sizes /* out */
>
> nitpick here, but you could fix the indentation of this last comment.
>
>
> > +);
> > +
> > +void XResResourceSizeValuesDestroy (
> > + long num_sizes,
> > + XResResourceSizeValue *sizes
> > +);
> > +
> > _XFUNCPROTOEND
> >
> > #endif /* _XRES_H */
> > diff --git a/src/XRes.c b/src/XRes.c
> > index e64dc10..9dd0091 100644
> > --- a/src/XRes.c
> > +++ b/src/XRes.c
> > @@ -341,3 +341,105 @@ pid_t XResGetClientPid(
> > return (pid_t) -1;
> > }
> > }
> > +
> > +static Status ReadResourceSizeSpec(
> > + Display *dpy,
> > + XResResourceSizeSpec *size
> > +)
> > +{
> > + _XRead32(dpy, &size->spec.resource, 4);
> > + _XRead32(dpy, &size->spec.type, 4);
> > + _XRead32(dpy, &size->bytes, 4);
> > + _XRead32(dpy, &size->ref_count, 4);
> > + _XRead32(dpy, &size->use_count, 4);
> > + return 0;
> > +}
> > +
> > +static Status ReadResourceSizeValues(
> > + Display *dpy,
> > + long num_sizes,
> > + XResResourceSizeValue *sizes)
> > +{
> > + int c;
> > + int d;
> > + for (c = 0; c < num_sizes; ++c) {
> > + CARD32 num;
> > + ReadResourceSizeSpec(dpy, &sizes[c].size);
> > + _XRead32(dpy, &num, 4);
> > + sizes[c].num_cross_references = num;
> > + sizes[c].cross_references = num ? calloc(num, sizeof(*sizes[c].cross_references)) : NULL;
> > + for (d = 0; d < num; ++d) {
> > + ReadResourceSizeSpec(dpy, &sizes[c].cross_references[d]);
> > + }
> > + }
> > + return Success;
> > +}
> > +
> > +Status XResQueryResourceBytes (
> > + Display *dpy,
> > + XID client,
> > + long num_specs,
> > + XResResourceIdSpec *resource_specs, /* in */
> > + long *num_sizes, /* out */
> > + XResResourceSizeValue **sizes /* out */
> > +)
> > +{
> > + XExtDisplayInfo *info = find_display (dpy);
> > + xXResQueryResourceBytesReq *req;
> > + xXResQueryResourceBytesReply rep;
> > + int c;
> > +
> > + *num_sizes = 0;
> > +
> > + XResCheckExtension (dpy, info, 0);
> > +
> > + LockDisplay (dpy);
> > + GetReq (XResQueryResourceBytes, req);
> > + req->reqType = info->codes->major_opcode;
> > + req->XResReqType = X_XResQueryResourceBytes;
> > + req->length += num_specs * 2; /* 2 longs per client id spec */
> > + req->client = client;
> > + req->numSpecs = num_specs;
> > +
> > + for (c = 0; c < num_specs; ++c) {
> > + Data32(dpy, &resource_specs[c].resource, 4);
> > + Data32(dpy, &resource_specs[c].type, 4);
> > + }
> > +
> > + *num_sizes = 0;
> > + *sizes = NULL;
> > +
> > + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
> > + goto error;
> > + }
> > +
> > + *sizes = calloc(rep.numSizes, sizeof(**sizes));
> > + *num_sizes = rep.numSizes;
> > +
> > + if (ReadResourceSizeValues(dpy, *num_sizes, *sizes) != Success) {
> > + goto error;
> > + }
> > +
> > + UnlockDisplay (dpy);
> > + SyncHandle ();
> > + return Success;
> > +
> > + error:
> > + XResResourceSizeValuesDestroy(*num_sizes, *sizes);
> > +
> > + UnlockDisplay (dpy);
> > + SyncHandle ();
> > + return !Success;
> > +}
> > +
> > +void XResResourceSizeValuesDestroy (
> > + long num_sizes,
> > + XResResourceSizeValue *sizes
> > +)
> > +{
> > + int c;
> > + for (c = 0; c < num_sizes; ++c) {
> > + free(sizes[c].cross_references);
> > + }
> > + free(sizes);
> > +}
>
> In general this commit seems okay, but then again, it's difficult to review
> without having the first one together:
> http://gitorious.org/erkkise/libxres-xresources/commit/568f139caed330574951872d936002ca9627ce97
>
> So I'd ask to re-send all the patchset again with the whole changes between
> what we have at fd.o upstream at this moment and the changes you are
> introducing.
>
> Another thing you can amend in the previous commit is reason of going from 1.0
> to 1.2. Just a short commentary, like the one you mentioned in the
> resourceproto, inside the XRes.h should be enough.
>
> And you can work a bit on the commit subject also of these. Something like
> "version 1.2: implement client identification (XResQueryClientsIds)" seems
> more clear and easy to understand in my opinion.
>
BTW, in my Xeon x86-64 I'm getting this kind of warnings; you may want to fix
these on the proto side probably:
make[2]: Entering directory `/root/git/fdo/lib/libXRes/src'
CC XRes.lo
XRes.c: In function ‘ReadClientValues’:
XRes.c:241: warning: pointer targets in passing argument 2 of ‘_XRead32’
differ in signedness
/opt/master/include/X11/Xlibint.h:646: note: expected ‘long int *’ but
argument is of type ‘XID *’
XRes.c:242: warning: passing argument 2 of ‘_XRead32’ from incompatible
pointer type
/opt/master/include/X11/Xlibint.h:646: note: expected ‘long int *’ but
argument is of type ‘unsigned int *’
XRes.c: In function ‘ReadResourceSizeSpec’:
XRes.c:350: warning: pointer targets in passing argument 2 of ‘_XRead32’
differ in signedness
/opt/master/include/X11/Xlibint.h:646: note: expected ‘long int *’ but
argument is of type ‘XID *’
XRes.c:351: warning: pointer targets in passing argument 2 of ‘_XRead32’
differ in signedness
/opt/master/include/X11/Xlibint.h:646: note: expected ‘long int *’ but
argument is of type ‘Atom *’
XRes.c: In function ‘ReadResourceSizeValues’:
XRes.c:368: warning: passing argument 2 of ‘_XRead32’ from incompatible
pointer type
/opt/master/include/X11/Xlibint.h:646: note: expected ‘long int *’ but
argument is of type ‘CARD32 *’
Tiago
More information about the xorg-devel
mailing list