From: "Erik Schilling" <erik.schilling@linaro.org>
To: <linux-gpio@vger.kernel.org>
Cc: "Viresh Kumar" <viresh.kumar@linaro.org>,
"Alex Bennée" <alex.bennee@linaro.org>
Subject: [libgpiod] Thread safety API contract
Date: Wed, 13 Sep 2023 11:46:39 +0200 [thread overview]
Message-ID: <CVHO091CC80Y.3KUOSLSOBVL0T@ablu-work> (raw)
Hi all!
Currently it looks like libgpiod does not document any kind of thread
safety gurantee. However, the Python bindings tests
(test_request_reconfigure_release_events) are using sequences like this:
Thread 1 creates chip + some watches
Thread 1 creates Thread 2
Thread 2 issues a request_lines on the chip
Thread 2 reconfigures the line direction
Thread 1 joins Thread 2
Thread 1 closes the chip
Implicitly this depends on a couple guarantees:
1. Calling chip-related functions does not require synchronisation
primitives (other than keeping the chip open).
-> wait_info_event, read_info_event and request_lines are called
concurrently
2. Requests may be modified by other threads
-> at least reconfiguring the direction is done
Looking at the C implementations, it indeed looks? like this is a safe
thing to do - with the current implementation.
My question is: Is this an intentional gurantee that will be guranteed
in future releases? I am trying to figure out whether the current
contract exposed by the Rust bindings is correct and/or may need to
be extended. So which guarantees are provided by the current and future
C lib?
Currently, the Rust bindings are advertising that the chip may be `Send`
to other threads. This means one thread may forget about it and another
thread receives it. In contrast, a request for a line is currently not
allowed to be transferred to other threads (it is missing the `Send`
marker).
While in C and C++ thread-safety is typically not enforced by the
compiler, Rust has mechanisms to do this. But I would like to document
the C lib's situation before inventing rules for the Rust bindings :).
Trigger of my question was that we glossed over these details in
vhost-device-gpio:
https://github.com/rust-vmm/vhost-device/pull/435#issuecomment-1717205620
- Erik
next reply other threads:[~2023-09-13 9:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-13 9:46 Erik Schilling [this message]
2023-09-13 12:03 ` [libgpiod] Thread safety API contract Bartosz Golaszewski
2023-09-13 13:36 ` Erik Schilling
2023-09-13 13:45 ` Bartosz Golaszewski
2023-09-13 14:10 ` Erik Schilling
2023-09-13 15:17 ` Bartosz Golaszewski
2023-09-13 20:10 ` Erik Schilling
2023-09-21 13:06 ` Erik Schilling
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CVHO091CC80Y.3KUOSLSOBVL0T@ablu-work \
--to=erik.schilling@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.