#endif
#include <boost/test/unit_test.hpp>
#include "mtasker.hh"
+#include <fcntl.h>
BOOST_AUTO_TEST_SUITE(mtasker_cc)
BOOST_CHECK_EQUAL(g_result, o);
}
+static const size_t stackSize = 8 * 1024;
+static const size_t headroom = 256; // Decrease to hit stackoverflow
+
+static void doAlmostStackoverflow(void* arg)
+{
+ auto* mt = reinterpret_cast<MTasker<>*>(arg);
+ int localvar[stackSize / sizeof(int) - headroom]; // expermimentally derived headroom
+ localvar[0] = 0;
+ localvar[sizeof(localvar) / sizeof(localvar[0]) - 1] = 12;
+ if (mt->waitEvent(localvar[sizeof(localvar) / sizeof(localvar[0]) - 1], &localvar[0]) == 1) {
+ g_result = localvar[0];
+ }
+}
+
+BOOST_AUTO_TEST_CASE(test_AlmostStackOverflow)
+{
+ MTasker<> mt(stackSize);
+ mt.makeThread(doAlmostStackoverflow, &mt);
+ struct timeval now;
+ gettimeofday(&now, 0);
+ bool first = true;
+ int o = 25;
+ for (;;) {
+ while (mt.schedule(&now)) {
+ ;
+ }
+ if (first) {
+ mt.sendEvent(12, &o);
+ first = false;
+ }
+ if (mt.noProcesses()) {
+ break;
+ }
+ }
+ BOOST_CHECK_EQUAL(g_result, o);
+}
+
#if defined(HAVE_FIBER_SANITIZER) && defined(__APPLE__) && defined(__arm64__)
// This test is buggy on MacOS when compiled with asan. It also causes subsequents tests to report spurious issues.