Re: [libgpiod v2][PATCH v2 5/5] bindings: python: add the implementation for v2 API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jun 30, 2022 at 04:38:51PM +0800, Kent Gibson wrote:
> On Thu, Jun 30, 2022 at 04:14:50PM +0800, Kent Gibson wrote:
> > On Thu, Jun 30, 2022 at 08:54:24AM +0200, Bartosz Golaszewski wrote:
> > > On Thu, Jun 30, 2022 at 4:25 AM Kent Gibson <warthog618@xxxxxxxxx> wrote:
> > > >
> > > > On Tue, Jun 28, 2022 at 10:42:26AM +0200, Bartosz Golaszewski wrote:
> > > > > This is the implementation of the new python API for libgpiod v2.
> > > > >
> > > >
> > > > [snip]
> > > >
> > > > > +     }
> > > > > +
> > > > > +     res = PyObject_Call(method, args, line_cfg_kwargs);
> > > > > +     Py_DECREF(args);
> > > > > +     Py_DECREF(method);
> > > > > +     if (!Py_IsNone(res)) {
> > > > > +             Py_DECREF(res);
> > > > > +             return NULL;
> > > > > +     }
> > > > > +
> > > >
> > > > Building against python 3.9 (the min required by configure.ac) gives:
> > > >
> > > > module.c:276:7: warning: implicit declaration of function ‘Py_IsNone’; did you mean ‘Py_None’? [-Wimplicit-function-declaration]
> > > >   276 |  if (!Py_IsNone(res)) {
> > > >       |       ^~~~~~~~~
> > > >       |       Py_None
> > > >
> > > >
> > > > Py_IsNone didn't get added to the Stable ABI until 3.10.
> > > >
> > > > Cheers,
> > > > Kent.
> > > 
> > > It seems like most distros still ship python 3.9, I don't want to make
> > > 3.10 the requirement. This can be replaced by `if (res != Py_None)`.
> > > Are there any more build issues?
> > > 
> > 
> > No, that was the only one.
> > 
> 
> But I am seeing a test failure:
> 
> $ sudo bindings/python/tests/gpiod_py_test.py
> .............................................................................F................................
> ======================================================================
> FAIL: test_module_line_request_edge_detection (cases.tests_line_request.ModuleLineRequestWorks)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/home/dev/libgpiod/bindings/python/tests/cases/tests_line_request.py", line 71, in test_module_line_request_edge_detection
>     self.assertTrue(req.wait_edge_event())
> AssertionError: False is not true
> 
> ----------------------------------------------------------------------
> Ran 110 tests in 2.652s
> 
> FAILED (failures=1)
> 

The req.wait_edge_event() does not wait without a timeout parameter,
which is a bit nonintuitive, so the test has a race.
Adding a timeout=datetime.timedelta(microseconds=1) (the shortest
possible) works for me, so anything that triggers a context switch is
probably sufficient, though a longer timeout probably wouldn't hurt.

The Python API should take timeout=NONE to mean wait indefinitely, and
0 as a poll.  And it should take the timeout as a float, not a
timedelta, as per select.select.  From its doc:
"The optional timeout argument specifies a time-out as a floating point
number in seconds. When the timeout argument is omitted the function
blocks until at least one file descriptor is ready. A time-out value of
zero specifies a poll and never blocks."

Cheers,
Kent.




[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux