This avoids the need for the tricky osl::Condition::reset calls. For example,
the first one (in the "disposed !" case) had been added with
2a3ed89284 "sb132: #i112448# proper clean up in
JobQueue::enter (patch by olistraub)" as
> if( 0 == m_lstCallstack.front() )
> {
> // disposed !
> + if( m_lstJob.empty() )
> + {
> + osl_resetCondition( m_cndWait );
> + }
> break;
> }
>
and then change to
> if( 0 == m_lstCallstack.front() )
> {
> // disposed !
> - if( m_lstJob.empty() )
> + if( m_lstJob.empty()
> + && (m_lstCallstack.empty()
> + || m_lstCallstack.front() != 0) )
> {
> osl_resetCondition( m_cndWait );
> }
with cba3ac1eab "Avoid deadlocks when disposing
recursive JobQueue::enter", which prevented the reset from ever hapening
(because m_lstCallstack.front() cannot both be zero and non-zero here at the
same time). The std::condition_variable semantics nicely avoid any reasoning
whether or not a reset would be necessary here.
Change-Id: Ic9b57b836bb6679829f4aa3b68679256726acf60
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96406
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
...while a remote call is in progress. Otherwise, if the same thread later
makes another remote call (through another bridge), it would erroneously pair
the repsonse for the disposed call with the second call.
UITest_calc_demo started to fail that way occasionally, presumably after
77445e201c "Make Chart Creation Wizard async", but
for reasons rather unrelated to the contents of that commit. What apparently
happened is that in one test's tearDown, the bridge between the Python and the
soffice process happened to be disposed during the XDesktop::terminate call from
Python's main thread, so that the response (of type BOOLEAN) remained in the
JobQueue. Then during the next test's setUp, XUnoUrlResolver::resolve from
Python's main thread would internally make a remote queryInterface call for the
initial StarOffice.ComponentContext object, which returns an ANY of either VOID
or XInterface type. But that call was then mis-matched with the leftover
BOOLEAN response, causing failure.
I was able to reproduce that reliably on Linux with a local hack of
> diff --git a/cppu/source/threadpool/jobqueue.cxx b/cppu/source/threadpool/jobqueue.cxx
> index 6c9324521f40..a87770bf8935 100644
> --- a/cppu/source/threadpool/jobqueue.cxx
> +++ b/cppu/source/threadpool/jobqueue.cxx
> @@ -71,6 +71,7 @@ namespace cppu_threadpool {
> }
>
> m_cndWait.wait();
> + timespec ms{0, 1000000}; nanosleep(&ms, nullptr);
>
> struct Job job={nullptr,nullptr};
> {
introducing a sleep, so that other threads have a higher chance to dispose the
bridge (when the call being processed here is that XDesktop::dispose) after the
successful wait() but before the response is processed. UITest_calc_demo then
failed with
[...]
> Execution time for create_chart.CalcChartUIDemo.test_activate_chart: 6.520
> tearDown: calling terminate()...
> caught while TearDown:
> Traceback (most recent call last):
> File "uitest/libreoffice/connection.py", line 127, in tearDown
> xDesktop.terminate()
> libreoffice.connection.com.sun.star.lang.DisposedException: Binary URP bridge disposed during call binaryurp/source/bridge.cxx:611
>
> ok
> test_cancel_immediately (create_chart.CalcChartUIDemo) ...
[...]
> warn:sal.osl.pipe:423851:425076:sal/osl/unx/pipe.cxx:442: recv() failed: ECONNRESET
> warn:binaryurp:423851:425076:binaryurp/source/bridge.cxx:843: undisposed bridge "" in state 2, potential deadlock ahead
[...]
> ======================================================================
> ERROR: test_cancel_immediately (create_chart.CalcChartUIDemo)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "uitest/uitest/framework.py", line 25, in setUp
> self.connection.setUp()
> File "uitest/libreoffice/connection.py", line 176, in setUp
> conn.setUp()
> File "uitest/libreoffice/connection.py", line 57, in setUp
> self.xContext = self.connect(socket)
> File "uitest/libreoffice/connection.py", line 107, in connect
> xContext = xUnoResolver.resolve(url)
> uno.com.sun.star.uno.RuntimeException: initial object queryInterface for OID "StarOffice.ComponentContext" returned ANY of type boolean binaryurp/source/bridge.cxx:883
[...]
Change-Id: Icf9aadbb38e7aafffff844fe8e9ae99e165c1f33
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96326
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
* commit 'ooo/DEV300_m101': (185 commits)
chart52: cleanup unused legend entry stuff in preparation of issue #i82802#
masterfix: #i10000# add missing dependency in offapi
sb138: #i115619# fix for MinGW
sb138: #i115619#, #i116038# use osl_setThreadName in binaryurp
sb138: #i115619# osl_setThreadName
gridsort: i116682: update UnoControlDialog to reflect XDialog
gridsort: minor changes to the new API: - renamed XMutableGridDataModel::setRowHeading to updateRowHeading for consistency reasons - renamed XSortableGridDataModel to XSortableGridData - actually, this is not a full-fledged model in itself.
gridsort: grid control related unit tests (first set, more to come)
sb138: #i116038# fresh implementation of binary URP bridge
chart52: #28670# make the legend within charts resizeable - part 2
gridsort: re-did the column resizing - introduced XGridColumn.Flexibility, determining to which degree the column is resized during auto-column-resizing - removed XGridColumn.PreferredWidth - there really is no need for this anymore now - documented the relationship between XGridColumn.Flexibility and XGridColumn.Resizeable - re-implemented TableControl_Impl::impl_ni_updateColumnWidths, with (hopefully) less magic
sb139: #i116530# improve Java URP bridge error notification by utilizing the java.lang.Throwable cause facility
gridsort: document the relationship between soorting the data and notifying XGridDataListeners
gridsort: introduce XGridColumn::DataModelIndex. this allows for column removal/insertion at the GridColumnModel, without the need to touch the GridDataModel
locales34: #i112431# adapt documentation to reality
gridsort: introduce XSortableGridDataModel::removeColumnSort
gridsort: #163172# added UNO API support for sorting grid data. Implementation still unfinished. Things missing in the SortableGridData implementation - add as listener to the delegator, so we're notified of changes - translate and multiplex those changes - do own notifications (XGridDataListener.dataChanged) when the sort order changed - (possibly) update the sort order when the data in the current sort-column changed
gridsort: made the row title a row heading, being an Any instead of a string
gridsort: XMutableGridData: renamed updateRow to updateRowData for consistency; introduced updateRowToolTip as shortcut for multiple updateCellToolTip calls
gridsort: updateCell->updateCellData, setCellToolTip->updateCellToolTip; in both methods, have (Col,Row) params instead of (Row,Col), for consistency reasons
...
Conflicts:
bridges/inc/bridges/remote/bridgeimpl.hxx
bridges/inc/bridges/remote/connection.h
bridges/inc/bridges/remote/context.h
bridges/inc/bridges/remote/helper.hxx
bridges/inc/bridges/remote/mapping.hxx
bridges/inc/bridges/remote/proxy.hxx
bridges/inc/bridges/remote/remote.h
bridges/inc/bridges/remote/remote.hxx
bridges/inc/bridges/remote/stub.hxx
bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
bridges/source/remote/context/context.cxx
bridges/source/remote/static/helper.cxx
bridges/source/remote/static/mapping.cxx
bridges/source/remote/static/proxy.cxx
bridges/source/remote/static/remote.cxx
bridges/source/remote/static/remote_types.cxx
bridges/source/remote/static/remote_types.hxx
bridges/source/remote/static/stub.cxx
bridges/source/remote/urp/urp_bridgeimpl.cxx
bridges/source/remote/urp/urp_bridgeimpl.hxx
bridges/source/remote/urp/urp_cache.h
bridges/source/remote/urp/urp_cache.hxx
bridges/source/remote/urp/urp_dispatch.cxx
bridges/source/remote/urp/urp_dispatch.hxx
bridges/source/remote/urp/urp_environment.cxx
bridges/source/remote/urp/urp_job.cxx
bridges/source/remote/urp/urp_job.hxx
bridges/source/remote/urp/urp_log.cxx
bridges/source/remote/urp/urp_log.hxx
bridges/source/remote/urp/urp_marshal.cxx
bridges/source/remote/urp/urp_marshal.hxx
bridges/source/remote/urp/urp_marshal_decl.hxx
bridges/source/remote/urp/urp_property.hxx
bridges/source/remote/urp/urp_propertyobject.cxx
bridges/source/remote/urp/urp_propertyobject.hxx
bridges/source/remote/urp/urp_reader.cxx
bridges/source/remote/urp/urp_reader.hxx
bridges/source/remote/urp/urp_replycontainer.hxx
bridges/source/remote/urp/urp_threadid.cxx
bridges/source/remote/urp/urp_threadid.hxx
bridges/source/remote/urp/urp_unmarshal.cxx
bridges/source/remote/urp/urp_unmarshal.hxx
bridges/source/remote/urp/urp_writer.cxx
bridges/source/remote/urp/urp_writer.hxx
cppu/source/threadpool/threadpool.cxx
cppu/util/target.pmk
cppuhelper/qa/propertysetmixin/comp_propertysetmixin.cxx
cppuhelper/source/interfacecontainer.cxx
cpputools/source/regcomplazy/regcomplazy.cxx
jurt/prj/d.lst
jvmfwk/source/elements.cxx
offapi/com/sun/star/awt/grid/GridDataEvent.idl
offapi/com/sun/star/awt/grid/XGridColumn.idl
offapi/com/sun/star/awt/tab/makefile.mk
offapi/com/sun/star/chart2/ExplicitIncrementData.idl
offapi/com/sun/star/chart2/XPlotter.idl
offapi/com/sun/star/chart2/XUndoHelper.idl
offapi/com/sun/star/document/MediaDescriptor.idl
offapi/com/sun/star/document/makefile.mk
offapi/com/sun/star/linguistic2/XLanguageGuessing.idl
offapi/com/sun/star/script/ModuleInfo.idl
offapi/com/sun/star/script/ModuleType.idl
offapi/com/sun/star/text/TextMarkupType.idl
offapi/com/sun/star/util/XTextSearch.idl
offapi/com/sun/star/xml/sax/XFastAttributeList.idl
pyuno/source/loader/makefile.mk
remotebridges/source/bridge/bridge_connection.cxx
remotebridges/source/bridge/bridge_connection.hxx
remotebridges/source/bridge/bridge_provider.cxx
remotebridges/source/bridge/remote_bridge.cxx
remotebridges/source/bridge/remote_bridge.hxx
remotebridges/source/dynamicloader/dynamicloader.cxx
remotebridges/source/factory/bridgefactory.cxx
remotebridges/source/factory/bridgeimpl.cxx
remotebridges/source/factory/bridgeimpl.hxx
remotebridges/source/factory/makefile.mk
sal/cppunittester/cppunittester.cxx
sal/inc/osl/diagnose.h
sal/osl/os2/system.h
sal/osl/unx/diagnose.c
sal/osl/unx/file_misc.cxx
sal/osl/unx/process_impl.cxx
sal/osl/w32/diagnose.c
sal/osl/w32/process.cxx
sal/prj/build.lst
sal/qa/rtl/math/makefile.mk
sal/qa/rtl/math/rtl_math.cxx
sal/qa/rtl/math/rtl_old_testint64.cxx
sal/qa/rtl/math/test_rtl_math.cxx
sal/systools/win32/kill/kill.cxx
sal/textenc/tencinfo.c
sal/util/sal.map
stoc/source/inspect/introspection.cxx
stoc/source/security/file_policy.cxx
stoc/source/simpleregistry/simpleregistry.cxx
2006/03/22 10:14:04 sb 1.3.38.1: #i63397# Keep objects alive long enough so that threads still running while atexit handlers are processed do not access dead objects.