* fix(native): implement BinarySemaphorePosix with proper pthread synchronization The BinarySemaphorePosix class (used on all Linux/portduino/native builds) had stub implementations: give() was a no-op and take() just called delay(msec) and returned false. This broke the cooperative thread scheduler on native platforms — threads could not wake the main loop, radio RX interrupts were missed, and telemetry never transmitted over the mesh. Replace the stubs with a proper binary semaphore using pthread_mutex_t + pthread_cond_t + bool signaled: - take(msec): pthread_cond_timedwait with CLOCK_REALTIME timeout, consumes signal atomically (binary semaphore semantics) - give(): sets signaled=true, signals condition variable - giveFromISR(): delegates to give(), sets pxHigherPriorityTaskWoken Tested on Raspberry Pi 3 Model B (ARM64, Debian Bookworm) with Adafruit LoRa Radio Bonnet (SX1276). Before fix: no radio TX/RX, no telemetry on mesh. After fix: bidirectional LoRa, MQTT gateway, telemetry all working. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ARCH_PORTDUINO * Refactor BinarySemaphorePosix header for ARCH_PORTDUINO * Change preprocessor directive from ifndef to ifdef * Gate new Semaphore code to Portduino and fix STM compilation * Binary Semaphore Posix better error handling --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
40 lines
543 B
C++
40 lines
543 B
C++
#pragma once
|
|
|
|
#include "../freertosinc.h"
|
|
|
|
#ifdef ARCH_PORTDUINO
|
|
#include <pthread.h>
|
|
#endif
|
|
|
|
namespace concurrency
|
|
{
|
|
|
|
#ifndef HAS_FREE_RTOS
|
|
|
|
class BinarySemaphorePosix
|
|
{
|
|
|
|
#ifdef ARCH_PORTDUINO
|
|
pthread_mutex_t mutex;
|
|
pthread_cond_t cond;
|
|
bool signaled;
|
|
#endif
|
|
|
|
public:
|
|
BinarySemaphorePosix();
|
|
~BinarySemaphorePosix();
|
|
|
|
/**
|
|
* Returns false if we timed out
|
|
*/
|
|
bool take(uint32_t msec);
|
|
|
|
void give();
|
|
|
|
void giveFromISR(BaseType_t *pxHigherPriorityTaskWoken);
|
|
};
|
|
|
|
#endif
|
|
|
|
} // namespace concurrency
|