[PATCH 3/6] Add support for file descriptor request fields
Daniel Martin
consume.noise at gmail.com
Thu Nov 7 02:30:47 PST 2013
On 6 November 2013 01:39, Keith Packard <keithp at keithp.com> wrote:
> These are present in the API, but not present on the wire.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
> xcbgen/expr.py | 3 ++-
> xcbgen/xtypes.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/xcbgen/expr.py b/xcbgen/expr.py
> index 4f8af6f..f9d5179 100644
> --- a/xcbgen/expr.py
> +++ b/xcbgen/expr.py
> @@ -13,7 +13,7 @@ class Field(object):
> auto is true iff the field is on the wire but not in the request API (e.g. opcode)
> enum is the enum name this field refers to, if any.
> '''
> - def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None):
> + def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None, isfd=False):
> self.type = type
> self.field_type = field_type
> self.field_name = field_name
> @@ -21,6 +21,7 @@ class Field(object):
> self.visible = visible
> self.wire = wire
> self.auto = auto
> + self.isfd = isfd
>
>
> class Expression(object):
> diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py
> index 5012f0b..d007635 100644
> --- a/xcbgen/xtypes.py
> +++ b/xcbgen/xtypes.py
> @@ -75,6 +75,18 @@ class Type(object):
>
> complex_type.fields.append(new_field)
>
> + def make_fd_of(self, module, complex_type, fd_name):
> + '''
> + Method for making a fd member of a structure.
> + '''
> + new_fd = Field(self, module.get_type_name('INT32'), fd_name, True, False, False, None, True)
Reading this and the code how <fd>s are handled:
The <fd> tag is not necessary. It should be an ordinary field - as it
gets handled.
And if the request causes fds to be attached to the reply, should be
an attribute
at the request (or reply).
Because, atm. <fd> is just a trigger to set a boolean (isfd). c_client.py
walks over all fields in the reply (_c_reply_has_fds()), searches for
a field having
isfd==True - if there's such a field it adds the func_flag
'XCB_REQUEST_REPLY_FDS' and generates an additional function via
_c_reply_fds().
You could an FD type:
<typedef oldname="INT32" newname="FD" />
replace the <fd>s with:
<field type="FD" name="..." />
and add an attribute to the requests (or reply) having such field(s)
in the reply.
> + # We dump the _placeholder_byte if any fields are added.
> + for (idx, field) in enumerate(complex_type.fields):
> + if field == _placeholder_byte:
> + complex_type.fields[idx] = new_fd
> + return
> +
> + complex_type.fields.append(new_fd)
>
> class SimpleType(Type):
> '''
> @@ -152,6 +164,44 @@ class Enum(SimpleType):
> out = __main__.output['enum']
>
>
> +class FileDescriptor(SimpleType):
> ...
Is this class a leftover from tests? Looks like it's not used anywhere.
> class ListType(Type):
> '''
> Derived class which represents a list of some other datatype. Fixed- or variable-sized.
> @@ -279,6 +329,7 @@ class ComplexType(Type):
> self.nmemb = 1
> self.size = 0
> self.lenfield_parent = [self]
> + self.fds = []
>
> def resolve(self, module):
> if self.resolved:
> @@ -324,9 +375,14 @@ class ComplexType(Type):
> type.make_member_of(module, self, field_type, field_name, visible, True, False)
> type.resolve(module)
> continue
> + elif child.tag == 'fd':
> + fd_name = child.get('name')
> + type = module.get_type('INT32')
> + type.make_fd_of(module, self, fd_name)
> + continue
> else:
> # Hit this on Reply
> - continue
> + continue
>
> # Get the full type name for the field
> field_type = module.get_type_name(fkey)
> --
> 1.8.4.2
>
> _______________________________________________
> 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
Regardless of using a <fd> or an attribute it looks like you've forgotten to
modify the xml schema. Try `make check-local` in proto/src.
More information about the xorg-devel
mailing list