version 1.97, 2006/10/31 18:23:45
|
version 1.101, 2007/10/17 20:37:27
|
|
|
#endif | #endif |
} | } |
| |
Boolean Thread::is_cancelled(void) |
Boolean Thread::is_cancelled() |
{ | { |
return _cancelled; | return _cancelled; |
} | } |
|
|
Threads::sleep(msec); | Threads::sleep(msec); |
} | } |
| |
void Thread::join(void) |
void Thread::join() |
{ | { |
if (!_is_detached && !Threads::null(_handle.thid)) | if (!_is_detached && !Threads::null(_handle.thid)) |
pthread_join(_handle.thid.thread, &_exit_code); | pthread_join(_handle.thid.thread, &_exit_code); |
|
|
Threads::clear(_handle.thid); | Threads::clear(_handle.thid); |
} | } |
| |
void Thread::thread_init(void) |
void Thread::thread_init() |
{ | { |
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) | #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) |
pthread_setintr(PTHREAD_INTR_ENABLE); | pthread_setintr(PTHREAD_INTR_ENABLE); |
|
|
_cancel_enabled = true; | _cancel_enabled = true; |
} | } |
| |
void Thread::detach(void) |
void Thread::detach() |
{ | { |
_is_detached = true; | _is_detached = true; |
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) | #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) |
|
|
return PEGASUS_THREAD_OK; | return PEGASUS_THREAD_OK; |
} | } |
| |
static sigset_t *block_signal_mask(sigset_t * sig) |
Thread::Thread( |
{ |
ThreadReturnType(PEGASUS_THREAD_CDECL* start) (void*), |
sigemptyset(sig); |
void* parameter, |
// should not be used for main() |
Boolean detached) |
sigaddset(sig, SIGHUP); |
: _is_detached(detached), |
sigaddset(sig, SIGINT); |
|
// maybe useless, since KILL can't be blocked according to POSIX |
|
sigaddset(sig, SIGKILL); |
|
|
|
sigaddset(sig, SIGABRT); |
|
sigaddset(sig, SIGALRM); |
|
sigaddset(sig, SIGPIPE); |
|
|
|
|
|
// Note: older versions of the linux pthreads library use SIGUSR1 and SIGUSR2 |
|
// internally to stop and start threads that are blocking, the newer ones |
|
// implement this through the kernel's real time signals |
|
// since SIGSTOP/CONT can handle suspend()/resume() on Linux |
|
// block them |
|
// #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) |
|
// sigaddset(sig, SIGUSR1); |
|
// sigaddset(sig, SIGUSR2); |
|
// #endif |
|
#if defined (PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined (PEGASUS_OS_VMS) |
|
sigprocmask(SIG_BLOCK, sig, NULL); |
|
#else |
|
pthread_sigmask(SIG_BLOCK, sig, NULL); |
|
#endif |
|
return sig; |
|
} |
|
|
|
Thread::Thread(ThreadReturnType(PEGASUS_THREAD_CDECL * start) (void *), void *parameter, Boolean detached):_is_detached(detached), |
|
_cancel_enabled(true), | _cancel_enabled(true), |
_cancelled(false), | _cancelled(false), |
_start(start), _cleanup(), _tsd(), _thread_parm(parameter), _exit_code(0) |
_start(start), |
|
_cleanup(), |
|
_tsd(), |
|
_thread_parm(parameter), |
|
_exit_code(0) |
{ | { |
Threads::clear(_handle.thid); | Threads::clear(_handle.thid); |
} | } |
|
|
| |
#if defined(PEGASUS_HAVE_WINDOWS_THREADS) | #if defined(PEGASUS_HAVE_WINDOWS_THREADS) |
| |
ThreadStatus Thread::run(void) |
ThreadStatus Thread::run() |
{ | { |
// Note: A Win32 thread ID is not the same thing as a pthread ID. | // Note: A Win32 thread ID is not the same thing as a pthread ID. |
// Win32 threads have both a thread ID and a handle. The handle | // Win32 threads have both a thread ID and a handle. The handle |
|
|
return PEGASUS_THREAD_OK; | return PEGASUS_THREAD_OK; |
} | } |
| |
void Thread::cancel(void) |
void Thread::cancel() |
{ | { |
_cancelled = true; | _cancelled = true; |
} | } |
| |
void Thread::test_cancel(void) |
void Thread::test_cancel() |
{ | { |
if (_cancel_enabled && _cancelled) | if (_cancel_enabled && _cancelled) |
{ | { |
|
|
} | } |
} | } |
| |
Boolean Thread::is_cancelled(void) |
Boolean Thread::is_cancelled() |
{ | { |
return _cancelled; | return _cancelled; |
} | } |
| |
void Thread::thread_switch(void) |
void Thread::thread_switch() |
{ | { |
Sleep(0); | Sleep(0); |
} | } |
|
|
Sleep(milliseconds); | Sleep(milliseconds); |
} | } |
| |
void Thread::join(void) |
void Thread::join() |
{ | { |
if (!Threads::null(_handle.thid)) | if (!Threads::null(_handle.thid)) |
{ | { |
|
|
} | } |
} | } |
| |
void Thread::thread_init(void) |
void Thread::thread_init() |
{ | { |
_cancel_enabled = true; | _cancel_enabled = true; |
} | } |
| |
void Thread::detach(void) |
void Thread::detach() |
{ | { |
_is_detached = true; | _is_detached = true; |
} | } |
|
|
} | } |
| |
| |
//thread_data *Thread::put_tsd(const Sint8 *key, void (*delete_func)(void *), Uint32 size, void *value) |
|
|
|
|
|
void Thread::exit_self(ThreadReturnType exit_code) | void Thread::exit_self(ThreadReturnType exit_code) |
{ | { |
#ifndef PEGASUS_PLATFORM_AIX_RS_IBMCXX |
#if !defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) \ |
|
&& !defined(PEGASUS_PLATFORM_PASE_ISERIES_IBMCXX) |
Threads::exit(exit_code); | Threads::exit(exit_code); |
#else | #else |
// execute the cleanup stack and then return | // execute the cleanup stack and then return |
|
|
{ | { |
if (Thread::_key_error) | if (Thread::_key_error) |
{ | { |
Tracer::trace(TRC_THREAD, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_THREAD, Tracer::LEVEL4, |
"Thread: ERROR - thread key error"); | "Thread: ERROR - thread key error"); |
return -1; | return -1; |
} | } |
| |
if (TSDKey::create(&Thread::_platform_thread_key) == 0) | if (TSDKey::create(&Thread::_platform_thread_key) == 0) |
{ | { |
Tracer::trace(TRC_THREAD, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_THREAD, Tracer::LEVEL4, |
"Thread: able to create a thread key"); | "Thread: able to create a thread key"); |
Thread::_key_initialized = true; | Thread::_key_initialized = true; |
} | } |
else | else |
{ | { |
Tracer::trace(TRC_THREAD, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_THREAD, Tracer::LEVEL4, |
"Thread: ERROR - unable to create a thread key"); | "Thread: ERROR - unable to create a thread key"); |
Thread::_key_error = true; | Thread::_key_error = true; |
return -1; | return -1; |
|
|
set_thread_specific(Thread::_platform_thread_key, | set_thread_specific(Thread::_platform_thread_key, |
(void *) thrd) == 0) | (void *) thrd) == 0) |
{ | { |
Tracer::trace(TRC_THREAD, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_THREAD, Tracer::LEVEL4, |
"Successful set Thread * into thread specific storage"); | "Successful set Thread * into thread specific storage"); |
} | } |
else | else |
{ | { |
Tracer::trace(TRC_THREAD, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_THREAD, Tracer::LEVEL4, |
"ERROR: error setting Thread * into thread specific storage"); | "ERROR: error setting Thread * into thread specific storage"); |
} | } |
} | } |
|
|
return acceptLangs; | return acceptLangs; |
} | } |
| |
void Thread::setLanguages(AcceptLanguageList * langs) // l10n |
void Thread::setLanguages(AcceptLanguageList * langs) |
{ | { |
PEG_METHOD_ENTER(TRC_THREAD, "Thread::setLanguages"); | PEG_METHOD_ENTER(TRC_THREAD, "Thread::setLanguages"); |
| |
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
void Thread::clearLanguages() // l10n |
void Thread::clearLanguages() |
{ | { |
PEG_METHOD_ENTER(TRC_THREAD, "Thread::clearLanguages"); | PEG_METHOD_ENTER(TRC_THREAD, "Thread::clearLanguages"); |
| |