.. _module-pw_sync_threadx: =============== pw_sync_threadx =============== This is a set of backends for pw_sync based on ThreadX. It is possible, if necessary, to use pw_sync_threadx without using the Pigweed provided pw_chrono_threadx in case the ThreadX time API (``tx_time_get()``)) is not available (i.e. ``TX_NO_TIMER`` is set). You are responsible for ensuring that the chrono backend provided has counts which match the ThreadX tick based API. -------------------------------- Critical Section Lock Primitives -------------------------------- Mutex & TimedMutex ================== The ThreadX backend for the Mutex and TimedMutex use ``TX_MUTEX`` as the underlying type. It is created using ``tx_mutex_create`` as part of the constructors and cleaned up using ``tx_mutex_delete`` in the destructors. InterruptSpinLock ================= The ThreadX backend for InterruptSpinLock is backed by an ``enum class`` and two ``UINT`` which permits these objects to detect accidental recursive locking and unlocking contexts. This object uses ``tx_interrupt_control`` to enable critical sections. In addition, ``tx_thread_preemption_change`` is used to prevent accidental thread context switches while the InterruptSpinLock is held by a thread. .. Warning:: This backend does not support SMP yet as there's no internal lock to spin on. -------------------- Signaling Primitives -------------------- ThreadNotification & TimedThreadNotification ============================================ Prefer using the binary semaphore backends for ThreadNotifications as the native ThreadX API covers direct thread signaling: - ``pw_sync:binary_semaphore_thread_notification_backend`` - ``pw_sync:binary_semaphore_timed_thread_notification_backend`` Background Information ---------------------- Although one may be tempted to use ``tx_thread_sleep`` and ``tx_thread_wait_abort`` to implement direct thread notifications with ThreadX, this unfortunately cannot work. Between the blocking thread setting its ``TX_THREAD*`` handle and actually executing ``tx_thread_sleep`` there will always exist a race condition. Another thread and/or interrupt may attempt to invoke ``tx_thread_wait_abort`` before the blocking thread has executed ``tx_thread_sleep`` meaning the wait abort would fail. BinarySemaphore & CountingSemaphore =================================== The ThreadX backends for the BinarySemaphore and CountingSemaphore use ``TX_SEMAPHORE`` as the underlying type. It is created using ``tx_semaphore_create`` as part of the constructor and cleaned up using ``tx_semaphore_delete`` in the destructor.