Add the ability to reinitialize a spinlock (libc/libpthread

internal lock, not a pthread spinlock).

Reviewed by:	davidxu
This commit is contained in:
Daniel Eischen 2003-11-04 19:59:22 +00:00
parent 264978955e
commit 15a06fd231
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=122073
2 changed files with 34 additions and 24 deletions

View file

@ -43,6 +43,7 @@
#define MAX_SPINLOCKS 5
struct spinlock_extra {
spinlock_t *owner;
struct lock lock;
kse_critical_t crit;
};
@ -122,6 +123,7 @@ init_spinlock(spinlock_t *lck)
KSE_LOCK_ACQUIRE(curkse, &spinlock_static_lock);
if ((lck->fname == NULL) && (spinlock_count < MAX_SPINLOCKS)) {
lck->fname = (char *)&extra[spinlock_count];
extra[spinlock_count].owner = lck;
spinlock_count++;
}
KSE_LOCK_RELEASE(curkse, &spinlock_static_lock);
@ -134,19 +136,22 @@ _thr_spinlock_init(void)
int i;
if (initialized != 0) {
_lock_destroy(&spinlock_static_lock);
for (i = 0; i < MAX_SPINLOCKS; i++) {
_lock_destroy(&extra[i].lock);
_lock_reinit(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup);
for (i = 0; i < spinlock_count; i++) {
_lock_reinit(&extra[i].lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup);
}
}
if (_lock_init(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock_static_lock");
for (i = 0; i < MAX_SPINLOCKS; i++) {
if (_lock_init(&extra[i].lock, LCK_ADAPTIVE,
spinlock_count = 0;
} else {
if (_lock_init(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock extra");
PANIC("Cannot initialize spinlock_static_lock");
for (i = 0; i < MAX_SPINLOCKS; i++) {
if (_lock_init(&extra[i].lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock extra");
}
initialized = 1;
}
initialized = 1;
}

View file

@ -43,6 +43,7 @@
#define MAX_SPINLOCKS 5
struct spinlock_extra {
spinlock_t *owner;
struct lock lock;
kse_critical_t crit;
};
@ -122,6 +123,7 @@ init_spinlock(spinlock_t *lck)
KSE_LOCK_ACQUIRE(curkse, &spinlock_static_lock);
if ((lck->fname == NULL) && (spinlock_count < MAX_SPINLOCKS)) {
lck->fname = (char *)&extra[spinlock_count];
extra[spinlock_count].owner = lck;
spinlock_count++;
}
KSE_LOCK_RELEASE(curkse, &spinlock_static_lock);
@ -134,19 +136,22 @@ _thr_spinlock_init(void)
int i;
if (initialized != 0) {
_lock_destroy(&spinlock_static_lock);
for (i = 0; i < MAX_SPINLOCKS; i++) {
_lock_destroy(&extra[i].lock);
_lock_reinit(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup);
for (i = 0; i < spinlock_count; i++) {
_lock_reinit(&extra[i].lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup);
}
}
if (_lock_init(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock_static_lock");
for (i = 0; i < MAX_SPINLOCKS; i++) {
if (_lock_init(&extra[i].lock, LCK_ADAPTIVE,
spinlock_count = 0;
} else {
if (_lock_init(&spinlock_static_lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock extra");
PANIC("Cannot initialize spinlock_static_lock");
for (i = 0; i < MAX_SPINLOCKS; i++) {
if (_lock_init(&extra[i].lock, LCK_ADAPTIVE,
_kse_lock_wait, _kse_lock_wakeup) != 0)
PANIC("Cannot initialize spinlock extra");
}
initialized = 1;
}
initialized = 1;
}