added another RWLock test
diff --git a/aos/externals/WPILib/WPILib/RWLock.cpp b/aos/externals/WPILib/WPILib/RWLock.cpp
index 156b7f4..16b77de 100644
--- a/aos/externals/WPILib/WPILib/RWLock.cpp
+++ b/aos/externals/WPILib/WPILib/RWLock.cpp
@@ -7,6 +7,7 @@
#include <taskLib.h>
#include <intLib.h>
#include <assert.h>
+#include <tickLib.h>
#include "RWLock.h"
@@ -272,6 +273,35 @@
return true;
}
+// Makes sure that everything works correctly even if a task is deleted while
+// a lock is held.
+bool DeleteWhileLocked() {
+ Task reader("reader", reinterpret_cast<FUNCPTR>(LockerTask));
+ Task writer("writer", reinterpret_cast<FUNCPTR>(LockerTask));
+ static const unsigned int kDelayTicks = 15;
+ RWLock lock;
+
+ LockerConfig reader_config(&lock, false, kDelayTicks);
+ LockerConfig writer_config(&lock, true, kDelayTicks);
+
+ ULONG start = tickGet();
+ reader.Start(reinterpret_cast<uintptr_t>(&reader_config));
+ while (!reader_config.locked) taskDelay(1);
+ writer.Start(reinterpret_cast<uintptr_t>(&writer_config));
+ reader.Stop();
+ if (tickGet() - start < kDelayTicks) {
+ printf("Reader stopped too quickly.\n");
+ return false;
+ }
+
+ while (!writer_config.done) taskDelay(1);
+ if (tickGet() - start < kDelayTicks * 2) {
+ printf("Writer finished too quickly.\n");
+ return false;
+ }
+ return true;
+}
+
#define RUN_TEST(name) do { \
SetUp(); \
bool test_succeeded = name(); \
@@ -282,9 +312,11 @@
bool successful = true;
RUN_TEST(TwoReaders);
+ RUN_TEST(DeleteWhileLocked);
return successful ? 0 : -1;
}
+#undef RUN_TEST
} // namespace testing
} // namespace