Discussion:
[omniORB] Deadlock: got stuck in omniORB::run()
Wernke zur Borg
2007-02-26 16:37:36 UTC
Permalink
Hello,

I am having a problem getting stuck in a deadlock while trying to shut
down the ORB. The omniORB version is 4.0.6.

I am using MAIN_THREAD_MODEL with a dedicated undetached omnithread that
handles all upcalls. I call omniORB::setMainThread() then omniORB::run()
from that thread at startup. This works fine, all upcalls are dispatched
on this main thread. (Question: Is there a possibility to wait for
upcalls other than calling omniORB::run() ?)

When it comes to shut down the process, I call omniORB::shutdown() from
another thread and expect omniORB::run() to return in the omniORB
thread. This works in 99 out of 100 cases but every once in a while
run() does not return. Inspection of the stack shows that the thread is
waiting on a condvar named orb_signal, and that a shutdown thread is
hanging in omni::omniObjAdapter::wait_for_detached_objects().

Waiting for run() to return is necessary because I have to perform
cleanup activities from that thread, this is a limitation of a 3rd party
database I am using.

This is the stack of the shutdown thread:

[1] cond_wait(0xfbf05d98, 0x0, 0x0, 0xfdd6c000, 0x0, 0x0), at
0xfdd481ac
[2] _ti_pthread_cond_wait(0xff337480, 0xff337460, 0xff337460,
0xff3dc890, 0x0, 0x1), at 0xfdd48070
[3] omni_condition::wait(this = ???) (optimized), at 0xff372154 (line
~163) in "posix.cc"
=>[4] omni::omniObjAdapter::wait_for_detached_objects(this = ???)
(optimized), at 0xff23ab9c (line ~512) in "objectAdapter.cc"
[5] omni::omniOrbPOA::do_destroy(this = ???, etherealize_objects =
???) (optimized), at 0xff2564dc (line ~2219) in "poa.cc"
[6] omni::omniOrbPOA::destroy(this = ???, etherealize_objects = ???,
wait_for_completion = ???) (optimized), at 0xff251890 (line ~793) in
"poa.cc"
[7] omni::omniOrbPOA::do_destroy(this = ???, etherealize_objects =
???) (optimized), at 0xff256288 (line ~2219) in "poa.cc"
[8] omni::omniOrbPOA::destroy(this = ???, etherealize_objects = ???,
wait_for_completion = ???) (optimized), at 0xff251890 (line ~793) in
"poa.cc"
[9] omni::omniOrbPOA::shutdown() (optimized), at 0xff25ac18 (line
~3959) in "poa.cc"
[10] omniOrbORB::actual_shutdown(this = ???) (optimized), at
0xff21283c (line ~1017) in "corbaOrb.cc"
[11] shutdown_thread_fn(arg = ???) (optimized), at 0xff212904 (line
~1029) in "corbaOrb.cc"
[12] omni_thread_wrapper(ptr = ???) (optimized), at 0xff372878 (line
~461) in "posix.cc"

This is the stack of my main thread:

[1] cond_wait(0xfca03d98, 0x0, 0x0, 0xfdd6c000, 0x0, 0x0), at
0xfdd481ac
[2] _ti_pthread_cond_wait(0xff335308, 0xff3352c8, 0xff3352c8, 0x2,
0xc5050, 0x10c9980), at 0xfdd48070
[3] omni_condition::wait(this = ???) (optimized), at 0xff372154 (line
~163) in "posix.cc"
[4] omni::ORBAsyncInvoker::perform(this = ???, secs = ???, nanosecs =
???) (optimized), at 0xff212d50 (line ~1138) in "corbaOrb.cc"
=>[5] omniOrbORB::run(this = ???) (optimized), at 0xff211c4c (line ~811)
in "corbaOrb.cc"
[6] DatabaseAgent::DatabaseThread::run_undetached(this = 0x1134460,
args = 0x11241f8), line 287 in "DatabaseAgent.C"
[7] omni_thread_wrapper(ptr = ???) (optimized), at 0xff3728ec (line
~461) in "posix.cc"

Has anybody got an idea why this is and how I can prevent it?

Thanks, Wernke
Duncan Grisby
2007-02-27 17:25:41 UTC
Permalink
Post by Wernke zur Borg
I am having a problem getting stuck in a deadlock while trying to shut
down the ORB. The omniORB version is 4.0.6.
There have been a number of fixes to shutdown since 4.0.6. I's suggest
you update to either the latest snapshot of the 4.0 branch or to 4.1.0
before trying to diagnose it further.

Cheers,

Duncan.
--
-- Duncan Grisby --
-- ***@grisby.org --
-- http://www.grisby.org --
Loading...