[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bayonne-devel] Re: [Bayonne-dialogic] bayonne locks a line in state "st
From: |
infos chez fdrconseil |
Subject: |
[Bayonne-devel] Re: [Bayonne-dialogic] bayonne locks a line in state "step" |
Date: |
Sat, 26 Feb 2005 17:48:15 +0100 |
User-agent: |
Opera M2/7.54 (Win32, build 3865) |
Hello,
We went on using our stress script and we found a mutex dead-lock in
certain conditions
when starting new scripts with the command start.group.
When a line is not idle and when the start command tries to post the
TRUNK_START_SCRIPT event, the postEvent
function (in Dialogic and Globalcall drivers at least) stays blocked by
entering a mutex already positionned
by the current task.
Moreover, after having corrected this, we noticed that when the start
command does not find any free line, it
stucks without raising the error it should.
So we modified the files : trunk.cpp for Dialogic and Globacall, and
script.cpp in the server directory :
- trunk.cpp to check if the trunk is in the "idle" state
- script.cpp to raise an error if no trunk is available for starting a
script
We keep having a potential problem. Since the mutexes used by Bayonne are
read/write we cannot enter the mutex to
test the state of the trunk (comparing the value of "handler" to the
pointer "DialogicTrunk::idleHandler")
because if so, we would fall again in the deadlock. Then reading this
attribute (handler) we may conflict
with an other thread if this one was modifying the attribute at the same
time.
However, stressing bayonne with the stress script did not show any
conflict, so we publish the patch.
Patch against the version 1.2.14 is following and is attached :
Comments are welcome,
FdR (*#)
diff -Naur bayonne-1.2.14/drivers/dialogic/trunk.cpp
bayonne-1.2.14.after/drivers/dialogic/trunk.cpp
--- bayonne-1.2.14/drivers/dialogic/trunk.cpp 2004-10-27
12:04:58.000000000 +0200
+++ bayonne-1.2.14.after/drivers/dialogic/trunk.cpp 2005-02-26
16:51:32.000000000 +0100
@@ -579,6 +579,11 @@
bool rtn = true;
trunkhandler_t prior;
+ if (event->id == TRUNK_START_SCRIPT) {
+ if (handler != &DialogicTrunk::idleHandler) {
+ return false;
+ }
+ }
enterMutex();
switch(event->id)
{
diff -Naur bayonne-1.2.14/drivers/globalcall/trunk.cpp
bayonne-1.2.14.after/drivers/globalcall/trunk.cpp
--- bayonne-1.2.14/drivers/globalcall/trunk.cpp 2005-01-26
11:43:29.000000000 +0100
+++ bayonne-1.2.14.after/drivers/globalcall/trunk.cpp 2005-02-26
16:50:55.000000000 +0100
@@ -500,6 +500,11 @@
bool rtn = true;
trunkhandler_t prior;
+ if (event->id == TRUNK_START_SCRIPT) {
+ if (handler != &DialogicTrunk::idleHandler) {
+ return false;
+ }
+ }
enterMutex();
switch(event->id)
{
diff -Naur bayonne-1.2.14/server/script.cpp
bayonne-1.2.14.after/server/script.cpp
--- bayonne-1.2.14/server/script.cpp 2004-10-27 12:04:59.000000000 +0200
+++ bayonne-1.2.14.after/server/script.cpp 2005-02-26 16:49:05.000000000
+0100
@@ -3352,7 +3352,10 @@
if(start)
{
- fifo.command(args);
+ if (!fifo.command(args)) {
+ error("start-failed");
+ return true;
+ }
return rtn;
}
bugStartScript.diff
Description: Binary data