[gparted/psusi/refactor: 1/20] Remove gdk_threads_enter/exit (#685740)
- From: Phillip Susi <psusi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted/psusi/refactor: 1/20] Remove gdk_threads_enter/exit (#685740)
- Date: Sun, 17 Feb 2013 19:22:17 +0000 (UTC)
commit 48d3e70f9330456122b1375ce2bbca753a7819f4
Author: Phillip Susi <psusi ubuntu com>
Date: Mon Jan 14 20:57:34 2013 -0500
Remove gdk_threads_enter/exit (#685740)
Use of these functions is depreciated and making gtk calls in a background
thread still sometimes causes deadlocks or crashes. Change ped exception
handler to instead use an idle function to force the main thread to display
the dialog box.
Part of Bug 685740 - Refactor to use asynchronous command execution
src/Dialog_Progress.cc | 2 -
src/GParted_Core.cc | 56 +++++++++++++++++++++++++++++++++--------------
src/Win_GParted.cc | 2 -
src/main.cc | 2 -
4 files changed, 39 insertions(+), 23 deletions(-)
---
diff --git a/src/Dialog_Progress.cc b/src/Dialog_Progress.cc
index 253a378..dd314e8 100644
--- a/src/Dialog_Progress.cc
+++ b/src/Dialog_Progress.cc
@@ -221,9 +221,7 @@ void Dialog_Progress::on_signal_show()
while ( Gtk::Main::events_pending() )
Gtk::Main::iteration();
- gdk_threads_leave();
usleep( 100000 ) ;
- gdk_threads_enter();
}
//set status (succes/error) for this operation
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 7a4dd86..1f0bcc0 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -3539,32 +3539,54 @@ public:
}
};
-PedExceptionOption GParted_Core::ped_exception_handler( PedException * e )
+struct ped_exception_ctx {
+ PedExceptionOption ret;
+ PedException *e;
+ Glib::Threads::Mutex mutex;
+ Glib::Threads::Cond cond;
+};
+
+static bool _ped_exception_handler( struct ped_exception_ctx *ctx )
{
- PedExceptionOption ret = PED_EXCEPTION_UNHANDLED;
- std::cout << e ->message << std::endl ;
+ std::cout << ctx->e->message << std::endl;
- libparted_messages .push_back( e->message ) ;
+ libparted_messages.push_back( ctx->e->message );
char optcount = 0;
int opt = 0;
for( char c = 0; c < 10; c++ )
- if( e->options & (1 << c) ) {
+ if( ctx->e->options & (1 << c) ) {
opt = (1 << c);
optcount++;
}
// if only one option was given, choose it without popup
- if( optcount == 1 && e->type != PED_EXCEPTION_BUG && e->type != PED_EXCEPTION_FATAL )
- return (PedExceptionOption)opt;
- if (Glib::Thread::self() != GParted_Core::mainthread)
- gdk_threads_enter();
- PedExceptionMsg msg( *e );
+ if( optcount == 1 && ctx->e->type != PED_EXCEPTION_BUG && ctx->e->type != PED_EXCEPTION_FATAL )
+ {
+ ctx->ret = (PedExceptionOption)opt;
+ ctx->cond.signal();
+ return false;
+ }
+ PedExceptionMsg msg( *ctx->e );
msg.show_all();
- ret = (PedExceptionOption)msg.run();
- if (Glib::Thread::self() != GParted_Core::mainthread)
- gdk_threads_leave();
- if (ret < 0)
- ret = PED_EXCEPTION_UNHANDLED;
- return ret;
+ ctx->ret = (PedExceptionOption)msg.run();
+ if (ctx->ret < 0)
+ ctx->ret = PED_EXCEPTION_UNHANDLED;
+ ctx->mutex.lock();
+ ctx->cond.signal();
+ ctx->mutex.unlock();
+ return false;
+}
+
+PedExceptionOption GParted_Core::ped_exception_handler( PedException * e )
+{
+ struct ped_exception_ctx ctx;
+ ctx.ret = PED_EXCEPTION_UNHANDLED;
+ ctx.e = e;
+ if (Glib::Thread::self() != GParted_Core::mainthread) {
+ ctx.mutex.lock();
+ g_idle_add( (GSourceFunc)_ped_exception_handler, &ctx );
+ ctx.cond.wait( ctx.mutex );
+ } else _ped_exception_handler( &ctx );
+ return ctx.ret;
}
GParted_Core::~GParted_Core()
@@ -3572,5 +3594,5 @@ GParted_Core::~GParted_Core()
}
Glib::Thread *GParted_Core::mainthread;
-
+
} //GParted
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index 98145f2..c26f7f9 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -627,9 +627,7 @@ void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
pulsebar .pulse();
while ( Gtk::Main::events_pending() )
Gtk::Main::iteration();
- gdk_threads_leave();
usleep( 100000 );
- gdk_threads_enter();
Glib::ustring tmp_msg = gparted_core .get_thread_status_message() ;
if ( tmp_msg != "" )
statusbar .push( tmp_msg ) ;
diff --git a/src/main.cc b/src/main.cc
index 02118d3..7f611fc 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -25,8 +25,6 @@ int main( int argc, char *argv[] )
{
//initialize thread system
Glib::thread_init() ;
- gdk_threads_init();
- gdk_threads_enter();
GParted::GParted_Core::mainthread = Glib::Thread::self();
Gtk::Main kit( argc, argv ) ;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]