diff options
author | wtc%google.com <devnull@localhost> | 2008-05-03 13:41:41 +0000 |
---|---|---|
committer | wtc%google.com <devnull@localhost> | 2008-05-03 13:41:41 +0000 |
commit | 11ab9ebc62a89b4335dff4d98f5a1abfd0dae966 (patch) | |
tree | 66085919ca767e84e041d1cde7e1ab01732d7a99 /pr/src/md | |
parent | 00a6f0952dabddaa23ec8f166952ec4dbb98155f (diff) | |
download | nspr-hg-11ab9ebc62a89b4335dff4d98f5a1abfd0dae966.tar.gz |
Bug 430884: removed the obsolete implementation based on Solaris threads.
Contributed by Julien Pierre <julien.pierre.boogz@sun.com>. r=wtc.
Modified Files:
configure configure.in lib/msgc/tests/Makefile.in
lib/prstreams/tests/testprstrm/Makefile.in
lib/tests/Makefile.in pr/include/md/_solaris.h
pr/src/Makefile.in pr/src/cplus/tests/Makefile.in
pr/src/md/unix/solaris.c pr/tests/Makefile.in
pr/tests/foreign.c pr/tests/provider.c tools/Makefile.in
Removed Files:
pr/src/md/unix/os_SunOS.s
Diffstat (limited to 'pr/src/md')
-rw-r--r-- | pr/src/md/unix/os_SunOS.s | 71 | ||||
-rw-r--r-- | pr/src/md/unix/solaris.c | 696 |
2 files changed, 0 insertions, 767 deletions
diff --git a/pr/src/md/unix/os_SunOS.s b/pr/src/md/unix/os_SunOS.s deleted file mode 100644 index 15aac599..00000000 --- a/pr/src/md/unix/os_SunOS.s +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - - .text - -/* - * sol_getsp() - * - * Return the current sp (for debugging) - */ - .global sol_getsp -sol_getsp: - retl - mov %sp, %o0 - - -/* - * sol_curthread() - * - * Return a unique identifier for the currently active thread. - */ - .global sol_curthread -sol_curthread: - retl - mov %g7, %o0 - - - .global __MD_FlushRegisterWindows - .global _MD_FlushRegisterWindows - -__MD_FlushRegisterWindows: -_MD_FlushRegisterWindows: - - ta 3 - ret - restore - diff --git a/pr/src/md/unix/solaris.c b/pr/src/md/unix/solaris.c index 2ec3bd1e..6acffedb 100644 --- a/pr/src/md/unix/solaris.c +++ b/pr/src/md/unix/solaris.c @@ -86,700 +86,6 @@ PRWord *_MD_HomeGCRegisters(PRThread *t, PRIntn isCurrent, PRIntn *np) } #endif /* _PR_PTHREADS */ -#if !defined(i386) && !defined(IS_64) -#if defined(_PR_HAVE_ATOMIC_OPS) -/* NOTE: - * SPARC v9 (Ultras) do have an atomic test-and-set operation. But - * SPARC v8 doesn't. We should detect in the init if we are running on - * v8 or v9, and then use assembly where we can. - * - * This code uses the Solaris threads API. It can be used in both the - * pthreads and Solaris threads versions of nspr20 because "POSIX threads - * and Solaris threads are fully compatible even within the same process", - * to quote from pthread_create(3T). - */ - -#include <thread.h> -#include <synch.h> - -static mutex_t _solaris_atomic = DEFAULTMUTEX; - -PRInt32 -_MD_AtomicIncrement(PRInt32 *val) -{ - PRInt32 rv; - if (mutex_lock(&_solaris_atomic) != 0) - PR_ASSERT(0); - - rv = ++(*val); - - if (mutex_unlock(&_solaris_atomic) != 0)\ - PR_ASSERT(0); - - return rv; -} - -PRInt32 -_MD_AtomicAdd(PRInt32 *ptr, PRInt32 val) -{ - PRInt32 rv; - if (mutex_lock(&_solaris_atomic) != 0) - PR_ASSERT(0); - - rv = ((*ptr) += val); - - if (mutex_unlock(&_solaris_atomic) != 0)\ - PR_ASSERT(0); - - return rv; -} - -PRInt32 -_MD_AtomicDecrement(PRInt32 *val) -{ - PRInt32 rv; - if (mutex_lock(&_solaris_atomic) != 0) - PR_ASSERT(0); - - rv = --(*val); - - if (mutex_unlock(&_solaris_atomic) != 0)\ - PR_ASSERT(0); - - return rv; -} - -PRInt32 -_MD_AtomicSet(PRInt32 *val, PRInt32 newval) -{ - PRInt32 rv; - if (mutex_lock(&_solaris_atomic) != 0) - PR_ASSERT(0); - - rv = *val; - *val = newval; - - if (mutex_unlock(&_solaris_atomic) != 0)\ - PR_ASSERT(0); - - return rv; -} -#endif /* _PR_HAVE_ATOMIC_OPS */ -#endif /* !defined(i386) */ - -#if defined(_PR_GLOBAL_THREADS_ONLY) -#include <signal.h> -#include <errno.h> -#include <fcntl.h> -#include <thread.h> - -#include <sys/lwp.h> -#include <sys/procfs.h> -#include <sys/syscall.h> -extern int syscall(); /* not declared in sys/syscall.h */ - -static sigset_t old_mask; /* store away original gc thread sigmask */ -static PRIntn gcprio; /* store away original gc thread priority */ - -THREAD_KEY_T threadid_key; -THREAD_KEY_T cpuid_key; -THREAD_KEY_T last_thread_key; -static sigset_t set, oldset; - -static void -threadid_key_destructor(void *value) -{ - PRThread *me = (PRThread *)value; - PR_ASSERT(me != NULL); - /* the thread could be PRIMORDIAL (thus not ATTACHED) */ - if (me->flags & _PR_ATTACHED) { - /* - * The Solaris thread library sets the thread specific - * data (the current thread) to NULL before invoking - * the destructor. We need to restore it to prevent the - * _PR_MD_CURRENT_THREAD() call in _PRI_DetachThread() - * from attaching the thread again. - */ - _PR_MD_SET_CURRENT_THREAD(me); - _PRI_DetachThread(); - } -} - -void _MD_EarlyInit(void) -{ - THR_KEYCREATE(&threadid_key, threadid_key_destructor); - THR_KEYCREATE(&cpuid_key, NULL); - THR_KEYCREATE(&last_thread_key, NULL); - sigemptyset(&set); - sigaddset(&set, SIGALRM); -} - -PRStatus _MD_CreateThread(PRThread *thread, - void (*start)(void *), - PRThreadPriority priority, - PRThreadScope scope, - PRThreadState state, - PRUint32 stackSize) -{ - PRInt32 flags; - - /* mask out SIGALRM for native thread creation */ - thr_sigsetmask(SIG_BLOCK, &set, &oldset); - - /* - * Note that we create joinable threads with the THR_DETACHED - * flag. The reasons why we don't use thr_join to implement - * PR_JoinThread are: - * - We use a termination condition variable in the PRThread - * structure to implement PR_JoinThread across all classic - * nspr implementation strategies. - * - The native threads may be recycled by NSPR to run other - * new NSPR threads, so the native threads may not terminate - * when the corresponding NSPR threads terminate. - */ - flags = THR_SUSPENDED|THR_DETACHED; - if (_PR_IS_GCABLE_THREAD(thread) || (thread->flags & _PR_BOUND_THREAD) || - (scope == PR_GLOBAL_BOUND_THREAD)) - flags |= THR_BOUND; - - if (thr_create(NULL, thread->stack->stackSize, - (void *(*)(void *)) start, (void *) thread, - flags, - &thread->md.handle)) { - thr_sigsetmask(SIG_SETMASK, &oldset, NULL); - return PR_FAILURE; - } - - /* When the thread starts running, then the lwpid is set to the right - * value. Until then we want to mark this as 'uninit' so that - * its register state is initialized properly for GC */ - - thread->md.lwpid = -1; - thr_sigsetmask(SIG_SETMASK, &oldset, NULL); - _MD_NEW_SEM(&thread->md.waiter_sem, 0); - - if ((scope == PR_GLOBAL_THREAD) || (scope == PR_GLOBAL_BOUND_THREAD)) { - thread->flags |= _PR_GLOBAL_SCOPE; - } - - _MD_SET_PRIORITY(&(thread->md), priority); - - /* Activate the thread */ - if (thr_continue( thread->md.handle ) ) { - return PR_FAILURE; - } - return PR_SUCCESS; -} - -void _MD_cleanup_thread(PRThread *thread) -{ - thread_t hdl; - - hdl = thread->md.handle; - - /* - ** First, suspend the thread (unless it's the active one) - ** Because we suspend it first, we don't have to use LOCK_SCHEDULER to - ** prevent both of us modifying the thread structure at the same time. - */ - if ( thread != _PR_MD_CURRENT_THREAD() ) { - thr_suspend(hdl); - } - PR_LOG(_pr_thread_lm, PR_LOG_MIN, - ("(0X%x)[DestroyThread]\n", thread)); - - _MD_DESTROY_SEM(&thread->md.waiter_sem); -} - -void _MD_exit_thread(PRThread *thread) -{ - _MD_CLEAN_THREAD(thread); - _MD_SET_CURRENT_THREAD(NULL); -} - -void _MD_SET_PRIORITY(_MDThread *md_thread, - PRThreadPriority newPri) -{ - PRIntn nativePri; - - if (newPri < PR_PRIORITY_FIRST) { - newPri = PR_PRIORITY_FIRST; - } else if (newPri > PR_PRIORITY_LAST) { - newPri = PR_PRIORITY_LAST; - } - /* Solaris priorities are from 0 to 127 */ - nativePri = newPri * 127 / PR_PRIORITY_LAST; - if(thr_setprio((thread_t)md_thread->handle, nativePri)) { - PR_LOG(_pr_thread_lm, PR_LOG_MIN, - ("_PR_SetThreadPriority: can't set thread priority\n")); - } -} - -void _MD_WAIT_CV( - struct _MDCVar *md_cv, struct _MDLock *md_lock, PRIntervalTime timeout) -{ - struct timespec tt; - PRUint32 msec; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - PR_ASSERT((!suspendAllOn) || (suspendAllThread != me)); - - if (PR_INTERVAL_NO_TIMEOUT == timeout) { - COND_WAIT(&md_cv->cv, &md_lock->lock); - } else { - msec = PR_IntervalToMilliseconds(timeout); - - GETTIME(&tt); - tt.tv_sec += msec / PR_MSEC_PER_SEC; - tt.tv_nsec += (msec % PR_MSEC_PER_SEC) * PR_NSEC_PER_MSEC; - /* Check for nsec overflow - otherwise we'll get an EINVAL */ - if (tt.tv_nsec >= PR_NSEC_PER_SEC) { - tt.tv_sec++; - tt.tv_nsec -= PR_NSEC_PER_SEC; - } - COND_TIMEDWAIT(&md_cv->cv, &md_lock->lock, &tt); - } -} - -void _MD_lock(struct _MDLock *md_lock) -{ -#ifdef DEBUG - /* This code was used for GC testing to make sure that we didn't attempt - * to grab any locks while threads are suspended. - */ - PRLock *lock; - - if ((suspendAllOn) && (suspendAllThread == _PR_MD_CURRENT_THREAD())) { - lock = ((PRLock *) ((char*) (md_lock) - offsetof(PRLock,ilock))); - PR_ASSERT(lock->owner == NULL); - return; - } -#endif /* DEBUG */ - - mutex_lock(&md_lock->lock); -} - -PRThread *_pr_attached_thread_tls() -{ - PRThread *ret; - - thr_getspecific(threadid_key, (void **)&ret); - return ret; -} - -PRThread *_pr_current_thread_tls() -{ - PRThread *thread; - - thread = _MD_GET_ATTACHED_THREAD(); - - if (NULL == thread) { - thread = _PRI_AttachThread( - PR_USER_THREAD, PR_PRIORITY_NORMAL, NULL, 0); - } - PR_ASSERT(thread != NULL); - - return thread; -} - -PRStatus -_MD_wait(PRThread *thread, PRIntervalTime ticks) -{ - _MD_WAIT_SEM(&thread->md.waiter_sem); - return PR_SUCCESS; -} - -PRStatus -_MD_WakeupWaiter(PRThread *thread) -{ - if (thread == NULL) { - return PR_SUCCESS; - } - _MD_POST_SEM(&thread->md.waiter_sem); - return PR_SUCCESS; -} - -_PRCPU *_pr_current_cpu_tls() -{ - _PRCPU *ret; - - thr_getspecific(cpuid_key, (void **)&ret); - return ret; -} - -PRThread *_pr_last_thread_tls() -{ - PRThread *ret; - - thr_getspecific(last_thread_key, (void **)&ret); - return ret; -} - -_MDLock _pr_ioq_lock; - -void -_MD_InitIO(void) -{ - _MD_NEW_LOCK(&_pr_ioq_lock); -} - -PRStatus _MD_InitializeThread(PRThread *thread) -{ - if (!_PR_IS_NATIVE_THREAD(thread)) - return PR_SUCCESS; - /* sol_curthread is an asm routine which grabs GR7; GR7 stores an internal - * thread structure ptr used by solaris. We'll use this ptr later - * with suspend/resume to find which threads are running on LWPs. - */ - thread->md.threadID = sol_curthread(); - /* prime the sp; substract 4 so we don't hit the assert that - * curr sp > base_stack - */ - thread->md.sp = (uint_t) thread->stack->allocBase - sizeof(long); - thread->md.lwpid = _lwp_self(); - thread->md.handle = THR_SELF(); - - /* all threads on Solaris are global threads from NSPR's perspective - * since all of them are mapped to Solaris threads. - */ - thread->flags |= _PR_GLOBAL_SCOPE; - - /* For primordial/attached thread, we don't create an underlying native thread. - * So, _MD_CREATE_THREAD() does not get called. We need to do initialization - * like allocating thread's synchronization variables and set the underlying - * native thread's priority. - */ - if (thread->flags & (_PR_PRIMORDIAL | _PR_ATTACHED)) { - _MD_NEW_SEM(&thread->md.waiter_sem, 0); - _MD_SET_PRIORITY(&(thread->md), thread->priority); - } - return PR_SUCCESS; -} - -/* Sleep for n milliseconds, n < 1000 */ -void solaris_msec_sleep(int n) -{ - struct timespec ts; - - ts.tv_sec = 0; - ts.tv_nsec = 1000000*n; - if (syscall(SYS_nanosleep, &ts, 0, 0) < 0) { - PR_ASSERT(0); - } -} - -#define VALID_SP(sp, bottom, top) \ - (((uint_t)(sp)) > ((uint_t)(bottom)) && ((uint_t)(sp)) < ((uint_t)(top))) - -void solaris_record_regs(PRThread *t, prstatus_t *lwpstatus) -{ -#ifdef sparc - long *regs = (long *)&t->md.context.uc_mcontext.gregs[0]; - - PR_ASSERT(_PR_IS_GCABLE_THREAD(t)); - PR_ASSERT(t->md.threadID == lwpstatus->pr_reg[REG_G7]); - - t->md.sp = lwpstatus->pr_reg[REG_SP]; - PR_ASSERT(VALID_SP(t->md.sp, t->stack->stackBottom, t->stack->stackTop)); - - regs[0] = lwpstatus->pr_reg[R_G1]; - regs[1] = lwpstatus->pr_reg[R_G2]; - regs[2] = lwpstatus->pr_reg[R_G3]; - regs[3] = lwpstatus->pr_reg[R_G4]; - regs[4] = lwpstatus->pr_reg[R_O0]; - regs[5] = lwpstatus->pr_reg[R_O1]; - regs[6] = lwpstatus->pr_reg[R_O2]; - regs[7] = lwpstatus->pr_reg[R_O3]; - regs[8] = lwpstatus->pr_reg[R_O4]; - regs[9] = lwpstatus->pr_reg[R_O5]; - regs[10] = lwpstatus->pr_reg[R_O6]; - regs[11] = lwpstatus->pr_reg[R_O7]; -#elif defined(i386) - /* - * To be implemented and tested - */ - PR_ASSERT(0); - PR_ASSERT(t->md.threadID == lwpstatus->pr_reg[GS]); - t->md.sp = lwpstatus->pr_reg[UESP]; -#endif -} - -void solaris_preempt_off() -{ - sigset_t set; - - (void)sigfillset(&set); - syscall(SYS_sigprocmask, SIG_SETMASK, &set, &old_mask); -} - -void solaris_preempt_on() -{ - syscall(SYS_sigprocmask, SIG_SETMASK, &old_mask, NULL); -} - -int solaris_open_main_proc_fd() -{ - char buf[30]; - int fd; - - /* Not locked, so must be created while threads coming up */ - PR_snprintf(buf, sizeof(buf), "/proc/%ld", getpid()); - if ( (fd = syscall(SYS_open, buf, O_RDONLY)) < 0) { - return -1; - } - return fd; -} - -/* Return a file descriptor for the /proc entry corresponding to the - * given lwp. - */ -int solaris_open_lwp(lwpid_t id, int lwp_main_proc_fd) -{ - int result; - - if ( (result = syscall(SYS_ioctl, lwp_main_proc_fd, PIOCOPENLWP, &id)) <0) - return -1; /* exited??? */ - - return result; -} -void _MD_Begin_SuspendAll() -{ - solaris_preempt_off(); - - PR_LOG(_pr_gc_lm, PR_LOG_ALWAYS, ("Begin_SuspendAll\n")); - /* run at highest prio so I cannot be preempted */ - thr_getprio(thr_self(), &gcprio); - thr_setprio(thr_self(), 0x7fffffff); - suspendAllOn = PR_TRUE; - suspendAllThread = _PR_MD_CURRENT_THREAD(); -} - -void _MD_End_SuspendAll() -{ -} - -void _MD_End_ResumeAll() -{ - PR_LOG(_pr_gc_lm, PR_LOG_ALWAYS, ("End_ResumeAll\n")); - thr_setprio(thr_self(), gcprio); - solaris_preempt_on(); - suspendAllThread = NULL; - suspendAllOn = PR_FALSE; -} - -void _MD_Suspend(PRThread *thr) -{ - int lwp_fd, result; - prstatus_t lwpstatus; - int lwp_main_proc_fd = 0; - - if (!_PR_IS_GCABLE_THREAD(thr) || !suspendAllOn){ - /*XXX When the suspendAllOn is set, we will be trying to do lwp_suspend - * during that time we can't call any thread lib or libc calls. Hence - * make sure that no suspension is requested for Non gcable thread - * during suspendAllOn */ - PR_ASSERT(!suspendAllOn); - thr_suspend(thr->md.handle); - return; - } - - /* XXX Primordial thread can't be bound to an lwp, hence there is no - * way we can assume that we can get the lwp status for primordial - * thread reliably. Hence we skip this for primordial thread, hoping - * that the SP is saved during lock and cond. wait. - * XXX - Again this is concern only for java interpreter, not for the - * server, 'cause primordial thread in the server does not do java work - */ - if (thr->flags & _PR_PRIMORDIAL) - return; - - /* XXX Important Note: If the start function of a thread is not called, - * lwpid is -1. Then, skip this thread. This thread will get caught - * in PR_NativeRunThread before calling the start function, because - * we hold the pr_activeLock during suspend/resume */ - - /* if the thread is not started yet then don't do anything */ - if (!suspendAllOn || thr->md.lwpid == -1) - return; - - if (_lwp_suspend(thr->md.lwpid) < 0) { - PR_ASSERT(0); - return; - } - - if ( (lwp_main_proc_fd = solaris_open_main_proc_fd()) < 0) { - PR_ASSERT(0); - return; /* XXXMB ARGH, we're hosed! */ - } - - if ( (lwp_fd = solaris_open_lwp(thr->md.lwpid, lwp_main_proc_fd)) < 0) { - PR_ASSERT(0); - close(lwp_main_proc_fd); - return; - } - if ( (result = syscall(SYS_ioctl, lwp_fd, PIOCSTATUS, &lwpstatus)) < 0) { - /* Hopefully the thread just died... */ - close(lwp_fd); - close(lwp_main_proc_fd); - return; - } - while ( !(lwpstatus.pr_flags & PR_STOPPED) ) { - if ( (result = syscall(SYS_ioctl, lwp_fd, PIOCSTATUS, &lwpstatus)) < 0) { - PR_ASSERT(0); /* ARGH SOMETHING WRONG! */ - break; - } - solaris_msec_sleep(1); - } - solaris_record_regs(thr, &lwpstatus); - close(lwp_fd); - close(lwp_main_proc_fd); -} - -#ifdef OLD_CODE - -void _MD_SuspendAll() -{ - /* On solaris there are threads, and there are LWPs. - * Calling _PR_DoSingleThread would freeze all of the threads bound to LWPs - * but not necessarily stop all LWPs (for example if someone did - * an attachthread of a thread which was not bound to an LWP). - * So now go through all the LWPs for this process and freeze them. - * - * Note that if any thread which is capable of having the GC run on it must - * had better be a LWP with a single bound thread on it. Otherwise, this - * might not stop that thread from being run. - */ - PRThread *current = _PR_MD_CURRENT_THREAD(); - prstatus_t status, lwpstatus; - int result, index, lwp_fd; - lwpid_t me = _lwp_self(); - int err; - int lwp_main_proc_fd; - - solaris_preempt_off(); - - /* run at highest prio so I cannot be preempted */ - thr_getprio(thr_self(), &gcprio); - thr_setprio(thr_self(), 0x7fffffff); - - current->md.sp = (uint_t)&me; /* set my own stack pointer */ - - if ( (lwp_main_proc_fd = solaris_open_main_proc_fd()) < 0) { - PR_ASSERT(0); - solaris_preempt_on(); - return; /* XXXMB ARGH, we're hosed! */ - } - - if ( (result = syscall(SYS_ioctl, lwp_main_proc_fd, PIOCSTATUS, &status)) < 0) { - err = errno; - PR_ASSERT(0); - goto failure; /* XXXMB ARGH, we're hosed! */ - } - - num_lwps = status.pr_nlwp; - - if ( (all_lwps = (lwpid_t *)PR_MALLOC((num_lwps+1) * sizeof(lwpid_t)))==NULL) { - PR_ASSERT(0); - goto failure; /* XXXMB ARGH, we're hosed! */ - } - - if ( (result = syscall(SYS_ioctl, lwp_main_proc_fd, PIOCLWPIDS, all_lwps)) < 0) { - PR_ASSERT(0); - PR_DELETE(all_lwps); - goto failure; /* XXXMB ARGH, we're hosed! */ - } - - for (index=0; index< num_lwps; index++) { - if (all_lwps[index] != me) { - if (_lwp_suspend(all_lwps[index]) < 0) { - /* could happen if lwp exited */ - all_lwps[index] = me; /* dummy it up */ - } - } - } - - /* Turns out that lwp_suspend is not a blocking call. - * Go through the list and make sure they are all stopped. - */ - for (index=0; index< num_lwps; index++) { - if (all_lwps[index] != me) { - if ( (lwp_fd = solaris_open_lwp(all_lwps[index], lwp_main_proc_fd)) < 0) { - PR_ASSERT(0); - PR_DELETE(all_lwps); - all_lwps = NULL; - goto failure; /* XXXMB ARGH, we're hosed! */ - } - - if ( (result = syscall(SYS_ioctl, lwp_fd, PIOCSTATUS, &lwpstatus)) < 0) { - /* Hopefully the thread just died... */ - close(lwp_fd); - continue; - } - while ( !(lwpstatus.pr_flags & PR_STOPPED) ) { - if ( (result = syscall(SYS_ioctl, lwp_fd, PIOCSTATUS, &lwpstatus)) < 0) { - PR_ASSERT(0); /* ARGH SOMETHING WRONG! */ - break; - } - solaris_msec_sleep(1); - } - solaris_record_regs(&lwpstatus); - close(lwp_fd); - } - } - - close(lwp_main_proc_fd); - - return; -failure: - solaris_preempt_on(); - thr_setprio(thr_self(), gcprio); - close(lwp_main_proc_fd); - return; -} - -void _MD_ResumeAll() -{ - int i; - lwpid_t me = _lwp_self(); - - for (i=0; i < num_lwps; i++) { - if (all_lwps[i] == me) - continue; - if ( _lwp_continue(all_lwps[i]) < 0) { - PR_ASSERT(0); /* ARGH, we are hosed! */ - } - } - - /* restore priority and sigmask */ - thr_setprio(thr_self(), gcprio); - solaris_preempt_on(); - PR_DELETE(all_lwps); - all_lwps = NULL; -} -#endif /* OLD_CODE */ - -#ifdef USE_SETJMP -PRWord *_MD_HomeGCRegisters(PRThread *t, int isCurrent, int *np) -{ - if (isCurrent) { - (void) setjmp(CONTEXT(t)); - } - *np = sizeof(CONTEXT(t)) / sizeof(PRWord); - return (PRWord *) CONTEXT(t); -} -#else -PRWord *_MD_HomeGCRegisters(PRThread *t, PRIntn isCurrent, PRIntn *np) -{ - if (isCurrent) { - (void) getcontext(CONTEXT(t)); - } - *np = NGREG; - return (PRWord*) &t->md.context.uc_mcontext.gregs[0]; -} -#endif /* USE_SETJMP */ - -#else /* _PR_GLOBAL_THREADS_ONLY */ - #if defined(_PR_LOCAL_THREADS_ONLY) void _MD_EarlyInit(void) @@ -860,8 +166,6 @@ PRWord *_MD_HomeGCRegisters(PRThread *t, PRIntn isCurrent, PRIntn *np) #endif /* _PR_LOCAL_THREADS_ONLY */ -#endif /* _PR_GLOBAL_THREADS_ONLY */ - #ifndef _PR_PTHREADS #if defined(i386) && defined(SOLARIS2_4) /* |