[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