posix: pthread_attr_t: match size of newlib variant
Part of the POSIX Roadmap for LTSv3 is to adopt POSIX-related
headers from Newlib. The strategy to get there is to first make
the existing POSIX subsystem work in the presence of Newlib POSIX
types.
Part of the strategy involved adopting Newlib's `uint32_t`
abstraction for some Zephyr POSIX types.
However, some types are declared as structures. Luckily, the API
only passes those structures around in the form of pointers, and
the API only mutates those structures via global functions. With
that, we are able to alias Newlib POSIX types as Zephyr POSIX
structures.
One of the caveats to doing that without introducing stack
corruption is to ensure that the Zephyr POSIX types are <= their
respective Newlib counterparts.
There was only one Zephyr structure for which that requirement
did not hold: `pthread_attr_t`. We left `pthread_attr_t` as the
Newlib definition, and named the Zephyr variant
`struct pthread_attr`.
On 32-bit machines, both structures were 32-bytes.
```
sizeof(pthread_attr_t): 32 sizeof(struct pthread_attr): 32
```
However, on 64-bit machines, `pthread_attr_t` was 40 bytes, while
`struct pthread_attr` was 48 bytes.
```
sizeof(pthread_attr_t): 40 sizeof(struct pthread_attr): 48
```
That triggered the following assertion.
```
BUILD_ASSERT(sizeof(pthread_attr_t)
>= sizeof(struct pthread_attr));
```
The `stacksize` field was subsequently changed from `size_t` to
`uint32_t`, and that reduced the latter to 40 bytes as well,
solving the last real problem.
```
sizeof(pthread_attr_t): 40 sizeof(struct pthread_attr): 40
```
Signed-off-by:
Chris Friedt <cfriedt@meta.com>
Loading
Please sign in to comment