mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-04 11:42:28 +00:00
Make fixes and improvements
- Document more compiler flags - Expose new __print_maps() api - Better overflow checking in mmap() - Improve the shell example somewhat - Fix minor runtime bugs regarding stacks - Make kill() on fork()+execve()'d children work - Support CLONE_CHILD_CLEARTID for proper joining - Fix recent possible deadlock regression with --ftrace
This commit is contained in:
parent
6e52cba37a
commit
ec2cb88058
68 changed files with 1211 additions and 431 deletions
57
libc/intrin/_spinlock_debug_4.c
Normal file
57
libc/intrin/_spinlock_debug_4.c
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/intrin/lockcmpxchgp.h"
|
||||
#include "libc/intrin/spinlock.h"
|
||||
#include "libc/nexgen32e/rdtsc.h"
|
||||
#include "libc/time/clockstonanos.internal.h"
|
||||
|
||||
void _spinlock_debug_4(void *lockptr, const char *lockname, const char *file,
|
||||
int line, const char *func) {
|
||||
unsigned i;
|
||||
uint64_t ts1, ts2;
|
||||
int me, owner, *lock = lockptr;
|
||||
me = gettid();
|
||||
owner = 0;
|
||||
if (!_lockcmpxchgp(lock, &owner, me)) {
|
||||
if (owner == me) {
|
||||
kprintf("%s:%d: warning: lock re-entry on %s in %s()\n", file, line,
|
||||
lockname, func);
|
||||
_Exit(1);
|
||||
}
|
||||
i = 0;
|
||||
ts1 = rdtsc();
|
||||
for (;;) {
|
||||
owner = 0;
|
||||
if (_lockcmpxchgp(lock, &owner, me)) break;
|
||||
ts2 = rdtsc();
|
||||
if (ClocksToNanos(ts1, ts2) > 1000000000ul) {
|
||||
ts1 = ts2;
|
||||
kprintf("%s:%d: warning: slow lock on %s in %s()\n", file, line,
|
||||
lockname, func);
|
||||
}
|
||||
if (++i & 7) {
|
||||
__builtin_ia32_pause();
|
||||
} else {
|
||||
sched_yield();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue