mirror of
https://github.com/termux/termux-packages
synced 2024-06-18 08:07:07 +00:00
speechd: Use alternative pthread_cancel
workaround
This commit is contained in:
parent
265b425b29
commit
729d04f152
|
@ -3,19 +3,13 @@ TERMUX_PKG_DESCRIPTION="Common interface to speech synthesis"
|
||||||
TERMUX_PKG_LICENSE="LGPL-2.1, GPL-2.0"
|
TERMUX_PKG_LICENSE="LGPL-2.1, GPL-2.0"
|
||||||
TERMUX_PKG_MAINTAINER="@termux"
|
TERMUX_PKG_MAINTAINER="@termux"
|
||||||
TERMUX_PKG_VERSION="0.11.4"
|
TERMUX_PKG_VERSION="0.11.4"
|
||||||
|
TERMUX_PKG_REVISION=1
|
||||||
TERMUX_PKG_SHA256=628d4446894b47f0df099123924c1070180b5b5b09c5b637ebe80d8578fba92f
|
TERMUX_PKG_SHA256=628d4446894b47f0df099123924c1070180b5b5b09c5b637ebe80d8578fba92f
|
||||||
TERMUX_PKG_SRCURL=https://github.com/brailcom/speechd/archive/${TERMUX_PKG_VERSION}.tar.gz
|
TERMUX_PKG_SRCURL=https://github.com/brailcom/speechd/archive/${TERMUX_PKG_VERSION}.tar.gz
|
||||||
TERMUX_PKG_DEPENDS="dotconf, espeak, glib, libiconv, pulseaudio, python"
|
TERMUX_PKG_DEPENDS="dotconf, espeak, glib, libiconv, libltdl, libsndfile, pulseaudio, python, speechd-data"
|
||||||
TERMUX_PKG_BUILD_DEPENDS="libiconv-static, libsndfile-static"
|
TERMUX_PKG_BUILD_DEPENDS="libiconv-static, libsndfile-static"
|
||||||
TERMUX_PKG_AUTO_UPDATE=true
|
TERMUX_PKG_AUTO_UPDATE=true
|
||||||
|
|
||||||
##
|
|
||||||
## Note: package needs patching for proper fix of pthread_cancel usage.
|
|
||||||
## Right now it uses pthread_kill(t, 0) which does nothing and is not
|
|
||||||
## correct solution to the missing pthread_cancel on Android OS.
|
|
||||||
## See package "calcurse" for example of proper pthread_cancel replacement.
|
|
||||||
##
|
|
||||||
|
|
||||||
# Fails to find generated headers
|
# Fails to find generated headers
|
||||||
TERMUX_PKG_BUILD_IN_SRC=true
|
TERMUX_PKG_BUILD_IN_SRC=true
|
||||||
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
|
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
|
||||||
|
@ -36,6 +30,15 @@ termux_step_pre_configure() {
|
||||||
source $TERMUX_SCRIPTDIR/packages/python/build.sh
|
source $TERMUX_SCRIPTDIR/packages/python/build.sh
|
||||||
echo $_MAJOR_VERSION
|
echo $_MAJOR_VERSION
|
||||||
)
|
)
|
||||||
|
termux_setup_python_crossenv
|
||||||
|
pushd $TERMUX_PYTHON_CROSSENV_SRCDIR
|
||||||
|
_CROSSENV_PREFIX=$TERMUX_PKG_BUILDDIR/python-crossenv-prefix
|
||||||
|
python${_PYTHON_VERSION} -m crossenv \
|
||||||
|
$TERMUX_PREFIX/bin/python${_PYTHON_VERSION} \
|
||||||
|
${_CROSSENV_PREFIX}
|
||||||
|
popd
|
||||||
|
. ${_CROSSENV_PREFIX}/bin/activate
|
||||||
|
|
||||||
export am_cv_python_pythondir="${TERMUX_PREFIX}/lib/python${_PYTHON_VERSION}/site-packages"
|
export am_cv_python_pythondir="${TERMUX_PREFIX}/lib/python${_PYTHON_VERSION}/site-packages"
|
||||||
export am_cv_python_pyexecdir="$am_cv_python_pythondir"
|
export am_cv_python_pyexecdir="$am_cv_python_pythondir"
|
||||||
./build.sh
|
./build.sh
|
||||||
|
|
176
packages/speechd/pthread_cancel.patch
Normal file
176
packages/speechd/pthread_cancel.patch
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
--- a/src/api/c/libspeechd.c
|
||||||
|
+++ b/src/api/c/libspeechd.c
|
||||||
|
@@ -610,7 +610,11 @@ void spd_close(SPDConnection * connectio
|
||||||
|
pthread_mutex_lock(&connection->ssip_mutex);
|
||||||
|
|
||||||
|
if (connection->mode == SPD_MODE_THREADED) {
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_cancel(connection->td->events_thread);
|
||||||
|
+#else
|
||||||
|
+ pthread_kill(connection->td->events_thread, SIGUSR2);
|
||||||
|
+#endif
|
||||||
|
pthread_mutex_destroy(&connection->td->mutex_reply_ready);
|
||||||
|
pthread_mutex_destroy(&connection->td->mutex_reply_ack);
|
||||||
|
pthread_cond_destroy(&connection->td->cond_reply_ready);
|
||||||
|
@@ -1842,12 +1846,28 @@ static char *get_reply(SPDConnection * c
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef __ANDROID__
|
||||||
|
+static void thread_signal_handler(int signum)
|
||||||
|
+{
|
||||||
|
+ pthread_exit(0);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static void *spd_events_handler(void *conn)
|
||||||
|
{
|
||||||
|
char *reply;
|
||||||
|
int reply_code;
|
||||||
|
SPDConnection *connection = conn;
|
||||||
|
|
||||||
|
+#ifdef __ANDROID__
|
||||||
|
+ struct sigaction actions;
|
||||||
|
+ memset(&actions, 0, sizeof(actions));
|
||||||
|
+ sigemptyset(&actions.sa_mask);
|
||||||
|
+ actions.sa_flags = 0;
|
||||||
|
+ actions.sa_handler = thread_signal_handler;
|
||||||
|
+ sigaction(SIGUSR2, &actions, NULL);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
while (1) {
|
||||||
|
|
||||||
|
/* Read the reply/event (block if none is available) */
|
||||||
|
--- a/src/audio/nas.c
|
||||||
|
+++ b/src/audio/nas.c
|
||||||
|
@@ -51,11 +51,27 @@ typedef struct {
|
||||||
|
|
||||||
|
static int nas_log_level;
|
||||||
|
|
||||||
|
+#ifdef __ANDROID__
|
||||||
|
+static void thread_signal_handler(int signum)
|
||||||
|
+{
|
||||||
|
+ pthread_exit(0);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* Internal event handler */
|
||||||
|
static void *_nas_handle_events(void *par)
|
||||||
|
{
|
||||||
|
spd_nas_id_t *nas_id = (spd_nas_id_t *) par;
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
|
||||||
|
+#else
|
||||||
|
+ struct sigaction actions;
|
||||||
|
+ memset(&actions, 0, sizeof(actions));
|
||||||
|
+ sigemptyset(&actions.sa_mask);
|
||||||
|
+ actions.sa_flags = 0;
|
||||||
|
+ actions.sa_handler = thread_signal_handler;
|
||||||
|
+ sigaction(SIGUSR2, &actions, NULL);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
AuHandleEvents(nas_id->aud);
|
||||||
|
@@ -214,7 +230,11 @@ static int nas_close(AudioID * id)
|
||||||
|
if (nas_id == NULL)
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_cancel(nas_id->nas_event_handler);
|
||||||
|
+#else
|
||||||
|
+ pthread_kill(nas_id->nas_event_handler, SIGUSR2);
|
||||||
|
+#endif
|
||||||
|
pthread_join(nas_id->nas_event_handler, NULL);
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&nas_id->pt_mutex);
|
||||||
|
--- a/src/common/common.c
|
||||||
|
+++ b/src/common/common.c
|
||||||
|
@@ -47,8 +47,24 @@ int spd_pthread_create(pthread_t *thread
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef __ANDROID__
|
||||||
|
+static void thread_signal_handler(int signum)
|
||||||
|
+{
|
||||||
|
+ pthread_exit(0);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
void set_speaking_thread_parameters(void)
|
||||||
|
{
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
|
||||||
|
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
||||||
|
+#else
|
||||||
|
+ struct sigaction actions;
|
||||||
|
+ memset(&actions, 0, sizeof(actions));
|
||||||
|
+ sigemptyset(&actions.sa_mask);
|
||||||
|
+ actions.sa_flags = 0;
|
||||||
|
+ actions.sa_handler = thread_signal_handler;
|
||||||
|
+ sigaction(SIGUSR2, &actions, NULL);
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
--- a/src/modules/module_utils.c
|
||||||
|
+++ b/src/modules/module_utils.c
|
||||||
|
@@ -586,7 +586,11 @@ int module_terminate_thread(pthread_t th
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
ret = pthread_cancel(thread);
|
||||||
|
+#else
|
||||||
|
+ ret = pthread_kill(thread, SIGUSR2);
|
||||||
|
+#endif
|
||||||
|
if (ret != 0) {
|
||||||
|
DBG("Cancellation of speak thread failed");
|
||||||
|
return 1;
|
||||||
|
--- a/src/server/output.c
|
||||||
|
+++ b/src/server/output.c
|
||||||
|
@@ -225,7 +225,16 @@ void
|
||||||
|
static output_lock(void)
|
||||||
|
{
|
||||||
|
if (pthread_self() == speak_thread)
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
|
||||||
|
+#else
|
||||||
|
+ {
|
||||||
|
+ sigset_t pthread_cancel_block;
|
||||||
|
+ sigemptyset(&pthread_cancel_block);
|
||||||
|
+ sigaddset(&pthread_cancel_block, SIGUSR2);
|
||||||
|
+ sigprocmask(SIG_BLOCK, &pthread_cancel_block, NULL);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
pthread_mutex_lock(&output_layer_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -234,7 +243,16 @@ static output_unlock(void)
|
||||||
|
{
|
||||||
|
pthread_mutex_unlock(&output_layer_mutex);
|
||||||
|
if (pthread_self() == speak_thread)
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
pthread_setcancelstate(oldstate, NULL);
|
||||||
|
+#else
|
||||||
|
+ {
|
||||||
|
+ sigset_t pthread_cancel_block;
|
||||||
|
+ sigemptyset(&pthread_cancel_block);
|
||||||
|
+ sigaddset(&pthread_cancel_block, SIGUSR2);
|
||||||
|
+ sigprocmask(SIG_UNBLOCK, &pthread_cancel_block, NULL);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#define OL_RET(value) \
|
||||||
|
--- a/src/server/speechd.c
|
||||||
|
+++ b/src/server/speechd.c
|
||||||
|
@@ -1353,7 +1353,11 @@ int main(int argc, char *argv[])
|
||||||
|
g_hash_table_destroy(fd_settings);
|
||||||
|
|
||||||
|
MSG(4, "Closing speak() thread...");
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
ret = pthread_cancel(speak_thread);
|
||||||
|
+#else
|
||||||
|
+ ret = pthread_kill(speak_thread, SIGUSR2);
|
||||||
|
+#endif
|
||||||
|
if (ret != 0)
|
||||||
|
FATAL("Speak thread failed to cancel!\n");
|
||||||
|
|
5
packages/speechd/speechd-data.subpackage.sh
Normal file
5
packages/speechd/speechd-data.subpackage.sh
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
TERMUX_SUBPKG_DESCRIPTION="Platform-independent data for speechd"
|
||||||
|
TERMUX_SUBPKG_PLATFORM_INDEPENDENT=true
|
||||||
|
TERMUX_SUBPKG_INCLUDE="share/speech-dispatcher/"
|
||||||
|
TERMUX_SUBPKG_BREAKS="speechd (<< 0.11.4-1)"
|
||||||
|
TERMUX_SUBPKG_REPLACES="speechd (<< 0.11.4-1)"
|
|
@ -1,82 +0,0 @@
|
||||||
--- a/src/server/speechd.c 2022-04-15 04:49:54.443394249 +0000
|
|
||||||
+++ b/src/server/speechd.c 2022-04-15 06:14:44.973486291 +0000
|
|
||||||
@@ -1353,7 +1353,7 @@
|
|
||||||
g_hash_table_destroy(fd_settings);
|
|
||||||
|
|
||||||
MSG(4, "Closing speak() thread...");
|
|
||||||
- ret = pthread_cancel(speak_thread);
|
|
||||||
+ ret = pthread_kill(speak_thread, 0);
|
|
||||||
if (ret != 0)
|
|
||||||
FATAL("Speak thread failed to cancel!\n");
|
|
||||||
|
|
||||||
--- a/src/modules/module_utils.c 2022-04-15 04:49:54.468395993 +0000
|
|
||||||
+++ b/src/modules/module_utils.c 2022-04-15 06:07:29.462108958 +0000
|
|
||||||
@@ -584,7 +584,7 @@
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
- ret = pthread_cancel(thread);
|
|
||||||
+ ret = pthread_kill(thread, 0);
|
|
||||||
if (ret != 0) {
|
|
||||||
DBG("Cancellation of speak thread failed");
|
|
||||||
return 1;
|
|
||||||
--- a/src/audio/nas.c 2022-04-15 04:49:54.442394179 +0000
|
|
||||||
+++ b/src/audio/nas.c 2022-04-15 05:57:51.188773780 +0000
|
|
||||||
@@ -51,8 +51,6 @@
|
|
||||||
static void *_nas_handle_events(void *par)
|
|
||||||
{
|
|
||||||
spd_nas_id_t *nas_id = (spd_nas_id_t *) par;
|
|
||||||
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
|
|
||||||
-
|
|
||||||
while (1)
|
|
||||||
AuHandleEvents(nas_id->aud);
|
|
||||||
|
|
||||||
@@ -208,7 +206,7 @@
|
|
||||||
if (nas_id == NULL)
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
- pthread_cancel(nas_id->nas_event_handler);
|
|
||||||
+ pthread_kill(nas_id->nas_event_handler,0);
|
|
||||||
pthread_join(nas_id->nas_event_handler, NULL);
|
|
||||||
|
|
||||||
pthread_mutex_destroy(&nas_id->pt_mutex);
|
|
||||||
--- a/src/api/c/libspeechd.c 2022-04-15 04:49:54.445394389 +0000
|
|
||||||
+++ b/src/api/c/libspeechd.c 2022-04-15 05:47:47.292651531 +0000
|
|
||||||
@@ -607,7 +607,7 @@
|
|
||||||
pthread_mutex_lock(&connection->ssip_mutex);
|
|
||||||
|
|
||||||
if (connection->mode == SPD_MODE_THREADED) {
|
|
||||||
- pthread_cancel(connection->td->events_thread);
|
|
||||||
+ pthread_kill(connection->td->events_thread, 0);
|
|
||||||
pthread_mutex_destroy(&connection->td->mutex_reply_ready);
|
|
||||||
pthread_mutex_destroy(&connection->td->mutex_reply_ack);
|
|
||||||
pthread_cond_destroy(&connection->td->cond_reply_ready);
|
|
||||||
--- a/src/common/common.c 2022-04-15 04:49:54.442394179 +0000
|
|
||||||
+++ b/src/common/common.c 2022-04-15 14:25:51.987242432 +0000
|
|
||||||
@@ -49,6 +49,4 @@
|
|
||||||
|
|
||||||
void set_speaking_thread_parameters(void)
|
|
||||||
{
|
|
||||||
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
|
|
||||||
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
|
||||||
}
|
|
||||||
--- a/src/server/output.c 2022-04-15 04:49:54.443394249 +0000
|
|
||||||
+++ b/src/server/output.c 2022-04-15 14:30:36.748824687 +0000
|
|
||||||
@@ -218,8 +218,6 @@
|
|
||||||
void
|
|
||||||
static output_lock(void)
|
|
||||||
{
|
|
||||||
- if (pthread_self() == speak_thread)
|
|
||||||
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
|
|
||||||
pthread_mutex_lock(&output_layer_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -227,8 +225,6 @@
|
|
||||||
static output_unlock(void)
|
|
||||||
{
|
|
||||||
pthread_mutex_unlock(&output_layer_mutex);
|
|
||||||
- if (pthread_self() == speak_thread)
|
|
||||||
- pthread_setcancelstate(oldstate, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define OL_RET(value) \
|
|
Loading…
Reference in New Issue
Block a user