Skip to content
Commit e71dd72b authored by Christopher Friedt's avatar Christopher Friedt Committed by Stephanos Ioannidis
Browse files

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: default avatarChris Friedt <cfriedt@meta.com>
parent ecb82784
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment