epics-libcom-rs 0.25.0

EPICS libCom for Rust — task seam, thread priority bands, errlog, environment and time primitives, and the protocols' shared socket layer
Documentation
# epics-libcom-rs

EPICS `libCom` for Rust: the layer an IOC is built *on*, with no record system
above it. Two modules, named for the two halves of C's libCom they port:

| module | C counterpart | what it is |
|---|---|---|
| `runtime` | `epicsThread`, `epicsTime`, `errlog`, `envDefs`, `epicsString` | the task spawn/sleep/interval seam and its two backends, EPICS priority bands, the general-time provider, the environment-parameter table, `errlog` |
| `net` | `osiSock` | the EPICS protocols' shared socket layer — per-NIC async UDP with TX/RX accuracy, interface enumeration, loopback multicast |

It exists so a consumer that wants the concurrency and socket primitives — a
protocol client, a gateway, `pvxs-rs` — does not have to take the database with
them (issue #55).

**You usually do not depend on this crate directly.** `epics-base-rs` re-exports
both modules at their original paths, so `epics_base_rs::runtime::…` and
`epics_base_rs::net::…` still resolve exactly as before; the split changed no
call site anywhere in the workspace. Depend on `epics-libcom-rs` only when you
want the layer *without* `epics-base-rs`.

## The two task backends

`runtime::task`'s spawn/sleep/interval seam has two mutually exclusive
backends, selected by `build.rs` into one `cfg` so the ~two dozen seam sites
gate on a single uniform condition:

- **`tokio_backend`** — the tokio runtime. The hosted default; you get this
  with no flags.
- **`exec_backend`** — the std-thread background executor (callback pool +
  delayed timer + scanOnce worker). Unconditional on `armv7-rtems-eabihf`,
  which has no tokio reactor.

`EXEC_BACKEND` states which one a given build got, so a crate above can pin its
own copy of the predicate to it with a `const _: () = assert!(…)` —
`epics-base-rs` does exactly that.

## Feature levers

| feature | what it does |
|---|---|
| `rtems-exec-model` | select `exec_backend` on a **hosted** target. For a Linux (e.g. PREEMPT_RT) blocking-front-end deployment that wants the same runtime-free spawn/timer backend the RTEMS build uses, driving async record-processing completion on dedicated OS threads instead of a tokio runtime. Off by default; the hosted default is byte-identical without it. |
| `linux-rt` | back `runtime::sync::PriorityInheritanceMutex` with a `pthread_mutex_t` carrying `PTHREAD_PRIO_INHERIT` (epics-base 7-E `5a8b6e41`). No-op off Linux. Only enable where threads run `SCHED_FIFO`/`SCHED_RR` and unbounded priority inversion is a real risk. |

Both are forwarded by `epics-base-rs`, so `--features epics-base-rs/linux-rt`
and `--features epics-base-rs/rtems-exec-model` mean what they always did.

## RTEMS

The `net` module's socket-bearing submodules (`async_udp_v4`, `iface_map`,
`loopback_mcast`) are host-only — `socket2`/`if-addrs` do not build for
`armv7-rtems-eabihf`, and the RTEMS CA server uses the separate raw-libc socket
driver. The wire constants beside them stay on every target, because the PVA
SEARCH decoder has to embed them on RTEMS too.

`./scripts/rtems-check.sh` compiles this crate for the target in both build
configurations.