/*
- 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
#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 <ardourext/pthread.h>
#else
#include <string>
#include <stdint.h>
-#include <pbd/signals.h>
+#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<void,std::string,pthread_t,std::string,uint32_t> ThreadCreatedWithRequestSize;
+ LIBPBD_API extern void notify_event_loops_about_thread_creation (pthread_t, const std::string&, int requests = 256);
+ LIBPBD_API extern PBD::Signal3<void,pthread_t,std::string,uint32_t> 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__ */