summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_private.h
Commit message (Collapse)AuthorAgeFilesLines
* Deliver signals posted via an upcall to the appropriate thread.mini2003-02-171-0/+30
|
* Schedule an idle context to block until timeouts expire without blockingmini2002-11-121-0/+12
| | | | further upcalls.
* Use KSE to schedule threads.mini2002-10-301-23/+10
|
* Make libpthread KSE aware.mini2002-09-161-327/+7
| | | | | Reviewed by: deischen, julian Approved by: -arch
* Make the changes needed for libpthread to compile in its new home.mini2002-09-161-3/+3
| | | | | | | | The new libpthread will provide POSIX threading support using KSE. These files were previously repo-copied from src/lib/libc_r. Reviewed by: deischen Approved by: -arch
* Remove much of the dereferencing of the fd table entries to lookdeischen2002-08-291-3/+5
| | | | | | | | | | | at file flags and replace it with functions that will avoid null pointer checks. MFC to be done by archie ;-) PR: 42100 Reviewed by: archie, robert MFC after: 3 days
* Missed in earlier commit -- I did cvs commit src/lib/libc. Oops.rwatson2002-06-141-6/+0
|
* Revamp suspend and resume. While I'm here add pthread_suspend_all_np()deischen2002-05-241-27/+4
| | | | | | | | | | | | | and pthread_resume_all_np(). These suspend and resume all threads except the current thread, respectively. The existing functions pthread_single_np() and pthread_multi_np(), which formerly had no effect, now exhibit the same behaviour and pthread_suspend_all_np() and pthread_resume_all_np(). These functions have been added mostly for the native java port. Don't allow the uthread kernel pipe to use the same descriptors as stdio. Mostily submitted by Oswald Buddenhagen <ossi@kde.org>. Correct some minor style nits.
* Undo namespace pollution by prefixing the globals pthread_guard_default andalfred2002-05-151-2/+2
| | | | | | | | pthread_page_size. Fix a bunch line wrapping. Pointed out by: deischen
* Don't use PAGE_SIZE in userland, instead use getpagesize(), this is toalfred2002-05-131-5/+5
| | | | | | | allow running on other arches when the instructions are supported but the page size granularity is not. Glanced at by: peter
* Add the ability to recognize old references to keys, and return NULLdeischen2002-03-191-10/+8
| | | | | when old keys are referenced (after pthread_key_delete()) via pthread_getspecific().
* Don't rely on <sys/signal.h> to include <sys/ucontext.h>deischen2002-02-171-0/+1
|
* This has been sitting in my local tree long enough. Remove the usedeischen2002-02-091-46/+9
| | | | | | | | | | | | | | of an alternate signal stack for handling signals. Let the kernel send signals on the stack of the current thread and teach the threads signal handler how to deliver signals to the current thread if it needs to. Also, always store a threads context as a jmp_buf. Eventually this will change to be a ucontext_t or mcontext_t. Other small nits. Use struct pthread * instead of pthread_t in internal library routines. The threads code wants struct pthread *, and pthread_t doesn't necessarily have to be the same. Reviewed by: jasone
* Use the real function address (instead of function address + 8) for thedeischen2001-12-221-2/+2
| | | | | | | | | return address when modifying a jmp_buf to create a new thread context. Also set t12 with the return address. This should fix libc_r on alpha. With much detective work by: Bernd Walter <ticso@cicely.de>
* Fix pthread_join so that it works if the target thread exits whiledeischen2001-11-171-2/+11
| | | | | | | the joining thread is in a signal handler. Reported by: Loren James Rittle <rittle@labs.mot.com> MFC after: 1 week
* Make libc_r check the kern.usrstack sysctl instead of using internalpeter2001-10-261-0/+7
| | | | | | | kernel #defines to figure out where the stack is located. This stops libc_r from exploding when the kernel is compiled with a different KVM size. IMHO this is all kinda bogus, it would be better to just check %esp and work from that.
* Style: sort __sys_foo() prototypes, tabs -> spaces, etc.ru2001-10-261-78/+78
|
* Removed:ru2001-10-261-14/+10
| | | | | | | | | | | | | | | | | | | | | | | | - uthread_signal.c; libc_r does not wrap signal() since 1998/04/29. - uthread_attr_setprio.c; it was never connected to the build, and pthread_attr_setprio() does not exist in POSIX. - uthread_sigblock.c and uthread_sigsetmask.c; these were no-ops bloating libc_r's space. pthread_private.h: - Removed prototypes of non-syscalls: send(). - Removed prototypes of unused syscalls: sigpending(), sigsuspend(), and select(). - Fixed prototype of fork(). - MFS: Fixed prototypes of <sys/socket.h> syscalls. Reviewed by: deischen Approved by: deischen, jasone
* Fix a bug in canceling joining threads.jasone2001-08-161-0/+1
| | | | | | | Do not detach canceled threads. Reported by: Arno Klaassen <arno@heho.snv.jussieu.fr> Collaboration with: deischen
* Implement pthread_attr_[gs]etguardsize(). Non-default-size stacks used tojasone2001-07-201-38/+12
| | | | | | | | be malloc()ed, but they are now allocated using mmap(), just as the default-size stacks are. A separate cache of stacks is kept for non-default-size stacks. Collaboration with: deischen
* Fix a race condition in pthread_join(). All of the following must occurjasone2001-06-271-1/+0
| | | | | | | | | | | | atomically: 1) Search _thread_list for the thread to join. 2) Search _dead_list for the thread to join. 3) Set the running thread as the joiner. While we're at it, fix a race in the case where multiple threads try to join on the same thread. POSIX says that the behavior of multiple joiners is undefined, but the fix is cheap as a result of the other fix.
* Instead of using a join queue for each thread, use a single pointer tojasone2001-05-201-17/+16
| | | | | | | | | | | keep track of a joiner. POSIX only supports a single joiner, so this simplification is acceptable. At the same time, make sure to mark a joined thread as detached so that its resources can be freed. Reviewed by: deischen PR: 24345
* Add thread safety wrappers for the posix1e syscalls that deal with filetmm2001-04-041-0/+14
| | | | | | | descriptors. Approved by: rwatson Obtained from: TrustedBSD Project
* Limit threads clock resolution to no less than 1000usec (1000Hz).deischen2001-02-261-0/+1
| | | | | PR: 25300 Submitted by: Tom Pavel <pavel@alum.mit.edu> (in part)
* Remove (int) file descriptor locking. It should be up to thedeischen2001-02-111-2/+1
| | | | | | | | | | | | | application to provide locking for I/O operations. This doesn't break any of my tests, but the old behavior can be restored by compiling with _FDLOCKS_ENABLED. This will eventually be removed when it is obvious it does not cause any problems. Remove most of flockfile implementation, with the exception of flockfile_debug. Make error messages more informational (submitted by Mike Heffner <spock@techfour.net>, who's now known as mikeh@FreeBSD.org).
* s/_thread_sys_write/__sys_write/deischen2001-01-311-2/+2
| | | | Submitted by: Mike Heffner <mheffner@vt.edu>
* Unbreak world by correctly specifying the prototype for __sys_aio_suspend.deischen2001-01-291-1/+1
| | | | | | A make buildworld was done but not with the committed pthread_private.h. Reported by: Manfred Antar <null@pozo.com>
* _exit in libc is now __sys_exit not __sys__exit.deischen2001-01-291-3/+3
| | | | | | Add another check for thread library initialization (jdp, we really need a way to get _thread_init called at program start before any constructors are run).
* Add weak definitions for wrapped system calls. In general:deischen2001-01-241-140/+81
| | | | | | | | | | | | | | | | | | | | | | | | | | | _foo - wrapped system call foo - weak definition to _foo and for cancellation points: _foo - wrapped system call __foo - enter cancellation point, call _foo(), leave cancellation point foo - weak definition to __foo Change use of global _thread_run to call a function to get the currently running thread. Make all pthread_foo functions weak definitions to _pthread_foo, where _pthread_foo is the implementation. This allows an application to provide its own pthread functions. Provide slightly different versions of pthread_mutex_lock and pthread_mutex_init so that we can tell the difference between a libc mutex and an application mutex. Threads holding mutexes internal to libc should never be allowed to exit, call signal handlers, or cancel. Approved by: -arch
* Fix MD macros to work for alpha. Without this fix, threads under alphadeischen2000-11-201-4/+4
| | | | | | | | seem to be totally broke. MFC Candidate Submitted by: gallatin
* When entering the scheduler from the signal handler, telldeischen2000-11-141-1/+4
| | | | | | | | | | | the kernel to (re)use the alternate signal stack. In this case, we don't return normally from the signal handler, so the kernel still thinks we are using the signal stack. The fixes a nasty bug where the signal handler can start fiddling with the stack of a thread while the handler is actually running on the same stack. MFC candidate
* Don't needlessly poll file descriptors when there are nodeischen2000-11-091-31/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | file descriptors needing to be polled (Doh!). Reported by Dan Nelson <dnelson@emsphone.com>. Don't install and start the scheduling timer until the first thread is created. This prevents the overhead of having a periodic scheduling signal in a single threaded program. Reported by Dan Nelson <dnelson@emsphone.com>. Allow builtin longjmps out of application installed signal handlers without the need perform any post-handler cleanup: o Change signal handling to save the threads interrupted context on the stack. The threads current context is now always stored in the same place (in the pthread). If and when a signal handler returns, the interrupted context is copied back to the storage area in the pthread. o Before calling invoking a signal handler for a thread, back the thread out of any internal waiting queues (mutex, CV, join, etc) to which it belongs. Rework uthread_info.c a bit to make it easier to change the format of a thread dump. Use an alternal signal stack for the thread library's signal handler. This allows us to fiddle with the main threads stack without fear of it being in use. Reviewed by: jasone
* Try and get libc_r to compile again on the alpha after deischen's commitpeter2000-10-171-3/+3
|
* Implement zero system call thread switching. Performance ofdeischen2000-10-131-121/+295
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | thread switches should be on par with that under scheduler activations. o Timing is achieved through the use of a fixed interval timer (ITIMER_PROF) to count scheduling ticks instead of retrieving the time-of-day upon every thread switch and calculating elapsed real time. o Polling for I/O readiness is performed once for each scheduling tick instead of every thread switch. o The non-signal saving/restoring versions of setjmp/longjmp are used to save and restore thread contexts. This may allow the removal of _THREAD_SAFE macros from setjmp() and longjmp() - needs more investigation. Change signal handling so that signals are handled in the context of the thread that is receiving the signal. When signals are dispatched to a thread, a special signal handling frame is created on top of the target threads stack. The frame contains the threads saved state information and a new context in which the thread can run. The applications signal handler is invoked through a wrapper routine that knows how to restore the threads saved state and unwind to previous frames. Fix interruption of threads due to signals. Some states were being improperly interrupted while other states were not being interrupted. This should fix several PRs. Signal handlers, which are invoked as a result of a process signal (not by pthread_kill()), are now called with the code (or siginfo_t if SA_SIGINFO was set in sa_flags) and sigcontext_t as received from the process signal handler. Modify the search for a thread to which a signal is delivered. The search algorithm is now: o First thread found in sigwait() with signal in wait mask. o First thread found sigsuspend()'d on the signal. o Current thread if signal is unmasked. o First thread found with signal unmasked. Collapse machine dependent support into macros defined in pthread_private.h. These should probably eventually be moved into separate MD files. Change the range of settable priorities to be compliant with POSIX (0-31). The threads library uses higher priorities internally for real-time threads (not yet implemented) and threads executing signal handlers. Real-time threads and threads running signal handlers add 64 and 32, respectively, to a threads base priority. Some other small changes and cleanups. PR: 17757 18559 21943 Reviewed by: jasone
* Add thread-safe wrapper for fpathconf(2) syscall.sobomax2000-09-191-0/+1
| | | | Reviewed by: jlemon
* Add wrapper for kevent() syscalljlemon2000-08-071-1/+1
| | | | Noted as missing by: nicolas.leonard@animaths.com
* If multiple threads are blocked in sigwait() for the same signal that doesjasone2000-06-271-0/+7
| | | | | | | | | | | | | | | not have a user-supplied signal handler, when a signal is delivered, one thread will receive the signal, and then the code reverts to having no signal handler for the signal. This can leave the other sigwait()ing threads stranded permanently if the signal is later ignored, or can result in process termination when the process should have delivered the signal to one of the threads in sigwait(). To fix this problem, maintain a count of sigwait()ers for each signal that has no default signal handler. Use the count to correctly install/uninstall dummy signal handlers. Reviewed by: deischen
* pthread_mutex_lock(), pthread_cond_trywait(), and pthread_cond_wait() arejasone2000-06-141-1/+12
| | | | | | | | | | not allowed to return EINTR, but use of pthread_suspend_np() could cause EINTR to be returned. To fix this, restructure pthread_suspend_np() so that it does not interrupt a thread that is waiting on a mutex or condition, and keep enough state around that pthread_resume_np() can fix things up afterwards. Reviewed by: deischen
* Back out the previous change to the queue(3) interface.jake2000-05-261-20/+20
| | | | | | It was not discussed and should probably not happen. Requested by: msmith and others
* Change the way that the queue(3) structures are declared; don't assume thatjake2000-05-231-20/+20
| | | | | | | | the type argument to *_HEAD and *_ENTRY is a struct. Suggested by: phk Reviewed by: phk Approved by: mdodd
* Explicitly include sys/cdefs.h to get the definition of __strong_reference(),jasone2000-03-181-0/+1
| | | | rather than getting lucky due to header dependencies.
* Fix pthread_suspend_np/pthread_resume_np. For the record, suspending adeischen2000-03-151-1/+3
| | | | | | | | | | | | | | thread waiting on an event (I/O, condvar, etc) will, when resumed using pthread_resume_np, return with EINTR. For example, suspending and resuming a thread blocked on read() will not requeue the thread for the read, but will return -1 with errno = EINTR. If the suspended thread is in a critical region, the thread is suspended as soon as it leaves the critical region. Fix a bogon in pthread_kill() where a signal was being delivered twice to threads waiting in sigwait(). Reported by (suspend/resume bug): jdp Reviewed by: jasone
* Minor *jmp() cleanups.jasone2000-01-201-2/+3
|
* Add sem_*() functions. Named semaphores and process-shared semaphoresjasone2000-01-201-0/+12
| | | | | | | are not supported by this implementation, and the error return values from sem_init(), sem_open(), sem_close(), and sem_unlink() reflect this. Approved by: jkh
* Do signal deferral for pthread_kill() as it was done in the old days.jasone2000-01-201-5/+0
| | | | Submitted by: deischen
* Implement continuations to correctly handle [sig|_]longjmp() inside of ajasone2000-01-191-1/+52
| | | | | | | | | | | | | | | | | | | | | | signal handler. Explicitly check for jumps to anywhere other than the current stack, since such jumps are undefined according to POSIX. While we're at it, convert thread cancellation to use continuations, since it's cleaner than the original cancellation code. Avoid delivering a signal to a thread twice. This was a pre-existing bug, but was likely unexposed until these other changes were made. Defer signals generated by pthread_kill() so that they can be delivered on the appropriate stack. deischen claims that this is unnecessary, which is likely true, but without this change, pthread_kill() can cause undefined priority queue states and/or PANICs in [sig|_]longjmp(), so I'm leaving this in for now. To compile this code out and exercise the bug, define the _NO_UNDISPATCH cpp macro. Defining _PTHREADS_INVARIANTS as well will cause earlier crashes. PR: kern/14685 Collaboration with: deischen
* Don't explicitly mmap() red zones at the bottom of thread stacks (exceptjasone1999-12-291-5/+18
| | | | | | | | | | the initial thread). Instead, just leave an unmapped gap between thread stacks and make sure that the thread stacks won't grow into these gaps, simply by limiting the size of the stacks with the 'len' argument to mmap(). This (if I understand correctly) reduces VM overhead considerably. Reviewed by: deischen
* Fixes for signal handling:deischen1999-12-171-1/+3
| | | | | | | | | | | | | | o Don't call signal handlers with the signal handler access lock held. o Remove pending signals before calling signal handlers. If pending signals were not removed prior to handling them, invocation of the handler could cause the handler to be called more than once for the same signal. Found by: JB o When SIGCHLD arrives, wake up all threads in PS_WAIT_WAIT (wait4). PR: bin/15328 Reviewed by: jasone
* Change signal handling to conform to POSIX specified semantics.deischen1999-12-041-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before this change, a signal was delivered to each thread that didn't have the signal masked. Signals also improperly woke up threads waiting on I/O. With this change, signals are now handled in the following way: o If a thread is waiting in a sigwait for the signal, then the thread is woken up. o If no threads are sigwait'ing on the signal and a thread is in a sigsuspend waiting for the signal, then the thread is woken up. o In the case that no threads are waiting or suspended on the signal, then the signal is delivered to the first thread we find that has the signal unmasked. o If no threads are waiting or suspended on the signal, and no threads have the signal unmasked, then the signal is added to the process wide pending signal set. The signal will be delivered to the first thread that unmasks the signal. If there is an installed signal handler, it is only invoked if the chosen thread was not in a sigwait. In the case that multiple threads are waiting or suspended on a signal, or multiple threads have the signal unmasked, we wake up/deliver the signal to the first thread we find. The above rules still apply. Reported by: Scott Hess <scott@avantgo.com> Reviewed by: jb, jasone
* * Fix the stack allocation code so that it works for alpha. Change itdfr1999-11-281-1/+3
| | | | | | | | | to use mmap(..., MAP_STACK, ...) on alpha too since that should work now. * Add hooks to allow GDB to access the internals of pthreads without having to know the exact layout of struct pthread. Reviewed by: deischen
OpenPOWER on IntegriCloud