[Freeswitch-branches] [commit] r5125 - freeswitch/branches/greenlizard/src/mod/languages/mod_python
Freeswitch SVN
greenlizard at freeswitch.org
Thu May 10 14:13:26 EDT 2007
Author: greenlizard
Date: Thu May 10 14:13:25 2007
New Revision: 5125
Modified:
freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp
freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.c
Log:
bugfix attempt for http://jira.freeswitch.org/browse/MODLANG-15 and an unreported bug with 2 simultaneous callers dialing into python script that caused segfaults and Fatal Python error: ceval: tstate mix-up
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp Thu May 10 14:13:25 2007
@@ -9,8 +9,8 @@
tts_name = NULL;
voice_name = NULL;
- if (session = switch_core_session_locate(uuid)) {
- channel = switch_core_session_get_channel(session);
+ if (session = switch_core_session_locate(uuid)) {
+ channel = switch_core_session_get_channel(session);
}
}
@@ -83,7 +83,10 @@
ap = &args;
}
+ Py_BEGIN_ALLOW_THREADS
status = switch_ivr_play_file(session, NULL, file, ap);
+ Py_END_ALLOW_THREADS
+
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
@@ -114,7 +117,10 @@
ap = &args;
}
+ Py_BEGIN_ALLOW_THREADS
status = switch_ivr_speak_text(session, tts_name, voice_name, codec->implementation->samples_per_second, text, ap);
+ Py_END_ALLOW_THREADS
+
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
@@ -129,7 +135,11 @@
{
switch_status_t status;
sanity_check(-1);
+
+ Py_BEGIN_ALLOW_THREADS
status = switch_ivr_collect_digits_count(session, dtmf_buf,(uint32_t) len,(uint32_t) len, terminators, terminator, (uint32_t) timeout);
+ Py_END_ALLOW_THREADS
+
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
@@ -137,7 +147,11 @@
{
switch_status_t status;
sanity_check(-1);
+
+ Py_BEGIN_ALLOW_THREADS
status = switch_ivr_session_transfer(session, extension, dialplan, context);
+ Py_END_ALLOW_THREADS
+
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
@@ -146,9 +160,12 @@
{
switch_status_t status;
sanity_check(-1);
+
status = switch_play_and_get_digits( session, (uint32_t) min_digits,(uint32_t) max_digits,
(uint32_t) max_tries, (uint32_t) timeout,
terminators, audio_files, bad_input_audio_files, dtmf_buf, 128, digits_regex);
+
+
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.c (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.c Thu May 10 14:13:25 2007
@@ -25,6 +25,7 @@
*
* Brian Fertig <brian.fertig at convergencetek.com>
* Johny Kadarisman <jkr888 at gmail.com>
+ * Traun Leyden <tleyden at branchcut.com>
*
* mod_python.c -- Python Module
*
@@ -43,6 +44,7 @@
#include <switch.h>
+static PyThreadState *mainThreadState = NULL;
void init_freeswitch(void);
static switch_api_interface_t python_run_interface;
@@ -51,7 +53,7 @@
static void eval_some_python(char *uuid, char *args)
{
- PyThreadState *tstate;
+ PyThreadState *tstate = NULL;
FILE *pythonfile = NULL;
char *dupargs = NULL;
char *argv[128] = {0};
@@ -97,16 +99,15 @@
if ((pythonfile = fopen(script_path, "r"))) {
- tstate = Py_NewInterpreter();
+ PyEval_AcquireLock();
+ tstate = PyThreadState_New(mainThreadState->interp);
if (!tstate) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error acquiring tstate\n");
goto done;
}
-
-
- PyThreadState_Clear(tstate);
- init_freeswitch();
+ PyThreadState_Swap(tstate);
+ init_freeswitch();
PyRun_SimpleString("from freeswitch import *");
if (uuid) {
char code[128];
@@ -115,7 +116,11 @@
}
PySys_SetArgv(argc - lead, &argv[lead]);
PyRun_SimpleFile(pythonfile, script);
- Py_EndInterpreter(tstate);
+ PyThreadState_Swap(NULL);
+ PyThreadState_Clear(tstate);
+ PyThreadState_Delete(tstate);
+ PyEval_ReleaseLock();
+
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error running %s\n", script_path);
@@ -134,7 +139,6 @@
static void python_function(switch_core_session_t *session, char *data)
{
-
eval_some_python(switch_core_session_get_uuid(session), (char *)data);
}
@@ -217,9 +221,6 @@
/*.directory_interface */ NULL
};
-//static PyThreadState *gtstate;
-static PyThreadState *mainThreadState;
-
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename)
{
/* connect my internal structure to the blank pointer passed to me */
@@ -231,10 +232,9 @@
mainThreadState = PyThreadState_Get();
- PyEval_ReleaseLock();
+ PyThreadState_Swap(NULL);
- eval_some_python(NULL, "init_python.py");
- PyThreadState_Swap(NULL);
+ PyEval_ReleaseLock();
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
@@ -244,19 +244,19 @@
Called when the system shuts down*/
SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
{
+ PyInterpreterState *mainInterpreterState;
+ PyThreadState *myThreadState;
- PyInterpreterState *mainInterpreterState;
- PyThreadState *myThreadState;
+ PyEval_AcquireLock();
+ mainInterpreterState = mainThreadState->interp;
+ myThreadState = PyThreadState_New(mainInterpreterState);
+ PyThreadState_Swap(myThreadState);
+ PyEval_ReleaseLock();
+
+ Py_Finalize();
+ PyEval_ReleaseLock();
+ return SWITCH_STATUS_SUCCESS;
- PyEval_AcquireLock();
- mainInterpreterState = mainThreadState->interp;
- myThreadState = PyThreadState_New(mainInterpreterState);
- PyThreadState_Swap(myThreadState);
- PyEval_ReleaseLock();
-
- Py_Finalize();
- PyEval_ReleaseLock();
- return SWITCH_STATUS_SUCCESS;
}
More information about the Freeswitch-branches
mailing list