summaryrefslogtreecommitdiff
path: root/lib/libpthread
Commit message (Collapse)AuthorAgeFilesLines
* After thread was interrupted by signal, it should relock mutex.David Xu2003-06-281-2/+1
| | | | | | | Reviewed by: deischen Notes: svn path=/head/; revision=116973
* if thread is exiting, just returns. kse_thr_interrupt interfaceDavid Xu2003-06-281-2/+6
| | | | | | | | | | was changed, it needs signal parameter, pass -1 to it, it indicates to interrupt syscall. Reviewed by: deischen Notes: svn path=/head/; revision=116972
* Implement _ia64_save_context() and _ia64_restore_context(). BothMarcel Moolenaar2003-06-271-0/+285
| | | | | | | | | | | | | | | | | | | functions are derived from the swapctx() and restorectx() (resp) from sys/ia64/ia64/context.s. The code is expected to be 99% correct, but has not yet been tested. Note that with these functions operating on mcontext_t, we also created the foundation upon which we can implement getcontext(2) and setcontext(2) replacements. It's not guaranteed that the use of these syscalls and _ia64_{save|restore}_context() on the same uicontext_t is actually going to work. Replacing the syscalls is now trivially achieved. This commit completes the ia64 port of libpthread itself (modulo testing and bugfixes). Notes: svn path=/head/; revision=116905
* Implement _ia64_enter_uts(). The purpose of this function is to switchMarcel Moolenaar2003-06-263-1/+101
| | | | | | | | | | | | the register stack and memory stack and call the function given to it. While here, provide empty, non-working, stubs for the context functions (_ia64_save_context() and _ia64_restore_context()) so that anyone can at least compile libkse from CVS sources. Real implementations will follow soon. Notes: svn path=/head/; revision=116870
* Implement _thr_enter_uts() and _thr_switch() as inline functions toMarcel Moolenaar2003-06-261-0/+30
| | | | | | | | | | | | | | minimize the amount and complexity of assembly code that needs to be written. This way the core functionality is spread over 3 elementary functions that don't have to do anything that can more easily and more safely be done in C. As such, assembly code will only have to know about the definition of mcontext_t. The runtime cost of not having these functions being inlined is less important than the cleanliness and maintainability of the code at this stage of the implementation. Notes: svn path=/head/; revision=116866
* Explicitly widen int types before casting to pointer types. On 64-bitMarcel Moolenaar2003-06-241-3/+4
| | | | | | | | | | | platforms the compiler warns about incompatible integer/pointer casts and on ia64 this generally is bad news. We know that what we're doing here is valid/correct, so suppress the warning. No functional change. Sleeps better: marcel Notes: svn path=/head/; revision=116773
* Untangle the inter-dependency of kse types and ksd types/functionsMarcel Moolenaar2003-06-238-16/+112
| | | | | | | | | | | | | | | | | | | | | | by moving the definition of struct ksd to pthread_md.h and removing the inclusion of ksd.h from thr_private.h (which has the definition of struct kse and kse_critical_t). This allows ksd.h to have inline functions that use struct kse and kse_critical_t and generally yields a cleaner implementation at the cost of not having all ksd related types/definitions in one header. Implement the ksd functionality on ia64 by using inline functions and permanently remove ksd.c from the ia64 specific makefile. This change does not clean up the i386 specific version of ksd.h. NOTE: The ksd code on ia64 abuses the tp register in the same way as it is abused in libthr in that it is incompatible with the runtime specification. This will be address when support for TLS hits the tree. Notes: svn path=/head/; revision=116771
* Change the definition of _ksd_curkse, _ksd_curthread andMarcel Moolenaar2003-06-232-7/+7
| | | | | | | | | | | | _ksd_readandclear_tmbx to be function-like. That way we can define them as inline functions or create prototypes for them. This change allows the ksd interface on ia64 to be fully inlined. Notes: svn path=/head/; revision=116719
* Define THR_{G|S}ETCONTEXT to expand to {g|s}etcontext(2).Marcel Moolenaar2003-06-231-0/+38
| | | | | | | Define THR_ALIGN to align at 16-byte boundaries. Notes: svn path=/head/; revision=116708
* Implement atomic_swap_{int|long|ptr}. Define atomic_swap_ptr as aMarcel Moolenaar2003-06-231-0/+47
| | | | | | | | macro that expands to atomic_swap_long() to avoid compiler warnings caused by incompatible pointer passing. Notes: svn path=/head/; revision=116707
* Remove _atomic_lock. It's not used.Marcel Moolenaar2003-06-232-93/+0
| | | | Notes: svn path=/head/; revision=116706
* Move the machine specific files from sys/Makefile.inc and put themMarcel Moolenaar2003-06-235-6/+20
| | | | | | | | in a machine specific makefile. While here, sort the sub-directories in Makefile and remove _atomic_lock.S from all makefiles. Notes: svn path=/head/; revision=116705
* Don't lock scheduler lock twice.David Xu2003-06-181-2/+1
| | | | Notes: svn path=/head/; revision=116514
* After selecting a thread to handle a signal and takingDaniel Eischen2003-06-081-3/+8
| | | | | | | | | | | its scheduling lock, make sure that the thread still has the signal unmasked. Make a debug statement conditional on debugging being enabled. Notes: svn path=/head/; revision=116061
* Insert threads at the end of the free thread list so thatDaniel Eischen2003-06-081-1/+1
| | | | | | | | | | the chance of getting the same thread id when allocating a new thread is reduced. This won't work if the application creates a new thread for every time a thread exits, but we're still within the allowances of POSIX. Notes: svn path=/head/; revision=116060
* Provide a reference to __sys_write. The implementation uses this whenDaniel Eischen2003-06-081-0/+3
| | | | | | | | | | | debugging is enabled so the symbol needs to be resolved before rtld locking is enabled. I may not really know what I'm talking about, but it works. Submitted by: kan Notes: svn path=/head/; revision=116059
* The .Fn functionPhilippe Charnier2003-06-0813-35/+70
| | | | Notes: svn path=/head/; revision=116030
* Don't force -L/usr/lib. This is incorrect because we should not beWarner Losh2003-06-081-1/+1
| | | | | | | | | | looking at the host environment for anything. This breaks building -CURRENT on 4.x as well. Submitted by: kan@ Notes: svn path=/head/; revision=116004
* Only init _thread_sigact once, needn't init it again after a fork().David Xu2003-06-041-31/+31
| | | | | | | Obtained from: deischen Notes: svn path=/head/; revision=115828
* Despite whether threaded mode is turned on, always save thread'sDavid Xu2003-06-041-4/+6
| | | | | | | signal mask. Notes: svn path=/head/; revision=115827
* KMF_DONE is now in /sys/sys/kse.h, no longer need to define it here.David Xu2003-06-042-7/+0
| | | | Notes: svn path=/head/; revision=115798
* Free memory of internal low level lock when mutex and condition variableDavid Xu2003-06-032-0/+9
| | | | | | | | | are destroyed. Submitted by: tegge Notes: svn path=/head/; revision=115761
* Save THR_FLAGS_IN_TDLIST in signal frame, otherwise if a thread receivedDavid Xu2003-05-301-1/+2
| | | | | | | | | | a signal will can not be removed from thread list after it exited. Reviewed by: deischen Approved by: re (jhb) Notes: svn path=/head/; revision=115413
* Attempt to eliminate PLT relocations from rwlock aquire/releaseAlexander Kabaev2003-05-3013-21/+559
| | | | | | | | | | | | | | path, making them suitable for direct use by the dynamic loader. Register libpthread-specific locking API with rtld on startup. This still has some rough edges with signals which should be addresses later. Approved by: re (scottl) Notes: svn path=/head/; revision=115399
* Call the __sys_sigprocmask(the system call) when sigprocmask()Daniel Eischen2003-05-301-1/+4
| | | | | | | | | | | | is called and the application is not threaded. This works around a problem when an application that hasn't yet become threaded tries to jump out of a signal handler. Reported by: mbr Approved by: re@ (rwatson) Notes: svn path=/head/; revision=115398
* Don't really spin on a spinlock; silently convert it to the sameDaniel Eischen2003-05-294-16/+71
| | | | | | | | | | | | | | | low-level lock used by the libpthread implementation. In the future, we'll eliminate spinlocks from libc but that will wait until after 5.1-release. Don't call an application signal handler if the handler is the same as the library-installed handler. This seems to be possible after a fork and is the cause of konsole hangs. Approved by: re@ (jhb) Notes: svn path=/head/; revision=115381
* mdoc(7) fixes.Ruslan Ermilov2003-05-241-1/+2
| | | | | | | Approved by: re (blanket) Notes: svn path=/head/; revision=115288
* Change low-level locking a bit so that we can tell ifDaniel Eischen2003-05-2412-157/+297
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | a lock is being waitied on. Fix a races in join and cancellation. When trying to wait on a CV and the library is not yet threaded, make it threaded so that waiting actually works. When trying to nanosleep() and we're not threaded, just call the system call nanosleep instead of adding the thread to the wait queue. Clean up adding/removing new threads to the "all threads queue", assigning them unique ids, and tracking how many active threads there are. Do it all when the thread is added to the scheduling queue instead of making pthread_create() know how to do it. Fix a race where a thread could be marked for signal delivery but it could be exited before we actually add the signal to it. Other minor cleanups and bug fixes. Submitted by: davidxu Approved by: re@ (blanket for libpthread) Notes: svn path=/head/; revision=115278
* Eek, staticize a couple of functions that shouldn'tDaniel Eischen2003-05-194-24/+24
| | | | | | | | | | | | | | | be external (initialize()!). Remove cancellation points from _pthread_cond_wait and _pthread_cond_timedwait (single underscore versions are libc private functions). Point the weak reference(!) for these functions to the versions with cancellation points. Approved by: re@(blanket till 5/19) Pointed out by: kan (cancellation point bug) Notes: svn path=/head/; revision=115173
* Add a method of yielding the current thread with the schedulerDaniel Eischen2003-05-1614-314/+343
| | | | | | | | | | | | | | | | | | | | | | | | | | lock held (_thr_sched_switch_unlocked()) and use this to avoid dropping the scheduler lock and having the scheduler retake the same lock again. Add a better way of detecting if a low-level lock is in use. When switching out a thread due to blocking in the UTS, don't switch to the KSE's scheduler stack only to switch back to another thread. If possible switch to the new thread directly from the old thread and avoid the overhead of the extra context switch. Check for pending signals on a thread when entering the scheduler and add them to the threads signal frame. This includes some other minor signal fixes. Most of this was a joint effor between davidxu and myself. Reviewed by: davidxu Approved by: re@ (blanket for libpthread) Notes: svn path=/head/; revision=115080
* Make pthread_join() async-cancel-safe. David was going to commitDaniel Eischen2003-05-061-9/+0
| | | | | | | | | | this, but I think he's asleep and want to be sure it gets in before the freeze. Submitted by: davidxu Notes: svn path=/head/; revision=114767
* call dump_queues() only when DEBUG_THREAD_KERN is defined, save someDavid Xu2003-05-051-0/+2
| | | | | | | cpu cycles. Notes: svn path=/head/; revision=114688
* Protect against a race between granting a lock and accessingDaniel Eischen2003-05-042-7/+28
| | | | | | | | | other parts of the lock. Submitted by: davidxu Notes: svn path=/head/; revision=114680
* Fix suspend and resume.Daniel Eischen2003-05-046-43/+47
| | | | | | | Submitted (in part) by: Kazuaki Oda <kaakun@highway.ne.jp> Notes: svn path=/head/; revision=114664
* Handle thread canceled case, it is same as signal caused backout,David Xu2003-05-021-1/+1
| | | | | | | but will break out of loop. Notes: svn path=/head/; revision=114524
* Move the mailbox to the beginning of the thread and align theDaniel Eischen2003-04-305-7/+24
| | | | | | | thread so that the context (SSE FPU state) is also aligned. Notes: svn path=/head/; revision=114295
* Call kse_wakeup_mutli() after remove current thread from RUNQ to avoidDavid Xu2003-04-301-1/+1
| | | | | | | doing unnecessary idle kse wakeup. Notes: svn path=/head/; revision=114267
* Call kse_wakeup_multi() to wakeup idle KSEs when there are threads readyDavid Xu2003-04-301-0/+1
| | | | | | | to run. Notes: svn path=/head/; revision=114266
* Jump to the correct label upon detecting an error.Daniel Eischen2003-04-291-2/+2
| | | | Notes: svn path=/head/; revision=114255
* Create the thread signal lock as a KSE lock (as opposed toDaniel Eischen2003-04-293-22/+23
| | | | | | | | | | | | | | | a thread lock). Better protect access to thread state while searching for threads to handle a signal. Better protect access to process pending signals while processing a thread in sigwait(). Submitted by: davidxu Notes: svn path=/head/; revision=114254
* o Don't add a scope system thread's KSE to the list of availableDaniel Eischen2003-04-2818-159/+322
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | KSEs when it's thread exits; allow the GC handler to do that. o Make spinlock/spinlock critical regions. The following were submitted by davidxu o Alow thr_switch() to take a null mailbox argument. o Better protect cancellation checks. o Don't set KSE specific data when creating new KSEs; rely on the first upcall of the KSE to set it. o Add the ability to set the maximum concurrency level and do this automatically. We should have a way to enable/disable this with some sort of tunable because some applications may not want this to be the default. o Hold the scheduling lock across thread switch calls. o If scheduling of a thread fails, make sure to remove it from the list of active threads. o Better protect accesses to a joining threads when the target thread is exited and detached. o Remove some macro definitions that are now provided by <sys/kse.h>. o Don't leave the library in threaded mode if creation of the initial KSE fails. o Wakeup idle KSEs when there are threads ready to run. o Maintain the number of threads active in the priority queue. Notes: svn path=/head/; revision=114187
* Use the correct link entry for walking the list of threads.Daniel Eischen2003-04-281-9/+2
| | | | | | | | | | | While I'm here, use the TAILQ_FOREACH macro instead of a more manual method which was inherited from libc_r (so we could remove elements from the list which isn't needed for libpthread). Submitted by: Kazuaki Oda <kaakun@highway.ne.jp> Notes: svn path=/head/; revision=114180
* Remove the %gs restoring hack (already commented out).Daniel Eischen2003-04-251-6/+1
| | | | | | | | | | Don't install man pages. Temporarily (again) rename the library to libkse. It will be put back to libpthread after more wide-spread testing. Notes: svn path=/head/; revision=113996
* Add a macro to get the current thread mailbox pointer.Daniel Eischen2003-04-231-0/+1
| | | | Notes: svn path=/head/; revision=113944
* Remove the i386-specific hack (well, we only run on i386 anyways)Daniel Eischen2003-04-231-4/+4
| | | | | | | | | to always set %gs when resuming a thread. Install this library as libpthread instead of libkse. Notes: svn path=/head/; revision=113943
* Protect thread errno from being changed while operatingDaniel Eischen2003-04-233-1/+38
| | | | | | | | | | | on behalf of the KSE. Add a kse_reinit function to reinitialize a reused KSE. Submitted by: davidxu Notes: svn path=/head/; revision=113942
* Set the quantum for scope system threads to 0 (no quantum).Daniel Eischen2003-04-221-0/+2
| | | | Notes: svn path=/head/; revision=113881
* Add a working pthread_[gs]etconcurrency. Initial null implementationDaniel Eischen2003-04-222-0/+121
| | | | | | | | | | | | provided by Sergey A. Osokin <osa@freebsd.org.ru>. In order to test this on a single CPU machine, you need to: sysctl kern.threads.debug=1 sysctl kern.threads.virtual_cpu=2 Notes: svn path=/head/; revision=113871
* Add a couple asserts to pthread_cond_foo to ensure the (low-level)Daniel Eischen2003-04-225-21/+72
| | | | | | | | | | | | | | | | | | lock level is 0. Thus far, the threads implementation doesn't use mutexes or condition variables so the lock level should be 0. Save the return value when trying to schedule a new thread and use this to return an error from pthread_create(). Change the max sleep time for an idle KSE to 1 minute from 2 minutes. Maintain a count of the number of KSEs within a KSEG. With these changes scope system threads seem to work, but heavy use of them crash the kernel (supposedly VM bugs). Notes: svn path=/head/; revision=113870
* Add an i386-specifc hack to always set %gs. There still seemsDaniel Eischen2003-04-217-183/+290
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | to be instances where the kernel doesn't properly save and/or restore it. Use noupcall and nocompleted flags in the KSE mailbox. These require kernel changes to work which will be committed sometime later. Things still work without the changes. Remove the general kse entry function and use two different functions -- one for scope system threads and one for scope process threads. The scope system function is not yet enabled and we use the same function for all threads at the moment. Keep a copy of the KSE stack for the case that a KSE runs a scope system thread and uses the same stack as the thread (no upcalls are generated, so a separate stack isn't needed). This isn't enabled yet. Use a separate field for the KSE waiting flag. It isn't correct to use the mailbox flags field. The following fixes were provided by David Xu: o Initialize condition variable locks with thread versions of the low-level locking functions instead of the kse versions. o Enable threading before creating the first thread instead of after. o Don't enter critical regions when trying to malloc/free or call functions that malloc/free. o Take the scheduling lock when inheriting thread attributes. o Check the attribute's stack pointer instead of the attributes stack size for null when allocating a thread's stack. o Add a kseg reinit function so we don't have to destroy and then recreate the same lock. o Check the return value of kse_create() and return an appropriate error if it fails. o Don't forget to destroy a thread's locks when freeing it. o Examine the correct flags word for checking to see if a thread is in a synchronization queue. Things should now work on an SMP kernel. Notes: svn path=/head/; revision=113786