mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-02 17:28:30 +00:00
Improve cancellations, randomness, and time
- Exhaustively document cancellation points - Rename SIGCANCEL to SIGTHR just like BSDs - Further improve POSIX thread cancellations - Ensure asynchronous cancellations work correctly - Elevate the quality of getrandom() and getentropy() - Make futexes cancel correctly on OpenBSD 6.x and 7.x - Add reboot.com and shutdown.com to examples directory - Remove underscore prefix from awesome timespec_*() APIs - Create assertions that help verify our cancellation points - Remove bad timespec APIs (cmp generalizes eq/ne/gt/gte/lt/lte)
This commit is contained in:
parent
0d7c265392
commit
3f0bcdc3ef
173 changed files with 1599 additions and 782 deletions
|
@ -26,10 +26,12 @@
|
|||
TEST(DescribeSigset, full) {
|
||||
sigset_t ss;
|
||||
sigfillset(&ss);
|
||||
if (IsXnu() || IsOpenbsd()) {
|
||||
EXPECT_STREQ("~{ABRT,CANCEL,KILL,STOP}", DescribeSigset(0, &ss));
|
||||
if (IsXnu()) {
|
||||
EXPECT_STREQ("~{ABRT,THR,KILL,STOP}", DescribeSigset(0, &ss));
|
||||
} else if (IsOpenbsd()) {
|
||||
EXPECT_STREQ("~{ABRT,KILL,STOP,THR}", DescribeSigset(0, &ss));
|
||||
} else {
|
||||
EXPECT_STREQ("~{ABRT,KILL,STOP,CANCEL}", DescribeSigset(0, &ss));
|
||||
EXPECT_STREQ("~{ABRT,KILL,STOP,THR}", DescribeSigset(0, &ss));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,11 +48,11 @@ TEST(DescribeSigset, absent) {
|
|||
sigfillset(&ss);
|
||||
sigdelset(&ss, SIGINT);
|
||||
sigdelset(&ss, SIGUSR1);
|
||||
if (IsOpenbsd() || IsXnu()) {
|
||||
EXPECT_STREQ("~{INT,ABRT,CANCEL,KILL,STOP,USR1}", DescribeSigset(0, &ss));
|
||||
} else if (IsFreebsd() || IsNetbsd()) {
|
||||
EXPECT_STREQ("~{INT,ABRT,KILL,STOP,USR1,CANCEL}", DescribeSigset(0, &ss));
|
||||
if (IsXnu()) {
|
||||
EXPECT_STREQ("~{INT,ABRT,THR,KILL,STOP,USR1}", DescribeSigset(0, &ss));
|
||||
} else if (IsBsd()) {
|
||||
EXPECT_STREQ("~{INT,ABRT,KILL,STOP,USR1,THR}", DescribeSigset(0, &ss));
|
||||
} else {
|
||||
EXPECT_STREQ("~{INT,ABRT,KILL,USR1,STOP,CANCEL}", DescribeSigset(0, &ss));
|
||||
EXPECT_STREQ("~{INT,ABRT,KILL,USR1,STOP,THR}", DescribeSigset(0, &ss));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ void TestContendedLock(const char *name, int kind) {
|
|||
_Exit(1);
|
||||
}
|
||||
while (!atomic_load(&ready)) donothing;
|
||||
t1 = _timespec_real();
|
||||
t1 = timespec_real();
|
||||
for (i = 0; i < n; ++i) {
|
||||
ASSERT_EQ(0, pthread_mutex_lock(&mu));
|
||||
x = atomic_load_explicit(&counter, memory_order_relaxed);
|
||||
|
@ -139,13 +139,13 @@ void TestContendedLock(const char *name, int kind) {
|
|||
ASSERT_EQ(x - 1, atomic_load_explicit(&counter, memory_order_relaxed));
|
||||
ASSERT_EQ(0, pthread_mutex_unlock(&mu));
|
||||
}
|
||||
t2 = _timespec_real();
|
||||
t2 = timespec_real();
|
||||
while (tib.tib_tid) donothing;
|
||||
ASSERT_EQ(1, atomic_load(&success));
|
||||
ASSERT_EQ(0, atomic_load(&counter));
|
||||
_freestack(stk);
|
||||
ASSERT_EQ(0, pthread_mutex_destroy(&mu));
|
||||
ns = time2dbl(_timespec_sub(t2, t1)) / n;
|
||||
ns = time2dbl(timespec_sub(t2, t1)) / n;
|
||||
kprintf("%s contended took %s\n", name, time2str(ns));
|
||||
}
|
||||
|
||||
|
@ -159,14 +159,14 @@ void TestUncontendedLock(const char *name, int kind) {
|
|||
pthread_mutexattr_settype(&attr, kind);
|
||||
pthread_mutex_init(&lock, &attr);
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
t1 = _timespec_real();
|
||||
t1 = timespec_real();
|
||||
for (i = 0; i < n; ++i) {
|
||||
pthread_mutex_lock(&lock);
|
||||
pthread_mutex_unlock(&lock);
|
||||
}
|
||||
t2 = _timespec_real();
|
||||
t2 = timespec_real();
|
||||
pthread_mutex_destroy(&lock);
|
||||
ns = time2dbl(_timespec_sub(t2, t1)) / n;
|
||||
ns = time2dbl(timespec_sub(t2, t1)) / n;
|
||||
kprintf("%s took %s\n", name, time2str(ns));
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ void *Waiter(void *arg) {
|
|||
BENCH(lock, scalability) {
|
||||
int i;
|
||||
struct timespec t1, t2;
|
||||
t1 = _timespec_real();
|
||||
t1 = timespec_real();
|
||||
pthread_mutex_init(&lock, 0);
|
||||
pthread_barrier_init(&barrier, 0, WAITERS + 1);
|
||||
for (i = 0; i < WAITERS; ++i) {
|
||||
|
@ -79,8 +79,8 @@ BENCH(lock, scalability) {
|
|||
}
|
||||
pthread_barrier_destroy(&barrier);
|
||||
pthread_mutex_destroy(&lock);
|
||||
t2 = _timespec_real();
|
||||
t2 = timespec_real();
|
||||
printf("consumed %10g seconds real time and %10g seconds cpu time\n",
|
||||
_timespec_tonanos(_timespec_sub(t2, t1)) / 1e9,
|
||||
timespec_tonanos(timespec_sub(t2, t1)) / 1e9,
|
||||
(double)clock() / CLOCKS_PER_SEC);
|
||||
}
|
||||
|
|
|
@ -34,5 +34,6 @@ TEST(strsignal, test) {
|
|||
|
||||
TEST(strsignal, realtime) {
|
||||
if (!SIGRTMIN) return;
|
||||
EXPECT_STREQ("SIGTHR", strsignal(SIGTHR));
|
||||
ASSERT_STREQ("SIGRTMIN+1", strsignal(SIGRTMIN + 1));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue