git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4146 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.7
@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
@@ -116,17 +116,17 @@ int JackDebugClient::Close() | |||||
void JackDebugClient::CheckClient(const char* function_name) const | void JackDebugClient::CheckClient(const char* function_name) const | ||||
{ | { | ||||
*fStream << "CheckClient : " << function_name << ", calling thread : " << pthread_self() << endl; | *fStream << "CheckClient : " << function_name << ", calling thread : " << pthread_self() << endl; | ||||
if (fIsClosed > 0) { | if (fIsClosed > 0) { | ||||
*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed " << "from " << function_name << endl; | |||||
*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed " << "from " << function_name << endl; | |||||
*fStream << "This is likely to cause crash !'" << endl; | *fStream << "This is likely to cause crash !'" << endl; | ||||
#ifdef __APPLE__ | #ifdef __APPLE__ | ||||
// Debugger(); | // Debugger(); | ||||
#endif | |||||
#endif | |||||
} | } | ||||
} | } | ||||
pthread_t JackDebugClient::GetThreadID() | |||||
jack_native_thread_t JackDebugClient::GetThreadID() | |||||
{ | { | ||||
CheckClient("GetThreadID"); | CheckClient("GetThreadID"); | ||||
return fClient->GetThreadID(); | return fClient->GetThreadID(); | ||||
@@ -428,7 +428,7 @@ void JackDebugClient::OnInfoShutdown(JackInfoShutdownCallback callback, void *ar | |||||
CheckClient("OnInfoShutdown"); | CheckClient("OnInfoShutdown"); | ||||
fClient->OnInfoShutdown(callback, arg); | fClient->OnInfoShutdown(callback, arg); | ||||
} | } | ||||
int JackDebugClient::TimeCallback(jack_nframes_t nframes, void *arg) | int JackDebugClient::TimeCallback(jack_nframes_t nframes, void *arg) | ||||
{ | { | ||||
JackDebugClient* client = (JackDebugClient*)arg; | JackDebugClient* client = (JackDebugClient*)arg; | ||||
@@ -7,12 +7,12 @@ | |||||
it under the terms of the GNU Lesser General Public License as published by | it under the terms of the GNU Lesser General Public License as published by | ||||
the Free Software Foundation; either version 2.1 of the License, or | the Free Software Foundation; either version 2.1 of the License, or | ||||
(at your option) any later version. | (at your option) any later version. | ||||
This program is distributed in the hope that it will be useful, | This program is distributed in the hope that it will be useful, | ||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | along with this program; if not, write to the Free Software | ||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
@@ -25,7 +25,6 @@ | |||||
#include <string.h> | #include <string.h> | ||||
#include <errno.h> | #include <errno.h> | ||||
#include "JackCompilerDeps.h" | #include "JackCompilerDeps.h" | ||||
#include "types.h" | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" | extern "C" | ||||
@@ -44,17 +43,17 @@ extern "C" | |||||
EXPORT extern void (*jack_error_callback)(const char *desc); | EXPORT extern void (*jack_error_callback)(const char *desc); | ||||
EXPORT extern void (*jack_info_callback)(const char *desc); | EXPORT extern void (*jack_info_callback)(const char *desc); | ||||
EXPORT extern void default_jack_error_callback(const char *desc); | EXPORT extern void default_jack_error_callback(const char *desc); | ||||
EXPORT extern void default_jack_info_callback(const char *desc); | EXPORT extern void default_jack_info_callback(const char *desc); | ||||
EXPORT extern void silent_jack_error_callback(const char *desc); | EXPORT extern void silent_jack_error_callback(const char *desc); | ||||
EXPORT extern void silent_jack_info_callback(const char *desc); | EXPORT extern void silent_jack_info_callback(const char *desc); | ||||
typedef void (* jack_log_function_t)(int level, const char *message); | typedef void (* jack_log_function_t)(int level, const char *message); | ||||
void jack_log_function(int level, const char *message); | void jack_log_function(int level, const char *message); | ||||
EXPORT int set_threaded_log_function(); | EXPORT int set_threaded_log_function(); | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -21,7 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#ifndef __JackTime__ | #ifndef __JackTime__ | ||||
#define __JackTime__ | #define __JackTime__ | ||||
#include "types.h" | |||||
#include "JackCompilerDeps.h" | #include "JackCompilerDeps.h" | ||||
#include "JackTypes.h" | #include "JackTypes.h" | ||||
@@ -34,6 +34,12 @@ typedef signed long SInt32; | |||||
#include "JackTypes_os.h" | #include "JackTypes_os.h" | ||||
/** | |||||
* Type used to represent the value of free running | |||||
* monotonic clock with units of microseconds. | |||||
*/ | |||||
typedef uint64_t jack_time_t; | |||||
typedef uint16_t jack_int_t; // Internal type for ports and refnum | typedef uint16_t jack_int_t; // Internal type for ports and refnum | ||||
typedef enum { | typedef enum { | ||||
@@ -522,6 +522,64 @@ int jack_set_xrun_callback (jack_client_t *, | |||||
/*@}*/ | /*@}*/ | ||||
/** | |||||
* Tell the Jack server to call @a latency_callback whenever it | |||||
* is necessary to recompute the latencies for some or all | |||||
* Jack ports. | |||||
* | |||||
* @a latency_callback will be called twice each time it is | |||||
* needed, once being passed JackCaptureLatency and once | |||||
* JackPlaybackLatency. See @ref LatencyFunctions for | |||||
* the definition of each type of latency and related functions. | |||||
* | |||||
* <b>IMPORTANT: Most JACK clients do NOT need to register a latency | |||||
* callback.</b> | |||||
* | |||||
* Clients that meet any of the following conditions do NOT | |||||
* need to register a latency callback: | |||||
* | |||||
* - have only input ports | |||||
* - have only output ports | |||||
* - their output is totally unrelated to their input | |||||
* - their output is not delayed relative to their input | |||||
* (i.e. data that arrives in a given process() | |||||
* callback is processed and output again in the | |||||
* same callback) | |||||
* | |||||
* Clients NOT registering a latency callback MUST also | |||||
* satisfy this condition: | |||||
* | |||||
* - have no multiple distinct internal signal pathways | |||||
* | |||||
* This means that if your client has more than 1 input and | |||||
* output port, and considers them always "correlated" | |||||
* (e.g. as a stereo pair), then there is only 1 (e.g. stereo) | |||||
* signal pathway through the client. This would be true, | |||||
* for example, of a stereo FX rack client that has a | |||||
* left/right input pair and a left/right output pair. | |||||
* | |||||
* However, this is somewhat a matter of perspective. The | |||||
* same FX rack client could be connected so that its | |||||
* two input ports were connected to entirely separate | |||||
* sources. Under these conditions, the fact that the client | |||||
* does not register a latency callback MAY result | |||||
* in port latency values being incorrect. | |||||
* | |||||
* Clients that do not meet any of those conditions SHOULD | |||||
* register a latency callback. | |||||
* | |||||
* See the documentation for @ref jack_port_set_latency_range() | |||||
* on how the callback should operate. Remember that the @a mode | |||||
* argument given to the latency callback will need to be | |||||
* passed into @ref jack_port_set_latency_range() | |||||
* | |||||
* @return 0 on success, otherwise a non-zero error code | |||||
*/ | |||||
int jack_set_latency_callback (jack_client_t *, | |||||
JackLatencyCallback latency_callback, | |||||
void *) JACK_WEAK_EXPORT; | |||||
/*@}*/ | |||||
/** | /** | ||||
* @defgroup ServerClientControl Controlling & querying JACK server operation | * @defgroup ServerClientControl Controlling & querying JACK server operation | ||||
* @{ | * @{ | ||||
@@ -784,66 +842,6 @@ int jack_port_tie (jack_port_t *src, jack_port_t *dst) JACK_OPTIONAL_WEAK_DEPREC | |||||
*/ | */ | ||||
int jack_port_untie (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | int jack_port_untie (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | ||||
/** | |||||
* @return the time (in frames) between data being available or | |||||
* delivered at/to a port, and the time at which it arrived at or is | |||||
* delivered to the "other side" of the port. E.g. for a physical | |||||
* audio output port, this is the time between writing to the port and | |||||
* when the signal will leave the connector. For a physical audio | |||||
* input port, this is the time between the sound arriving at the | |||||
* connector and the corresponding frames being readable from the | |||||
* port. | |||||
*/ | |||||
jack_nframes_t jack_port_get_latency (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | |||||
* The maximum of the sum of the latencies in every | |||||
* connection path that can be drawn between the port and other | |||||
* ports with the @ref JackPortIsTerminal flag set. | |||||
*/ | |||||
jack_nframes_t jack_port_get_total_latency (jack_client_t *, | |||||
jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | |||||
* The port latency is zero by default. Clients that control | |||||
* physical hardware with non-zero latency should call this | |||||
* to set the latency to its correct value. Note that the value | |||||
* should include any systemic latency present "outside" the | |||||
* physical hardware controlled by the client. For example, | |||||
* for a client controlling a digital audio interface connected | |||||
* to an external digital converter, the latency setting should | |||||
* include both buffering by the audio interface *and* the converter. | |||||
*/ | |||||
void jack_port_set_latency (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | |||||
* Request a complete recomputation of a port's total latency. This | |||||
* can be called by a client that has just changed the internal | |||||
* latency of its port using @function jack_port_set_latency | |||||
* and wants to ensure that all signal pathways in the graph | |||||
* are updated with respect to the values that will be returned | |||||
* by @function jack_port_get_total_latency. | |||||
* | |||||
* @return zero for successful execution of the request. non-zero | |||||
* otherwise. | |||||
*/ | |||||
int jack_recompute_total_latency (jack_client_t*, jack_port_t* port) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | |||||
* Request a complete recomputation of all port latencies. This | |||||
* can be called by a client that has just changed the internal | |||||
* latency of its port using @function jack_port_set_latency | |||||
* and wants to ensure that all signal pathways in the graph | |||||
* are updated with respect to the values that will be returned | |||||
* by @function jack_port_get_total_latency. It allows a client | |||||
* to change multiple port latencies without triggering a | |||||
* recompute for each change. | |||||
* | |||||
* @return zero for successful execution of the request. non-zero | |||||
* otherwise. | |||||
*/ | |||||
int jack_recompute_total_latencies (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | /** | ||||
* Modify a port's short name. May be called at any time. If the | * Modify a port's short name. May be called at any time. If the | ||||
* resulting full name (including the @a "client_name:" prefix) is | * resulting full name (including the @a "client_name:" prefix) is | ||||
@@ -981,6 +979,224 @@ int jack_port_name_size(void) JACK_OPTIONAL_WEAK_EXPORT; | |||||
*/ | */ | ||||
int jack_port_type_size(void) JACK_OPTIONAL_WEAK_EXPORT; | int jack_port_type_size(void) JACK_OPTIONAL_WEAK_EXPORT; | ||||
/** | |||||
* @return the buffersize of a port of type @arg port_type. | |||||
* | |||||
* this function may only be called in a buffer_size callback. | |||||
*/ | |||||
size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_type) JACK_WEAK_EXPORT; | |||||
/*@}*/ | |||||
/** | |||||
* @defgroup LatencyFunctions Managing and determining latency | |||||
* | |||||
* The purpose of JACK's latency API is to allow clients to | |||||
* easily answer two questions: | |||||
* | |||||
* - How long has it been since the data read from a port arrived | |||||
* at the edge of the JACK graph (either via a physical port | |||||
* or being synthesized from scratch)? | |||||
* | |||||
* - How long will it be before the data written to a port arrives | |||||
* at the edge of a JACK graph? | |||||
* To help answering these two questions, all JACK ports have two | |||||
* latency values associated with them, both measured in frames: | |||||
* | |||||
* <b>capture latency</b>: how long since the data read from | |||||
* the buffer of a port arrived at at | |||||
* a port marked with JackPortIsTerminal. | |||||
* The data will have come from the "outside | |||||
* world" if the terminal port is also | |||||
* marked with JackPortIsPhysical, or | |||||
* will have been synthesized by the client | |||||
* that owns the terminal port. | |||||
* | |||||
* <b>playback latency</b>: how long until the data | |||||
* written to the buffer of port will reach a port | |||||
* marked with JackPortIsTerminal. | |||||
* | |||||
* Both latencies might potentially have more than one value | |||||
* because there may be multiple pathways to/from a given port | |||||
* and a terminal port. Latency is therefore generally | |||||
* expressed a min/max pair. | |||||
* | |||||
* In most common setups, the minimum and maximum latency | |||||
* are the same, but this design accomodates more complex | |||||
* routing, and allows applications (and thus users) to | |||||
* detect cases where routing is creating an anomalous | |||||
* situation that may either need fixing or more | |||||
* sophisticated handling by clients that care about | |||||
* latency. | |||||
* | |||||
* See also @ref jack_set_latency_callback for details on how | |||||
* clients that add latency to the signal path should interact | |||||
* with JACK to ensure that the correct latency figures are | |||||
* used. | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* The port latency is zero by default. Clients that control | |||||
* physical hardware with non-zero latency should call this | |||||
* to set the latency to its correct value. Note that the value | |||||
* should include any systemic latency present "outside" the | |||||
* physical hardware controlled by the client. For example, | |||||
* for a client controlling a digital audio interface connected | |||||
* to an external digital converter, the latency setting should | |||||
* include both buffering by the audio interface *and* the converter. | |||||
* | |||||
* @deprecated This method will be removed in the next major | |||||
* release of JACK. It should not be used in new code, and should | |||||
* be replaced by a latency callback that calls @ref | |||||
* jack_port_set_latency_range(). | |||||
*/ | |||||
void jack_port_set_latency (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | |||||
/** | |||||
* return the latency range defined by @a mode for | |||||
* @a port, in frames. | |||||
* | |||||
* See @ref LatencyFunctions for the definition of each latency value. | |||||
* | |||||
* This is normally used in the LatencyCallback. | |||||
* and therefor safe to execute from callbacks. | |||||
*/ | |||||
void jack_port_get_latency_range (jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) JACK_WEAK_EXPORT; | |||||
/** | |||||
* set the minimum and maximum latencies defined by | |||||
* @a mode for @a port, in frames. | |||||
* | |||||
* See @ref LatencyFunctions for the definition of each latency value. | |||||
* | |||||
* This function should ONLY be used inside a latency | |||||
* callback. The client should determine the current | |||||
* value of the latency using @ref jack_port_get_latency_range() | |||||
* (called using the same mode as @a mode) | |||||
* and then add some number of frames to that reflects | |||||
* latency added by the client. | |||||
* | |||||
* How much latency a client adds will vary | |||||
* dramatically. For most clients, the answer is zero | |||||
* and there is no reason for them to register a latency | |||||
* callback and thus they should never call this | |||||
* function. | |||||
* | |||||
* More complex clients that take an input signal, | |||||
* transform it in some way and output the result but | |||||
* not during the same process() callback will | |||||
* generally know a single constant value to add | |||||
* to the value returned by @ref jack_port_get_latency_range(). | |||||
* | |||||
* Such clients would register a latency callback (see | |||||
* @ref jack_set_latency_callback) and must know what input | |||||
* ports feed which output ports as part of their | |||||
* internal state. Their latency callback will update | |||||
* the ports' latency values appropriately. | |||||
* | |||||
* A pseudo-code example will help. The @a mode argument to the latency | |||||
* callback will determine whether playback or capture | |||||
* latency is being set. The callback will use | |||||
* @ref jack_port_set_latency_range() as follows: | |||||
* | |||||
* \code | |||||
* jack_latency_range_t range; | |||||
* if (mode == JackPlaybackLatency) { | |||||
* foreach input_port in (all self-registered port) { | |||||
* jack_port_get_latency_range (port_feeding_input_port, JackPlaybackLatency, &range); | |||||
* range.min += min_delay_added_as_signal_flows_from port_feeding to input_port; | |||||
* range.max += max_delay_added_as_signal_flows_from port_feeding to input_port; | |||||
* jack_port_set_latency_range (input_port, JackPlaybackLatency, &range); | |||||
* } | |||||
* } else if (mode == JackCaptureLatency) { | |||||
* foreach output_port in (all self-registered port) { | |||||
* jack_port_get_latency_range (port_fed_by_output_port, JackCaptureLatency, &range); | |||||
* range.min += min_delay_added_as_signal_flows_from_output_port_to_fed_by_port; | |||||
* range.max += max_delay_added_as_signal_flows_from_output_port_to_fed_by_port; | |||||
* jack_port_set_latency_range (output_port, JackCaptureLatency, &range); | |||||
* } | |||||
* } | |||||
* \endcode | |||||
* | |||||
* In this relatively simple pseudo-code example, it is assumed that | |||||
* each input port or output is connected to only 1 output or input | |||||
* port respectively. | |||||
* | |||||
* If a port is connected to more than 1 other port, then the | |||||
* range.min and range.max values passed to @ref | |||||
* jack_port_set_latency_range() should reflect the minimum and | |||||
* maximum values across all connected ports. | |||||
* | |||||
* See the description of @ref jack_set_latency_callback for more | |||||
* information. | |||||
*/ | |||||
void jack_port_set_latency_range (jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) JACK_WEAK_EXPORT; | |||||
/** | |||||
* Request a complete recomputation of all port latencies. This | |||||
* can be called by a client that has just changed the internal | |||||
* latency of its port using jack_port_set_latency | |||||
* and wants to ensure that all signal pathways in the graph | |||||
* are updated with respect to the values that will be returned | |||||
* by jack_port_get_total_latency. It allows a client | |||||
* to change multiple port latencies without triggering a | |||||
* recompute for each change. | |||||
* | |||||
* @return zero for successful execution of the request. non-zero | |||||
* otherwise. | |||||
*/ | |||||
int jack_recompute_total_latencies (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT; | |||||
/** | |||||
* @return the time (in frames) between data being available or | |||||
* delivered at/to a port, and the time at which it arrived at or is | |||||
* delivered to the "other side" of the port. E.g. for a physical | |||||
* audio output port, this is the time between writing to the port and | |||||
* when the signal will leave the connector. For a physical audio | |||||
* input port, this is the time between the sound arriving at the | |||||
* connector and the corresponding frames being readable from the | |||||
* port. | |||||
* | |||||
* @deprecated This method will be removed in the next major | |||||
* release of JACK. It should not be used in new code, and should | |||||
* be replaced by jack_port_get_latency_range() in any existing | |||||
* use cases. | |||||
*/ | |||||
jack_nframes_t jack_port_get_latency (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | |||||
/** | |||||
* The maximum of the sum of the latencies in every | |||||
* connection path that can be drawn between the port and other | |||||
* ports with the @ref JackPortIsTerminal flag set. | |||||
* | |||||
* @deprecated This method will be removed in the next major | |||||
* release of JACK. It should not be used in new code, and should | |||||
* be replaced by jack_port_get_latency_range() in any existing | |||||
* use cases. | |||||
*/ | |||||
jack_nframes_t jack_port_get_total_latency (jack_client_t *, | |||||
jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | |||||
/** | |||||
* Request a complete recomputation of a port's total latency. This | |||||
* can be called by a client that has just changed the internal | |||||
* latency of its port using jack_port_set_latency | |||||
* and wants to ensure that all signal pathways in the graph | |||||
* are updated with respect to the values that will be returned | |||||
* by jack_port_get_total_latency. | |||||
* | |||||
* @return zero for successful execution of the request. non-zero | |||||
* otherwise. | |||||
* | |||||
* @deprecated This method will be removed in the next major | |||||
* release of JACK. It should not be used in new code, and should | |||||
* be replaced by jack_recompute_total_latencies() in any existing | |||||
* use cases. | |||||
*/ | |||||
int jack_recompute_total_latency (jack_client_t*, jack_port_t* port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; | |||||
/*@}*/ | /*@}*/ | ||||
/** | /** | ||||
@@ -1,24 +1,25 @@ | |||||
/* | /* | ||||
Copyright (C) 2002-2003 Paul Davis | Copyright (C) 2002-2003 Paul Davis | ||||
This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||
it under the terms of the GNU Lesser General Public License as published by | it under the terms of the GNU Lesser General Public License as published by | ||||
the Free Software Foundation; either version 2.1 of the License, or | the Free Software Foundation; either version 2.1 of the License, or | ||||
(at your option) any later version. | (at your option) any later version. | ||||
This program is distributed in the hope that it will be useful, | This program is distributed in the hope that it will be useful, | ||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <inttypes.h> | |||||
#include "timestamps.h" | #include "timestamps.h" | ||||
#include "JackTime.h" | #include "JackTime.h" | ||||
@@ -60,7 +61,7 @@ jack_dump_timestamps (FILE *out) | |||||
unsigned long i; | unsigned long i; | ||||
for (i = 0; i < timestamp_index; ++i) { | for (i = 0; i < timestamp_index; ++i) { | ||||
fprintf (out, "%-.32s %" PRIu64 " %" PRIu64, | |||||
fprintf (out, "%-.32s %" PRIu64 " %" PRIu64, | |||||
timestamps[i].what, timestamps[i].when, | timestamps[i].what, timestamps[i].when, | ||||
timestamps[i].when - timestamps[0].when); | timestamps[i].when - timestamps[0].when); | ||||
if (i > 0) { | if (i > 0) { | ||||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
@@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
int JackMachThread::SetThreadToPriority(pthread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
int JackMachThread::SetThreadToPriority(jack_native_thread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
{ | { | ||||
if (inPriority == 96) { | if (inPriority == 96) { | ||||
// REAL-TIME / TIME-CONSTRAINT THREAD | // REAL-TIME / TIME-CONSTRAINT THREAD | ||||
@@ -64,18 +64,18 @@ int JackMachThread::SetThreadToPriority(pthread_t thread, UInt32 inPriority, Boo | |||||
} | } | ||||
// returns the thread's priority as it was last set by the API | // returns the thread's priority as it was last set by the API | ||||
UInt32 JackMachThread::GetThreadSetPriority(pthread_t thread) | |||||
UInt32 JackMachThread::GetThreadSetPriority(jack_native_thread_t thread) | |||||
{ | { | ||||
return GetThreadPriority(thread, THREAD_SET_PRIORITY); | return GetThreadPriority(thread, THREAD_SET_PRIORITY); | ||||
} | } | ||||
// returns the thread's priority as it was last scheduled by the Kernel | // returns the thread's priority as it was last scheduled by the Kernel | ||||
UInt32 JackMachThread::GetThreadScheduledPriority(pthread_t thread) | |||||
UInt32 JackMachThread::GetThreadScheduledPriority(jack_native_thread_t thread) | |||||
{ | { | ||||
return GetThreadPriority(thread, THREAD_SCHEDULED_PRIORITY); | return GetThreadPriority(thread, THREAD_SCHEDULED_PRIORITY); | ||||
} | } | ||||
UInt32 JackMachThread::GetThreadPriority(pthread_t thread, int inWhichPriority) | |||||
UInt32 JackMachThread::GetThreadPriority(jack_native_thread_t thread, int inWhichPriority) | |||||
{ | { | ||||
thread_basic_info_data_t threadInfo; | thread_basic_info_data_t threadInfo; | ||||
policy_info_data_t thePolicyInfo; | policy_info_data_t thePolicyInfo; | ||||
@@ -118,7 +118,7 @@ UInt32 JackMachThread::GetThreadPriority(pthread_t thread, int inWhichPriority) | |||||
return 0; | return 0; | ||||
} | } | ||||
int JackMachThread::GetParams(pthread_t thread, UInt64* period, UInt64* computation, UInt64* constraint) | |||||
int JackMachThread::GetParams(jack_native_thread_t thread, UInt64* period, UInt64* computation, UInt64* constraint) | |||||
{ | { | ||||
thread_time_constraint_policy_data_t theTCPolicy; | thread_time_constraint_policy_data_t theTCPolicy; | ||||
mach_msg_type_number_t count = THREAD_TIME_CONSTRAINT_POLICY_COUNT; | mach_msg_type_number_t count = THREAD_TIME_CONSTRAINT_POLICY_COUNT; | ||||
@@ -144,11 +144,11 @@ int JackMachThread::Kill() | |||||
{ | { | ||||
// pthread_cancel still not yet implemented in Darwin (TO CHECK ON TIGER) | // pthread_cancel still not yet implemented in Darwin (TO CHECK ON TIGER) | ||||
jack_log("JackMachThread::Kill"); | jack_log("JackMachThread::Kill"); | ||||
if (fThread != (pthread_t)NULL) { // If thread has been started | |||||
if (fThread != (jack_native_thread_t)NULL) { // If thread has been started | |||||
mach_port_t machThread = pthread_mach_thread_np(fThread); | mach_port_t machThread = pthread_mach_thread_np(fThread); | ||||
int res = (thread_terminate(machThread) == KERN_SUCCESS) ? 0 : -1; | int res = (thread_terminate(machThread) == KERN_SUCCESS) ? 0 : -1; | ||||
fThread = (pthread_t)NULL; | |||||
fThread = (jack_native_thread_t)NULL; | |||||
return res; | return res; | ||||
} else { | } else { | ||||
return -1; | return -1; | ||||
@@ -159,7 +159,7 @@ int JackMachThread::AcquireRealTime() | |||||
{ | { | ||||
jack_log("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld", | jack_log("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld", | ||||
long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | ||||
return (fThread != (pthread_t)NULL) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; | |||||
return (fThread != (jack_native_thread_t)NULL) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; | |||||
} | } | ||||
int JackMachThread::AcquireSelfRealTime() | int JackMachThread::AcquireSelfRealTime() | ||||
@@ -181,7 +181,7 @@ int JackMachThread::AcquireSelfRealTime(int priority) | |||||
return AcquireSelfRealTime(); | return AcquireSelfRealTime(); | ||||
} | } | ||||
int JackMachThread::AcquireRealTimeImp(pthread_t thread, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
int JackMachThread::AcquireRealTimeImp(jack_native_thread_t thread, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
{ | { | ||||
SetThreadToPriority(thread, 96, true, period, computation, constraint); | SetThreadToPriority(thread, 96, true, period, computation, constraint); | ||||
return 0; | return 0; | ||||
@@ -189,7 +189,7 @@ int JackMachThread::AcquireRealTimeImp(pthread_t thread, UInt64 period, UInt64 c | |||||
int JackMachThread::DropRealTime() | int JackMachThread::DropRealTime() | ||||
{ | { | ||||
return (fThread != (pthread_t)NULL) ? DropRealTimeImp(fThread) : -1; | |||||
return (fThread != (jack_native_thread_t)NULL) ? DropRealTimeImp(fThread) : -1; | |||||
} | } | ||||
int JackMachThread::DropSelfRealTime() | int JackMachThread::DropSelfRealTime() | ||||
@@ -197,7 +197,7 @@ int JackMachThread::DropSelfRealTime() | |||||
return DropRealTimeImp(pthread_self()); | return DropRealTimeImp(pthread_self()); | ||||
} | } | ||||
int JackMachThread::DropRealTimeImp(pthread_t thread) | |||||
int JackMachThread::DropRealTimeImp(jack_native_thread_t thread) | |||||
{ | { | ||||
SetThreadToPriority(thread, 63, false, 0, 0, 0); | SetThreadToPriority(thread, 63, false, 0, 0, 0); | ||||
return 0; | return 0; | ||||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
@@ -87,9 +87,9 @@ class SERVER_EXPORT JackMachThread : public JackPosixThread | |||||
UInt64 fComputation; | UInt64 fComputation; | ||||
UInt64 fConstraint; | UInt64 fConstraint; | ||||
static UInt32 GetThreadSetPriority(pthread_t thread); | |||||
static UInt32 GetThreadScheduledPriority(pthread_t thread); | |||||
static UInt32 GetThreadPriority(pthread_t thread, int inWhichPriority); | |||||
static UInt32 GetThreadSetPriority(jack_native_thread_t thread); | |||||
static UInt32 GetThreadScheduledPriority(jack_native_thread_t thread); | |||||
static UInt32 GetThreadPriority(jack_native_thread_t thread, int inWhichPriority); | |||||
public: | public: | ||||
@@ -105,23 +105,23 @@ class SERVER_EXPORT JackMachThread : public JackPosixThread | |||||
int AcquireRealTime(); // Used when called from another thread | int AcquireRealTime(); // Used when called from another thread | ||||
int AcquireSelfRealTime(); // Used when called from thread itself | int AcquireSelfRealTime(); // Used when called from thread itself | ||||
int AcquireRealTime(int priority); // Used when called from another thread | int AcquireRealTime(int priority); // Used when called from another thread | ||||
int AcquireSelfRealTime(int priority); // Used when called from thread itself | int AcquireSelfRealTime(int priority); // Used when called from thread itself | ||||
int DropRealTime(); // Used when called from another thread | int DropRealTime(); // Used when called from another thread | ||||
int DropSelfRealTime(); // Used when called from thread itself | int DropSelfRealTime(); // Used when called from thread itself | ||||
void SetParams(UInt64 period, UInt64 computation, UInt64 constraint); | void SetParams(UInt64 period, UInt64 computation, UInt64 constraint); | ||||
static int GetParams(pthread_t thread, UInt64* period, UInt64* computation, UInt64* constraint); | |||||
static int SetThreadToPriority(pthread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint); | |||||
static int GetParams(jack_native_thread_t thread, UInt64* period, UInt64* computation, UInt64* constraint); | |||||
static int SetThreadToPriority(jack_native_thread_t thread, UInt32 inPriority, Boolean inIsFixed, UInt64 period, UInt64 computation, UInt64 constraint); | |||||
static int AcquireRealTimeImp(pthread_t thread, UInt64 period, UInt64 computation, UInt64 constraint); | |||||
static int AcquireRealTimeImp(pthread_t thread, int priority, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
{ | |||||
return JackMachThread::AcquireRealTimeImp(thread, period, computation, constraint); | |||||
static int AcquireRealTimeImp(jack_native_thread_t thread, UInt64 period, UInt64 computation, UInt64 constraint); | |||||
static int AcquireRealTimeImp(jack_native_thread_t thread, int priority, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
{ | |||||
return JackMachThread::AcquireRealTimeImp(thread, period, computation, constraint); | |||||
} | } | ||||
static int DropRealTimeImp(pthread_t thread); | |||||
static int DropRealTimeImp(jack_native_thread_t thread); | |||||
}; | }; | ||||
} // end of namespace | } // end of namespace | ||||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
@@ -40,19 +40,19 @@ void* JackPosixThread::ThreadHandler(void* arg) | |||||
if ((err = pthread_setcanceltype(obj->fCancellation, NULL)) != 0) { | if ((err = pthread_setcanceltype(obj->fCancellation, NULL)) != 0) { | ||||
jack_error("pthread_setcanceltype err = %s", strerror(err)); | jack_error("pthread_setcanceltype err = %s", strerror(err)); | ||||
} | } | ||||
// Signal creation thread when started with StartSync | // Signal creation thread when started with StartSync | ||||
jack_log("ThreadHandler: start"); | jack_log("ThreadHandler: start"); | ||||
obj->fStatus = kIniting; | obj->fStatus = kIniting; | ||||
// Call Init method | // Call Init method | ||||
if (!runnable->Init()) { | if (!runnable->Init()) { | ||||
jack_error("Thread init fails: thread quits"); | jack_error("Thread init fails: thread quits"); | ||||
return 0; | return 0; | ||||
} | } | ||||
obj->fStatus = kRunning; | obj->fStatus = kRunning; | ||||
// If Init succeed, start the thread loop | // If Init succeed, start the thread loop | ||||
bool res = true; | bool res = true; | ||||
while (obj->fStatus == kRunning && res) { | while (obj->fStatus == kRunning && res) { | ||||
@@ -76,11 +76,11 @@ int JackPosixThread::Start() | |||||
return 0; | return 0; | ||||
} | } | ||||
} | } | ||||
int JackPosixThread::StartSync() | int JackPosixThread::StartSync() | ||||
{ | { | ||||
fStatus = kStarting; | fStatus = kStarting; | ||||
if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | ||||
fStatus = kIdle; | fStatus = kIdle; | ||||
return -1; | return -1; | ||||
@@ -90,10 +90,10 @@ int JackPosixThread::StartSync() | |||||
JackSleep(1000); | JackSleep(1000); | ||||
} | } | ||||
return (count == 1000) ? -1 : 0; | return (count == 1000) ? -1 : 0; | ||||
} | |||||
} | |||||
} | } | ||||
int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) | |||||
int JackPosixThread::StartImp(jack_native_thread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) | |||||
{ | { | ||||
pthread_attr_t attributes; | pthread_attr_t attributes; | ||||
struct sched_param rt_param; | struct sched_param rt_param; | ||||
@@ -111,19 +111,19 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi | |||||
} | } | ||||
if (realtime) { | if (realtime) { | ||||
jack_log("Create RT thread"); | jack_log("Create RT thread"); | ||||
if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { | if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { | ||||
jack_error("Cannot request explicit scheduling for RT thread res = %d", res); | jack_error("Cannot request explicit scheduling for RT thread res = %d", res); | ||||
return -1; | return -1; | ||||
} | } | ||||
if ((res = pthread_attr_setschedpolicy(&attributes, JACK_SCHED_POLICY))) { | if ((res = pthread_attr_setschedpolicy(&attributes, JACK_SCHED_POLICY))) { | ||||
jack_error("Cannot set RR scheduling class for RT thread res = %d", res); | jack_error("Cannot set RR scheduling class for RT thread res = %d", res); | ||||
return -1; | return -1; | ||||
} | } | ||||
memset(&rt_param, 0, sizeof(rt_param)); | memset(&rt_param, 0, sizeof(rt_param)); | ||||
rt_param.sched_priority = priority; | rt_param.sched_priority = priority; | ||||
@@ -152,13 +152,13 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi | |||||
int JackPosixThread::Kill() | int JackPosixThread::Kill() | ||||
{ | { | ||||
if (fThread != (pthread_t)NULL) { // If thread has been started | |||||
if (fThread != (jack_native_thread_t)NULL) { // If thread has been started | |||||
jack_log("JackPosixThread::Kill"); | jack_log("JackPosixThread::Kill"); | ||||
void* status; | void* status; | ||||
pthread_cancel(fThread); | pthread_cancel(fThread); | ||||
pthread_join(fThread, &status); | pthread_join(fThread, &status); | ||||
fStatus = kIdle; | fStatus = kIdle; | ||||
fThread = (pthread_t)NULL; | |||||
fThread = (jack_native_thread_t)NULL; | |||||
return 0; | return 0; | ||||
} else { | } else { | ||||
return -1; | return -1; | ||||
@@ -167,21 +167,21 @@ int JackPosixThread::Kill() | |||||
int JackPosixThread::Stop() | int JackPosixThread::Stop() | ||||
{ | { | ||||
if (fThread != (pthread_t)NULL) { // If thread has been started | |||||
if (fThread != (jack_native_thread_t)NULL) { // If thread has been started | |||||
jack_log("JackPosixThread::Stop"); | jack_log("JackPosixThread::Stop"); | ||||
void* status; | void* status; | ||||
fStatus = kIdle; // Request for the thread to stop | fStatus = kIdle; // Request for the thread to stop | ||||
pthread_join(fThread, &status); | pthread_join(fThread, &status); | ||||
fThread = (pthread_t)NULL; | |||||
fThread = (jack_native_thread_t)NULL; | |||||
return 0; | return 0; | ||||
} else { | } else { | ||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
int JackPosixThread::KillImp(pthread_t thread) | |||||
int JackPosixThread::KillImp(jack_native_thread_t thread) | |||||
{ | { | ||||
if (thread != (pthread_t)NULL) { // If thread has been started | |||||
if (thread != (jack_native_thread_t)NULL) { // If thread has been started | |||||
jack_log("JackPosixThread::Kill"); | jack_log("JackPosixThread::Kill"); | ||||
void* status; | void* status; | ||||
pthread_cancel(thread); | pthread_cancel(thread); | ||||
@@ -192,9 +192,9 @@ int JackPosixThread::KillImp(pthread_t thread) | |||||
} | } | ||||
} | } | ||||
int JackPosixThread::StopImp(pthread_t thread) | |||||
int JackPosixThread::StopImp(jack_native_thread_t thread) | |||||
{ | { | ||||
if (thread != (pthread_t)NULL) { // If thread has been started | |||||
if (thread != (jack_native_thread_t)NULL) { // If thread has been started | |||||
jack_log("JackPosixThread::Stop"); | jack_log("JackPosixThread::Stop"); | ||||
void* status; | void* status; | ||||
pthread_join(thread, &status); | pthread_join(thread, &status); | ||||
@@ -206,7 +206,7 @@ int JackPosixThread::StopImp(pthread_t thread) | |||||
int JackPosixThread::AcquireRealTime() | int JackPosixThread::AcquireRealTime() | ||||
{ | { | ||||
return (fThread != (pthread_t)NULL) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||||
return (fThread != (jack_native_thread_t)NULL) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||||
} | } | ||||
int JackPosixThread::AcquireSelfRealTime() | int JackPosixThread::AcquireSelfRealTime() | ||||
@@ -225,7 +225,7 @@ int JackPosixThread::AcquireSelfRealTime(int priority) | |||||
fPriority = priority; | fPriority = priority; | ||||
return AcquireSelfRealTime(); | return AcquireSelfRealTime(); | ||||
} | } | ||||
int JackPosixThread::AcquireRealTimeImp(pthread_t thread, int priority) | |||||
int JackPosixThread::AcquireRealTimeImp(jack_native_thread_t thread, int priority) | |||||
{ | { | ||||
struct sched_param rtparam; | struct sched_param rtparam; | ||||
int res; | int res; | ||||
@@ -243,7 +243,7 @@ int JackPosixThread::AcquireRealTimeImp(pthread_t thread, int priority) | |||||
int JackPosixThread::DropRealTime() | int JackPosixThread::DropRealTime() | ||||
{ | { | ||||
return (fThread != (pthread_t)NULL) ? DropRealTimeImp(fThread) : -1; | |||||
return (fThread != (jack_native_thread_t)NULL) ? DropRealTimeImp(fThread) : -1; | |||||
} | } | ||||
int JackPosixThread::DropSelfRealTime() | int JackPosixThread::DropSelfRealTime() | ||||
@@ -251,7 +251,7 @@ int JackPosixThread::DropSelfRealTime() | |||||
return DropRealTimeImp(pthread_self()); | return DropRealTimeImp(pthread_self()); | ||||
} | } | ||||
int JackPosixThread::DropRealTimeImp(pthread_t thread) | |||||
int JackPosixThread::DropRealTimeImp(jack_native_thread_t thread) | |||||
{ | { | ||||
struct sched_param rtparam; | struct sched_param rtparam; | ||||
int res; | int res; | ||||
@@ -265,7 +265,7 @@ int JackPosixThread::DropRealTimeImp(pthread_t thread) | |||||
return 0; | return 0; | ||||
} | } | ||||
pthread_t JackPosixThread::GetThreadID() | |||||
jack_native_thread_t JackPosixThread::GetThreadID() | |||||
{ | { | ||||
return fThread; | return fThread; | ||||
} | } | ||||
@@ -320,42 +320,42 @@ bool jack_get_thread_realtime_priority_range(int * min_ptr, int * max_ptr) | |||||
bool jack_tls_allocate_key(jack_tls_key *key_ptr) | bool jack_tls_allocate_key(jack_tls_key *key_ptr) | ||||
{ | { | ||||
int ret; | int ret; | ||||
ret = pthread_key_create(key_ptr, NULL); | ret = pthread_key_create(key_ptr, NULL); | ||||
if (ret != 0) | if (ret != 0) | ||||
{ | { | ||||
jack_error("pthread_key_create() failed with error %d", ret); | jack_error("pthread_key_create() failed with error %d", ret); | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool jack_tls_free_key(jack_tls_key key) | bool jack_tls_free_key(jack_tls_key key) | ||||
{ | { | ||||
int ret; | int ret; | ||||
ret = pthread_key_delete(key); | ret = pthread_key_delete(key); | ||||
if (ret != 0) | if (ret != 0) | ||||
{ | { | ||||
jack_error("pthread_key_delete() failed with error %d", ret); | jack_error("pthread_key_delete() failed with error %d", ret); | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool jack_tls_set(jack_tls_key key, void *data_ptr) | bool jack_tls_set(jack_tls_key key, void *data_ptr) | ||||
{ | { | ||||
int ret; | int ret; | ||||
ret = pthread_setspecific(key, (const void *)data_ptr); | ret = pthread_setspecific(key, (const void *)data_ptr); | ||||
if (ret != 0) | if (ret != 0) | ||||
{ | { | ||||
jack_error("pthread_setspecific() failed with error %d", ret); | jack_error("pthread_setspecific() failed with error %d", ret); | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU Lesser General Public License for more details. | GNU Lesser General Public License for more details. | ||||
You should have received a copy of the GNU Lesser General Public License | You should have received a copy of the GNU Lesser General Public License | ||||
along with this program; if not, write to the Free Software | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
@@ -40,16 +40,16 @@ class SERVER_EXPORT JackPosixThread : public detail::JackThreadInterface | |||||
protected: | protected: | ||||
pthread_t fThread; | |||||
jack_native_thread_t fThread; | |||||
static void* ThreadHandler(void* arg); | static void* ThreadHandler(void* arg); | ||||
public: | public: | ||||
JackPosixThread(JackRunnableInterface* runnable, bool real_time, int priority, int cancellation) | JackPosixThread(JackRunnableInterface* runnable, bool real_time, int priority, int cancellation) | ||||
: JackThreadInterface(runnable, priority, real_time, cancellation), fThread((pthread_t)NULL) | |||||
: JackThreadInterface(runnable, priority, real_time, cancellation), fThread((jack_native_thread_t)NULL) | |||||
{} | {} | ||||
JackPosixThread(JackRunnableInterface* runnable, int cancellation = PTHREAD_CANCEL_ASYNCHRONOUS) | JackPosixThread(JackRunnableInterface* runnable, int cancellation = PTHREAD_CANCEL_ASYNCHRONOUS) | ||||
: JackThreadInterface(runnable, 0, false, cancellation), fThread((pthread_t)NULL) | |||||
: JackThreadInterface(runnable, 0, false, cancellation), fThread((jack_native_thread_t)NULL) | |||||
{} | {} | ||||
int Start(); | int Start(); | ||||
@@ -60,23 +60,23 @@ class SERVER_EXPORT JackPosixThread : public detail::JackThreadInterface | |||||
int AcquireRealTime(); // Used when called from another thread | int AcquireRealTime(); // Used when called from another thread | ||||
int AcquireSelfRealTime(); // Used when called from thread itself | int AcquireSelfRealTime(); // Used when called from thread itself | ||||
int AcquireRealTime(int priority); // Used when called from another thread | int AcquireRealTime(int priority); // Used when called from another thread | ||||
int AcquireSelfRealTime(int priority); // Used when called from thread itself | int AcquireSelfRealTime(int priority); // Used when called from thread itself | ||||
int DropRealTime(); // Used when called from another thread | int DropRealTime(); // Used when called from another thread | ||||
int DropSelfRealTime(); // Used when called from thread itself | int DropSelfRealTime(); // Used when called from thread itself | ||||
pthread_t GetThreadID(); | |||||
jack_native_thread_t GetThreadID(); | |||||
bool IsThread(); | bool IsThread(); | ||||
static int AcquireRealTimeImp(pthread_t thread, int priority); | |||||
static int AcquireRealTimeImp(pthread_t thread, int priority, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
static int AcquireRealTimeImp(jack_native_thread_t thread, int priority); | |||||
static int AcquireRealTimeImp(jack_native_thread_t thread, int priority, UInt64 period, UInt64 computation, UInt64 constraint) | |||||
{ return JackPosixThread::AcquireRealTimeImp(thread, priority); } | { return JackPosixThread::AcquireRealTimeImp(thread, priority); } | ||||
static int DropRealTimeImp(pthread_t thread); | |||||
static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||||
static int StopImp(pthread_t thread); | |||||
static int KillImp(pthread_t thread); | |||||
static int DropRealTimeImp(jack_native_thread_t thread); | |||||
static int StartImp(jack_native_thread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||||
static int StopImp(jack_native_thread_t thread); | |||||
static int KillImp(jack_native_thread_t thread); | |||||
}; | }; | ||||
SERVER_EXPORT void ThreadExit(); | SERVER_EXPORT void ThreadExit(); | ||||
@@ -26,6 +26,8 @@ | |||||
typedef unsigned long long UInt64; | typedef unsigned long long UInt64; | ||||
typedef pthread_key_t jack_tls_key; | typedef pthread_key_t jack_tls_key; | ||||
typedef pthread_t jack_native_thread_t; | |||||
typedef int (*jack_thread_creator_t)(pthread_t*, const pthread_attr_t*, void* (*function)(void*), void* arg); | typedef int (*jack_thread_creator_t)(pthread_t*, const pthread_attr_t*, void* (*function)(void*), void* arg); | ||||
#endif | #endif |