macOS: stub implementation of event API (#476)

* Add runtime checks for event API on macOS

* Fix stub ppoll impl

* Fix lint issues

* Remove assert from event_state_shm_mmap

* Add variable args in ppoll macro

* Skip fake socket tests on macOS

* Add missing newline

* PPOLL and ppoll_impl definitions

* Update macro signature

* Fix issues on linux

* Stub empty implementation of event for macos

* Go back to shorter fds/timeout initialization

* Complete stub implementation of event api

* Fix unused variable warning

* Remove extra space
This commit is contained in:
Kacper Rączy
2023-06-20 02:09:29 +02:00
committed by GitHub
parent f7498faf62
commit f495c6bb90
2 changed files with 36 additions and 5 deletions

View File

@@ -6,16 +6,18 @@
#include <exception>
#include <filesystem>
#include <sys/eventfd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <poll.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include "cereal/messaging/event.h"
#ifndef __APPLE__
#include <sys/eventfd.h>
void event_state_shm_mmap(std::string endpoint, std::string identifier, char **shm_mem, std::string *shm_path) {
const char* op_prefix = std::getenv("OPENPILOT_PREFIX");
@@ -136,8 +138,7 @@ void Event::wait(int timeout_sec) const {
int event_count;
struct pollfd fds = { this->event_fd, POLLIN, 0 };
struct timespec timeout = { timeout_sec, 0 };
struct timespec timeout = { timeout_sec, 0 };;
sigset_t signals;
sigfillset(&signals);
@@ -159,6 +160,7 @@ bool Event::peek() const {
throw_if_invalid();
int event_count;
struct pollfd fds = { this->event_fd, POLLIN, 0 };
// poll with timeout zero to return status immediately
@@ -206,3 +208,29 @@ int Event::wait_for_one(const std::vector<Event>& events, int timeout_sec) {
throw std::runtime_error("Event poll failed, no events ready");
}
#else
// Stub implementation for Darwin, which does not support eventfd
void event_state_shm_mmap(std::string endpoint, std::string identifier, char **shm_mem, std::string *shm_path) {}
SocketEventHandle::SocketEventHandle(std::string endpoint, std::string identifier, bool override) {
std::cerr << "SocketEventHandle not supported on macOS" << std::endl;
assert(false);
}
SocketEventHandle::~SocketEventHandle() {}
bool SocketEventHandle::is_enabled() { return this->state->enabled; }
void SocketEventHandle::set_enabled(bool enabled) {}
Event SocketEventHandle::recv_called() { return Event(); }
Event SocketEventHandle::recv_ready() { return Event(); }
void SocketEventHandle::toggle_fake_events(bool enabled) {}
void SocketEventHandle::set_fake_prefix(std::string prefix) {}
std::string SocketEventHandle::fake_prefix() { return ""; }
Event::Event(int fd): event_fd(fd) {}
void Event::set() const {}
int Event::clear() const { return 0; }
void Event::wait(int timeout_sec) const {}
bool Event::peek() const { return false; }
bool Event::is_valid() const { return false; }
int Event::fd() const { return this->event_fd; }
int Event::wait_for_one(const std::vector<Event>& events, int timeout_sec) { return -1; }
#endif

View File

@@ -1,6 +1,7 @@
import os
import unittest
import multiprocessing
import platform
from parameterized import parameterized_class
import cereal.messaging as messaging
@@ -8,6 +9,7 @@ import cereal.messaging as messaging
WAIT_TIMEOUT = 5
@unittest.skipIf(platform.system() == "Darwin", "Events not supported on macOS")
class TestEvents(unittest.TestCase):
def test_mutation(self):
@@ -61,6 +63,7 @@ class TestEvents(unittest.TestCase):
self.assertFalse(event.peek())
@unittest.skipIf(platform.system() == "Darwin", "FakeSockets not supported on macOS")
@unittest.skipIf("ZMQ" in os.environ, "FakeSockets not supported on ZMQ")
@parameterized_class([{"prefix": None}, {"prefix": "test"}])
class TestFakeSockets(unittest.TestCase):