X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fpthread_utils.h;h=a1660eb073d4ef9b6a518e9d6ab6cc2d1f01f4d9;hp=f57833941004c7560486437be75110f96701c6f9;hb=467c801ce80b69abdb7efb4c23120532bed3fc96;hpb=75b933eadbe8f90a73a29bb207ff26eebcd4121a diff --git a/libs/pbd/pbd/pthread_utils.h b/libs/pbd/pbd/pthread_utils.h index f578339410..a1660eb073 100644 --- a/libs/pbd/pbd/pthread_utils.h +++ b/libs/pbd/pbd/pthread_utils.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 Paul Davis + Copyright (C) 2000-2007 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,21 @@ #ifndef __pbd_pthread_utils__ #define __pbd_pthread_utils__ +/* Accommodate thread setting (and testing) for both + * 'libpthread' and 'libpthread_win32' (whose implementations + * of 'pthread_t' are subtlely different) + */ +#ifndef PTHREAD_MACROS_DEFINED +#define PTHREAD_MACROS_DEFINED +#ifdef PTW32_VERSION /* pthread_win32 */ +#define mark_pthread_inactive(threadID) threadID.p=0 +#define is_pthread_active(threadID) threadID.p!=0 +#else /* normal pthread */ +#define mark_pthread_inactive(threadID) threadID=0 +#define is_pthread_active(threadID) threadID!=0 +#endif /* PTW32_VERSION */ +#endif /* PTHREAD_MACROS_DEFINED */ + #ifdef COMPILER_MSVC #include #else @@ -29,18 +44,40 @@ #include #include -#include +#include "pbd/libpbd_visibility.h" +#include "pbd/signals.h" + +LIBPBD_API int pthread_create_and_store (std::string name, pthread_t *thread, void * (*start_routine)(void *), void * arg); +LIBPBD_API void pthread_cancel_one (pthread_t thread); +LIBPBD_API void pthread_cancel_all (); +LIBPBD_API void pthread_kill_all (int signum); +LIBPBD_API const char* pthread_name (); +LIBPBD_API void pthread_set_name (const char* name); + +LIBPBD_API int pbd_realtime_pthread_create ( + const int policy, int priority, const size_t stacksize, + pthread_t *thread, + void *(*start_routine) (void *), + void *arg); -int pthread_create_and_store (std::string name, pthread_t *thread, void * (*start_routine)(void *), void * arg); -void pthread_cancel_one (pthread_t thread); -void pthread_cancel_all (); -void pthread_kill_all (int signum); -const char* pthread_name (); -void pthread_set_name (const char* name); +LIBPBD_API int pbd_set_thread_priority (pthread_t, const int policy, int priority); namespace PBD { - extern void notify_gui_about_thread_creation (std::string, pthread_t, std::string, int requests = 256); - extern PBD::Signal4 ThreadCreatedWithRequestSize; + LIBPBD_API extern void notify_event_loops_about_thread_creation (pthread_t, const std::string&, int requests = 256); + LIBPBD_API extern PBD::Signal3 ThreadCreatedWithRequestSize; } +/* pthread-w32 does not support realtime scheduling + * (well, windows, doesn't..) and only supports SetThreadPriority() + * + * pthread_setschedparam() returns ENOTSUP if the policy is not SCHED_OTHER. + * + * however, pthread_create() with attributes, ignores the policy and + * only sets the priority (when PTHREAD_EXPLICIT_SCHED is used). + */ +#ifdef PLATFORM_WINDOWS +#define PBD_SCHED_FIFO SCHED_OTHER +#else +#define PBD_SCHED_FIFO SCHED_FIFO +#endif #endif /* __pbd_pthread_utils__ */