[gparted/psusi/refactor: 6/7] Reduce threading
- From: Phillip Susi <psusi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted/psusi/refactor: 6/7] Reduce threading
- Date: Sun, 20 Jan 2013 18:33:23 +0000 (UTC)
commit f03bc6aa745eec2d72aa6afca7473019db3958b6
Author: Phillip Susi <psusi ubuntu com>
Date: Sat Jan 19 00:08:28 2013 -0500
Reduce threading
Win_Gparted and Dialog_Progress were creating threads to perform most
functions in the background. Most of the time, the only reason the
threads blocked was to execute an external command. The external command
execution has been changed to spawn the command asynchronously and wait
for completion with a nested main loop. While waiting for completion,
the pipe output is captured via events. In the future, this will allow
for it to be parsed in real time to obtain progress information.
Those tasks in GParted_Core that still block now spawn a background thread
and wait for it to complete with a nested main loop to avoid hanging the
gui.
include/Dialog_Progress.h | 1 -
include/FileSystem.h | 14 ++--
include/GParted_Core.h | 1 +
include/Utils.h | 12 +++
include/Win_GParted.h | 10 +--
src/Dialog_Progress.cc | 17 +----
src/FileSystem.cc | 94 ++++++++++++++++---------
src/GParted_Core.cc | 20 +++++-
src/Utils.cc | 171 ++++++++++++++++++++++++++++++++-------------
src/Win_GParted.cc | 142 ++++++++++++-------------------------
src/btrfs.cc | 7 +-
src/jfs.cc | 10 ++--
src/nilfs2.cc | 8 +-
src/xfs.cc | 28 ++++----
14 files changed, 301 insertions(+), 234 deletions(-)
---
diff --git a/include/Dialog_Progress.h b/include/Dialog_Progress.h
index e4ede18..1604023 100644
--- a/include/Dialog_Progress.h
+++ b/include/Dialog_Progress.h
@@ -50,7 +50,6 @@ private:
void on_signal_show() ;
void on_expander_changed() ;
void on_cell_data_description( Gtk::CellRenderer * renderer, const Gtk::TreeModel::iterator & iter) ;
- void thread_apply_operation();
void on_cancel() ;
void on_save() ;
void echo_operation_details( const OperationDetail & operation_detail, std::ofstream & out ) ;
diff --git a/include/FileSystem.h b/include/FileSystem.h
index de4270a..2511f6a 100644
--- a/include/FileSystem.h
+++ b/include/FileSystem.h
@@ -56,12 +56,12 @@ public:
OperationDetail & operationdetail ) = 0 ;
virtual bool check_repair( const Partition & partition, OperationDetail & operationdetail ) = 0 ;
virtual bool remove( const Partition & partition, OperationDetail & operationdetail ) = 0 ;
-
+ bool success;
protected:
- int execute_command( const Glib::ustring & command, OperationDetail & operationdetail ) ;
- int execute_command_timed( const Glib::ustring & command
- , OperationDetail & operationdetail
- , bool check_status = true ) ;
+ int execute_command( const Glib::ustring & command, OperationDetail & operationdetail, bool checkstatus = false );
+ int execute_command_timed( const Glib::ustring & command, OperationDetail & operationdetail ) {
+ return execute_command( command, operationdetail, true ); }
+ void execute_command_eof();
Glib::ustring mk_temp_dir( const Glib::ustring & infix, OperationDetail & operationdetail ) ;
void rm_temp_dir( const Glib::ustring dir_name, OperationDetail & operationdetail ) ;
@@ -72,7 +72,9 @@ protected:
unsigned int index ;
private:
-
+ void store_exit_status( GPid pid, int status );
+ bool running;
+ int pipecount;
};
} //GParted
diff --git a/include/GParted_Core.h b/include/GParted_Core.h
index b993131..d10ffc1 100644
--- a/include/GParted_Core.h
+++ b/include/GParted_Core.h
@@ -42,6 +42,7 @@ public:
void find_supported_filesystems() ;
void set_user_devices( const std::vector<Glib::ustring> & user_devices ) ;
void set_devices( std::vector<Device> & devices ) ;
+ void set_devices_thread( std::vector<Device> * pdevices );
void guess_partition_table(const Device & device, Glib::ustring &buff);
bool snap_to_cylinder( const Device & device, Partition & partition, Glib::ustring & error ) ;
diff --git a/include/Utils.h b/include/Utils.h
index 870cfeb..c60c8a6 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -196,6 +196,18 @@ private:
static bool get_kernel_version( int & major_ver, int & minor_ver, int & patch_ver ) ;
};
+// captures output pipe of subprocess into a ustring and emits a signal on eof
+class PipeCapture
+{
+ Glib::ustring &buff;
+ Glib::RefPtr<Glib::IOChannel> channel;
+ sigc::connection connection;
+ bool OnReadable( Glib::IOCondition condition );
+public:
+ PipeCapture( int fd, Glib::ustring &buffer );
+ ~PipeCapture();
+ sigc::signal<void> eof;
+};
}//GParted
diff --git a/include/Win_GParted.h b/include/Win_GParted.h
index 15a4f34..dab5fbd 100644
--- a/include/Win_GParted.h
+++ b/include/Win_GParted.h
@@ -55,7 +55,7 @@ private:
void refresh_combo_devices() ;
void show_pulsebar( const Glib::ustring & status_message ) ;
-
+ void hide_pulsebar();
//Fill txtview_device_info_buffer with some information about the selected device
void Fill_Label_Device_Info( bool clear = false );
@@ -126,12 +126,7 @@ private:
}
//threads..
- void thread_refresh_devices() ;
- void thread_unmount_partition( bool * succes, Glib::ustring * error ) ;
- void thread_mount_partition( Glib::ustring mountpoint, bool * succes, Glib::ustring * error ) ;
- void thread_toggle_swap( bool * succes, Glib::ustring * error ) ;
- void thread_toggle_lvm2_pv( bool * succes, Glib::ustring * error ) ;
- void thread_guess_partition_table();
+ void unmount_partition( bool * succes, Glib::ustring * error );
//signal handlers
void open_operationslist() ;
@@ -260,6 +255,7 @@ private:
//stuff for progress overview and pulsebar
bool pulsebar_pulse();
+ sigc::connection pulsetimer;
};
} //GParted
diff --git a/src/Dialog_Progress.cc b/src/Dialog_Progress.cc
index 9ce9c89..08a0fe9 100644
--- a/src/Dialog_Progress.cc
+++ b/src/Dialog_Progress.cc
@@ -219,10 +219,7 @@ void Dialog_Progress::on_signal_show()
//and start..
pulsetimer = Glib::signal_timeout().connect( sigc::mem_fun(*this, &Dialog_Progress::pulsebar_pulse), 100 );
- Glib::Thread::create( sigc::mem_fun(
- *this, &Dialog_Progress::thread_apply_operation ),
- false );
- Gtk::Main::run();
+ succes = signal_apply_operation.emit( operations[t] );
pulsetimer.disconnect();
//set status (succes/error) for this operation
@@ -300,18 +297,6 @@ void Dialog_Progress::on_cell_data_description( Gtk::CellRenderer * renderer, co
static_cast<Gtk::TreeRow>( *iter )[ treeview_operations_columns .operation_description ] ;
}
-static bool _mainquit( void *dummy )
-{
- Gtk::Main::quit();
- return false;
-}
-
-void Dialog_Progress::thread_apply_operation()
-{
- succes = signal_apply_operation.emit( operations[t] );
- g_idle_add( (GSourceFunc)_mainquit, NULL );
-}
-
void Dialog_Progress::on_cancel()
{
Gtk::MessageDialog dialog( *this,
diff --git a/src/FileSystem.cc b/src/FileSystem.cc
index 8b02404..bd2193d 100644
--- a/src/FileSystem.cc
+++ b/src/FileSystem.cc
@@ -17,12 +17,15 @@
#include "../include/FileSystem.h"
+#include "../include/GParted_Core.h"
#include <cerrno>
+#include <iostream>
+#include <gtkmm/main.h>
namespace GParted
{
-
+
FileSystem::FileSystem()
{
}
@@ -48,44 +51,71 @@ const Glib::ustring FileSystem::get_generic_text( CUSTOM_TEXT ttype, int index )
}
}
-int FileSystem::execute_command( const Glib::ustring & command, OperationDetail & operationdetail )
+void FileSystem::store_exit_status( GPid pid, int status )
{
- operationdetail .add_child( OperationDetail( command, STATUS_NONE, FONT_BOLD_ITALIC ) ) ;
-
- int exit_status = Utils::execute_command( "nice -n 19 " + command, output, error ) ;
-
- if ( ! output .empty() )
- operationdetail .get_last_child() .add_child( OperationDetail( output, STATUS_NONE, FONT_ITALIC ) ) ;
-
- if ( ! error .empty() )
- operationdetail .get_last_child() .add_child( OperationDetail( error, STATUS_NONE, FONT_ITALIC ) ) ;
-
- return exit_status ;
+ exit_status = status;
+ running = false;
+ if (pipecount == 0) // pipes finished first
+ Gtk::Main::quit();
+ Glib::spawn_close_pid( pid );
}
-//Time command, add results to operation detail and by default set success or failure
-int FileSystem::execute_command_timed( const Glib::ustring & command
- , OperationDetail & operationdetail
- , bool check_status )
+int FileSystem::execute_command( const Glib::ustring & command, OperationDetail & operationdetail, bool checkstatus )
{
- operationdetail .add_child( OperationDetail( command, STATUS_EXECUTE, FONT_BOLD_ITALIC ) ) ;
-
- int exit_status = Utils::execute_command( "nice -n 19 " + command, output, error ) ;
- if ( check_status )
- {
- if ( ! exit_status )
- operationdetail .get_last_child() .set_status( STATUS_SUCCES ) ;
+ operationdetail .add_child( OperationDetail( command, checkstatus ? STATUS_EXECUTE : STATUS_NONE, FONT_BOLD_ITALIC ) ) ;
+ Glib::Pid pid;
+ // set up pipes for capture
+ int out, err;
+ // spawn external process
+ running = true;
+ try {
+ Glib::spawn_async_with_pipes(
+ std::string(),
+ Glib::shell_parse_argv( command ),
+ Glib::SPAWN_DO_NOT_REAP_CHILD | Glib::SPAWN_SEARCH_PATH,
+ sigc::slot< void >(),
+ &pid,
+ 0,
+ &out,
+ &err );
+ } catch (Glib::SpawnError &e) {
+ std::cerr << e.what() << std::endl;
+ operationdetail.get_last_child().add_child(
+ OperationDetail( e.what(), STATUS_ERROR, FONT_ITALIC ) );
+ return 1;
+ }
+ Glib::signal_child_watch().connect( sigc::mem_fun( *this, &FileSystem::store_exit_status ), pid );
+ output.clear();
+ error.clear();
+ pipecount = 2;
+ PipeCapture outputcapture( out, output );
+ PipeCapture errorcapture( err, error );
+ outputcapture.eof.connect( sigc::mem_fun( *this, &FileSystem::execute_command_eof ) );
+ errorcapture.eof.connect( sigc::mem_fun( *this, &FileSystem::execute_command_eof ) );
+ Gtk::Main::run();
+
+ if (checkstatus) {
+ if ( !exit_status )
+ operationdetail.get_last_child().set_status( STATUS_SUCCES );
else
- operationdetail .get_last_child() .set_status( STATUS_ERROR ) ;
+ operationdetail .get_last_child().set_status( STATUS_ERROR );
}
+ if ( !output.empty() )
+ operationdetail.get_last_child().add_child(
+ OperationDetail( output, STATUS_NONE, FONT_ITALIC ) );
+ if ( !error.empty() )
+ operationdetail.get_last_child().add_child(
+ OperationDetail( error, STATUS_NONE, FONT_ITALIC ) );
+
+ return exit_status;
+}
- if ( ! output .empty() )
- operationdetail .get_last_child() .add_child( OperationDetail( output, STATUS_NONE, FONT_ITALIC ) ) ;
-
- if ( ! error .empty() )
- operationdetail .get_last_child() .add_child( OperationDetail( error, STATUS_NONE, FONT_ITALIC ) ) ;
-
- return exit_status ;
+void FileSystem::execute_command_eof()
+{
+ if (--pipecount)
+ return; // wait for second pipe to eof
+ if ( !running ) // already got exit status
+ Gtk::Main::quit();
}
//Create uniquely named temporary directory and add results to operation detail
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 7bc6a89..40fd6d2 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -56,6 +56,7 @@
#include <dirent.h>
#include <mntent.h>
#include <gtkmm/messagedialog.h>
+#include <gtkmm/main.h>
std::vector<Glib::ustring> libparted_messages ; //see ped_exception_handler()
@@ -137,6 +138,22 @@ void GParted_Core::set_user_devices( const std::vector<Glib::ustring> & user_dev
void GParted_Core::set_devices( std::vector<Device> & devices )
{
+ Glib::Thread::create( sigc::bind(
+ sigc::mem_fun( *this, &GParted_Core::set_devices_thread ),
+ &devices),
+ false );
+ Gtk::Main::run();
+}
+
+static bool _mainquit( void *dummy )
+{
+ Gtk::Main::quit();
+ return false;
+}
+
+void GParted_Core::set_devices_thread( std::vector<Device> * pdevices )
+{
+ std::vector<Device> &devices = *pdevices;
devices .clear() ;
Device temp_device ;
Proc_Partitions_Info pp_info( true ) ; //Refresh cache of proc partition information
@@ -292,6 +309,7 @@ void GParted_Core::set_devices( std::vector<Device> & devices )
//NOTE that we cannot clear mountinfo since it might be needed in get_all_mountpoints()
set_thread_status_message("") ;
fstab_info .clear() ;
+ g_idle_add( (GSourceFunc)_mainquit, NULL );
}
// runs gpart on the specified parameter
@@ -3351,7 +3369,7 @@ struct ped_exception_ctx {
static bool _ped_exception_handler( struct ped_exception_ctx *ctx )
{
- std::cout << ctx->e->message << std::endl;
+ std::cerr << ctx->e->message << std::endl;
libparted_messages.push_back( ctx->e->message );
char optcount = 0;
diff --git a/src/Utils.cc b/src/Utils.cc
index 76c87f5..60d7c21 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -17,6 +17,7 @@
*/
#include "../include/Utils.h"
+#include "../include/GParted_Core.h"
#include <sstream>
#include <fstream>
@@ -26,6 +27,7 @@
#include <uuid/uuid.h>
#include <cerrno>
#include <sys/statvfs.h>
+#include <gtkmm/main.h>
namespace GParted
@@ -269,7 +271,7 @@ bool Utils::kernel_supports_fs( const Glib::ustring & fs )
return true ;
Glib::ustring output, error ;
- execute_command( "modprobe " + fs, output, error, true ) ;
+ execute_command( "modprobe " + fs, output, error, true );
input .open( "/proc/filesystems" ) ;
if ( input )
@@ -380,62 +382,98 @@ int Utils::execute_command( const Glib::ustring & command )
return execute_command( command, dummy, dummy ) ;
}
-int Utils::execute_command( const Glib::ustring & command,
- Glib::ustring & output,
- Glib::ustring & error,
- bool use_C_locale )
+class utils_execute_command_status
{
- int exit_status = -1 ;
- std::string std_out, std_error ;
-
- try
+public:
+ bool running;
+ int pipecount;
+ int exit_status;
+ bool foreground;
+ Glib::Threads::Mutex mutex;
+ Glib::Threads::Cond cond;
+ void store_exit_status( GPid pid, int status );
+ void execute_command_eof();
+};
+
+void utils_execute_command_status::store_exit_status( GPid pid, int status )
+{
+ exit_status = status;
+ running = false;
+ if (pipecount == 0) // pipes finished first
{
- std::vector<std::string>argv;
- argv .push_back( "sh" ) ;
- argv .push_back( "-c" ) ;
- argv .push_back( command ) ;
-
- if ( use_C_locale )
- {
- //Spawn command using the C language environment
- std::vector<std::string> envp ;
- envp .push_back( "LC_ALL=C" ) ;
- envp .push_back( "PATH=" + Glib::getenv( "PATH" ) ) ;
-
- Glib::spawn_sync( "."
- , argv
- , envp
- , Glib::SPAWN_SEARCH_PATH
- , sigc::slot<void>()
- , &std_out
- , &std_error
- , &exit_status
- ) ;
- }
- else
- {
- //Spawn command inheriting the parent's environment
- Glib::spawn_sync( "."
- , argv
- , Glib::SPAWN_SEARCH_PATH
- , sigc::slot<void>()
- , &std_out
- , &std_error
- , &exit_status
- ) ;
+ if (foreground)
+ Gtk::Main::quit();
+ else {
+ mutex.lock();
+ cond.signal();
+ mutex.unlock();
}
}
- catch ( Glib::Exception & e )
- {
- error = e .what() ;
+ Glib::spawn_close_pid( pid );
+}
- return -1 ;
+void utils_execute_command_status::execute_command_eof()
+{
+ if (--pipecount)
+ return; // wait for second pipe to eof
+ if ( !running ) // already got exit status
+ {
+ if (foreground)
+ Gtk::Main::quit();
+ else {
+ mutex.lock();
+ cond.signal();
+ mutex.unlock();
+ }
}
+}
- output = Utils::cleanup_cursor( std_out ) ;
- error = std_error ;
-
- return exit_status ;
+int Utils::execute_command( const Glib::ustring & command,
+ Glib::ustring & output,
+ Glib::ustring & error,
+ bool use_C_locale )
+{
+ Glib::Pid pid;
+ // set up pipes for capture
+ int out, err;
+ utils_execute_command_status status;
+ // spawn external process
+ status.running = true;
+ status.pipecount = 2;
+ status.foreground = (Glib::Thread::self() == GParted_Core::mainthread);
+ try {
+ Glib::spawn_async_with_pipes(
+ std::string(),
+ Glib::shell_parse_argv( command ),
+ Glib::SPAWN_DO_NOT_REAP_CHILD | Glib::SPAWN_SEARCH_PATH,
+ sigc::slot< void >(),
+ &pid,
+ 0,
+ &out,
+ &err );
+ } catch (Glib::SpawnError &e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+ Glib::signal_child_watch().connect( sigc::mem_fun(
+ status, &utils_execute_command_status::store_exit_status ),
+ pid );
+ output.clear();
+ error.clear();
+ PipeCapture outputcapture( out, output );
+ PipeCapture errorcapture( err, error );
+ outputcapture.eof.connect( sigc::mem_fun(
+ status, &utils_execute_command_status::execute_command_eof ));
+ errorcapture.eof.connect( sigc::mem_fun(
+ status, &utils_execute_command_status::execute_command_eof ));
+
+ if( status.foreground)
+ Gtk::Main::run();
+ else {
+ status.mutex.lock();
+ status.cond.wait( status.mutex );
+ }
+ return status.exit_status;
}
Glib::ustring Utils::regexp_label( const Glib::ustring & text
@@ -701,4 +739,37 @@ bool Utils::get_kernel_version( int & major_ver, int & minor_ver, int & patch_ve
return success ;
}
+PipeCapture::PipeCapture( int fd, Glib::ustring &string ) : buff( string )
+{
+ // tie fd to string
+ // make channel
+ channel = Glib::IOChannel::create_from_fd( fd );
+ connection = Glib::signal_io().connect(
+ sigc::mem_fun( *this, &PipeCapture::OnReadable ),
+ fd,
+ Glib::IO_IN | Glib::IO_HUP | Glib::IO_ERR );
+}
+
+bool PipeCapture::OnReadable( Glib::IOCondition condition )
+{
+ // read from pipe and store in buff
+ Glib::ustring str;
+ Glib::IOStatus status = channel->read( str, 512 );
+ if (status == Glib::IO_STATUS_NORMAL)
+ {
+ buff += str;
+ return true;
+ }
+ if (status != Glib::IO_STATUS_EOF)
+ std::cerr << "Pipe IOChannel read failed" << std::endl;
+ // signal completion
+ eof();
+ return false;
+}
+
+PipeCapture::~PipeCapture()
+{
+ connection.disconnect();
+}
+
} //GParted..
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index 62ad11b..61e3802 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -621,8 +621,6 @@ bool Win_GParted::pulsebar_pulse()
void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
{
- sigc::connection pulsetimer;
-
pulsebar .show();
statusbar .push( status_message) ;
@@ -636,10 +634,13 @@ void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
// connect pulse update timer
pulsetimer = Glib::signal_timeout().connect( sigc::mem_fun(*this, &Win_GParted::pulsebar_pulse), 100 );
- Gtk::Main::run();
+}
+
+void Win_GParted::hide_pulsebar()
+{
pulsetimer.disconnect();
pulsebar .hide();
- statusbar .pop() ;
+ statusbar.remove_all_messages();
//enable all disabled stuff
toolbar_main .set_sensitive( true ) ;
@@ -1199,17 +1200,11 @@ void Win_GParted::on_show()
menu_gparted_refresh_devices() ;
}
-void Win_GParted::thread_refresh_devices()
-{
- gparted_core .set_devices( devices ) ;
- Gtk::Main::quit();
-}
-
void Win_GParted::menu_gparted_refresh_devices()
{
- Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_refresh_devices ), false );
-
show_pulsebar( _("Scanning all devices...") ) ;
+ gparted_core.set_devices( devices );
+ hide_pulsebar();
//check if current_device is still available (think about hotpluggable stuff like usbdevices)
if ( current_device >= devices .size() )
@@ -1981,7 +1976,7 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs )
}
}
-void Win_GParted::thread_unmount_partition( bool * succes, Glib::ustring * error )
+void Win_GParted::unmount_partition( bool * succes, Glib::ustring * error )
{
std::vector<Glib::ustring> errors, failed_mountpoints, mountpoints = gparted_core .get_all_mountpoints() ;
Glib::ustring dummy ;
@@ -2013,63 +2008,15 @@ void Win_GParted::thread_unmount_partition( bool * succes, Glib::ustring * error
}
else
*error = "<i>" + Glib::build_path( "\n", errors ) + "</i>" ;
-
- Gtk::Main::quit();
}
-void Win_GParted::thread_mount_partition( Glib::ustring mountpoint, bool * succes, Glib::ustring * error )
-{
- Glib::ustring dummy ;
- std::vector<Glib::ustring> errors ;
-
- *succes = ! Utils::execute_command( "mount -v " + selected_partition .get_path() + " \"" + mountpoint + "\"",
- dummy,
- *error ) ;
- Gtk::Main::quit();
-}
-
-void Win_GParted::thread_toggle_swap( bool * succes, Glib::ustring * error )
-{
- Glib::ustring dummy ;
-
- if ( selected_partition .busy )
- *succes = ! Utils::execute_command( "swapoff -v " + selected_partition .get_path() + " && sync",
- dummy,
- *error ) ;
- else
- *succes = ! Utils::execute_command( "swapon -v " + selected_partition .get_path() + " && sync",
- dummy,
- *error ) ;
- Gtk::Main::quit();
-}
-
-void Win_GParted::thread_toggle_lvm2_pv( bool * success, Glib::ustring * error )
-{
- Glib::ustring dummy ;
-
- if ( selected_partition .busy )
- //VGNAME from mount point
- *success = ! Utils::execute_command( "lvm vgchange -a n " + selected_partition .get_mountpoint(),
- dummy,
- *error ) ;
- else
- *success = ! Utils::execute_command( "lvm vgchange -a y " + selected_partition .get_mountpoint(),
- dummy,
- *error ) ;
- Gtk::Main::quit();
-}
-
-// Runs gpart in a thread
-void Win_GParted::thread_guess_partition_table()
-{
- this->gpart_output="";
- this->gparted_core.guess_partition_table(devices[ current_device ], this->gpart_output);
- Gtk::Main::quit();
-}
-
void Win_GParted::toggle_busy_state()
{
int operation_count = partition_in_operation_queue_count( selected_partition ) ;
+ bool success = false ;
+ Glib::ustring error ;
+ Glib::ustring output;
+
if ( operation_count > 0 )
{
//Note that this situation will only occur when trying to swapon a partition
@@ -2112,20 +2059,22 @@ void Win_GParted::toggle_busy_state()
return ;
}
- bool succes = false ;
- Glib::ustring error ;
-
if ( selected_partition .filesystem == GParted::FS_LINUX_SWAP )
{
- Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
- sigc::mem_fun( *this, &Win_GParted::thread_toggle_swap ), &succes, &error ), false );
-
show_pulsebar(
String::ucompose(
selected_partition .busy ? _("Deactivating swap on %1") : _("Activating swap on %1"),
selected_partition .get_path() ) ) ;
-
- if ( ! succes )
+ if ( selected_partition .busy )
+ success = ! Utils::execute_command( "swapoff -v " + selected_partition .get_path(),
+ output,
+ error );
+ else
+ success = ! Utils::execute_command( "swapon -v " + selected_partition .get_path(),
+ output,
+ error );
+ hide_pulsebar();
+ if ( ! success )
{
Gtk::MessageDialog dialog(
*this,
@@ -2142,17 +2091,24 @@ void Win_GParted::toggle_busy_state()
}
else if ( selected_partition .filesystem == GParted::FS_LVM2_PV )
{
- Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
- sigc::mem_fun( *this, &Win_GParted::thread_toggle_lvm2_pv ), &succes, &error ), false );
-
show_pulsebar(
String::ucompose(
selected_partition .busy ? _("Deactivating Volume Group %1")
: _("Activating Volume Group %1"),
//VGNAME from mount point
selected_partition .get_mountpoint() ) ) ;
+ if ( selected_partition .busy )
+ //VGNAME from mount point
+ success = ! Utils::execute_command( "lvm vgchange -a n " + selected_partition .get_mountpoint(),
+ output,
+ error );
+ else
+ success = ! Utils::execute_command( "lvm vgchange -a y " + selected_partition .get_mountpoint(),
+ output,
+ error );
+ hide_pulsebar();
- if ( ! succes )
+ if ( ! success )
{
Gtk::MessageDialog dialog(
*this,
@@ -2170,12 +2126,10 @@ void Win_GParted::toggle_busy_state()
}
else if ( selected_partition .busy )
{
- Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
- sigc::mem_fun( *this, &Win_GParted::thread_unmount_partition ), &succes, &error ), false );
-
show_pulsebar( String::ucompose( _("Unmounting %1"), selected_partition .get_path() ) ) ;
-
- if ( ! succes )
+ unmount_partition( &success, &error );
+ hide_pulsebar();
+ if ( ! success )
{
Gtk::MessageDialog dialog( *this,
String::ucompose( _("Could not unmount %1"), selected_partition .get_path() ),
@@ -2222,21 +2176,19 @@ void Win_GParted::activate_mount_partition( unsigned int index )
return ;
}
- bool succes = false ;
+ bool success = false ;
Glib::ustring error ;
-
- Glib::Thread::create( sigc::bind<Glib::ustring, bool *, Glib::ustring *>(
- sigc::mem_fun( *this, &Win_GParted::thread_mount_partition ),
- selected_partition .get_mountpoints()[ index ],
- &succes,
- &error ),
- false );
+ Glib::ustring stdout;
show_pulsebar( String::ucompose( _("mounting %1 on %2"),
selected_partition .get_path(),
selected_partition .get_mountpoints()[ index ] ) ) ;
-
- if ( ! succes )
+ success = !Utils::execute_command( "mount -v " + selected_partition .get_path() + " \"" +
+ selected_partition.get_mountpoints()[ index ] + "\"",
+ stdout,
+ error ) ;
+ hide_pulsebar();
+ if ( ! success )
{
Gtk::MessageDialog dialog( *this,
String::ucompose( _("Could not mount %1 on %2"),
@@ -2375,11 +2327,11 @@ void Win_GParted::activate_attempt_rescue_data()
messageDialog.hide();
- Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_guess_partition_table ), false );
-
/*TO TRANSLATORS: looks like Searching for file systems on /deb/sdb */
show_pulsebar(String::ucompose( _("Searching for file systems on %1"), devices[ current_device ] .get_path()));
-
+ gpart_output="";
+ gparted_core.guess_partition_table(devices[ current_device ], gpart_output);
+ hide_pulsebar();
Dialog_Rescue_Data dialog;
dialog .set_transient_for( *this );
diff --git a/src/btrfs.cc b/src/btrfs.cc
index e7b5c11..e3d11ce 100644
--- a/src/btrfs.cc
+++ b/src/btrfs.cc
@@ -195,7 +195,8 @@ bool btrfs::resize( const Partition & partition_new, OperationDetail & operation
if ( mount_point .empty() )
return false ;
- success &= ! execute_command_timed( "mount -v -t btrfs " + partition_new .get_path() + " " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "mount -v -t btrfs " + partition_new .get_path() + " " + mount_point,
+ operationdetail, true ) ;
if ( success )
{
@@ -210,7 +211,7 @@ bool btrfs::resize( const Partition & partition_new, OperationDetail & operation
cmd = "btrfs filesystem resize " + size + " " + mount_point ;
else
cmd = "btrfsctl -r " + size + " " + mount_point ;
- exit_status = execute_command_timed( cmd, operationdetail, false ) ;
+ exit_status = execute_command( cmd, operationdetail, false ) ;
bool resize_succeeded = ( exit_status == 0 ) ;
if ( resize_to_same_size_fails )
{
@@ -235,7 +236,7 @@ bool btrfs::resize( const Partition & partition_new, OperationDetail & operation
operationdetail .get_last_child() .set_status( resize_succeeded ? STATUS_SUCCES : STATUS_ERROR ) ;
success &= resize_succeeded ;
- success &= ! execute_command_timed( "umount -v " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + mount_point, operationdetail, true ) ;
}
rm_temp_dir( mount_point, operationdetail ) ;
diff --git a/src/jfs.cc b/src/jfs.cc
index d938903..5d8cbf0 100644
--- a/src/jfs.cc
+++ b/src/jfs.cc
@@ -160,15 +160,15 @@ bool jfs::resize( const Partition & partition_new, OperationDetail & operationde
if ( mount_point .empty() )
return false ;
- success &= ! execute_command_timed( "mount -v -t jfs " + partition_new .get_path() + " " + mount_point,
- operationdetail ) ;
+ success &= ! execute_command( "mount -v -t jfs " + partition_new .get_path() + " " + mount_point,
+ operationdetail, true ) ;
if ( success )
{
- success &= ! execute_command_timed( "mount -v -t jfs -o remount,resize " + partition_new .get_path() + " " + mount_point,
- operationdetail ) ;
+ success &= ! execute_command( "mount -v -t jfs -o remount,resize " + partition_new .get_path() + " " + mount_point,
+ operationdetail, true ) ;
- success &= ! execute_command_timed( "umount -v " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + mount_point, operationdetail, true ) ;
}
rm_temp_dir( mount_point, operationdetail ) ;
diff --git a/src/nilfs2.cc b/src/nilfs2.cc
index 250fb17..1256cd2 100644
--- a/src/nilfs2.cc
+++ b/src/nilfs2.cc
@@ -163,8 +163,8 @@ bool nilfs2::resize( const Partition & partition_new, OperationDetail & operatio
if ( mount_point .empty() )
return false ;
- success &= ! execute_command_timed( "mount -v -t nilfs2 " + partition_new .get_path() + " " + mount_point,
- operationdetail ) ;
+ success &= ! execute_command( "mount -v -t nilfs2 " + partition_new .get_path() + " " + mount_point,
+ operationdetail, true ) ;
if ( success )
{
@@ -175,9 +175,9 @@ bool nilfs2::resize( const Partition & partition_new, OperationDetail & operatio
partition_new .get_sector_length(), partition_new .sector_size, UNIT_KIB ) ) ) + "K" ;
cmd += " " + size ;
}
- success &= ! execute_command_timed( cmd, operationdetail ) ;
+ success &= ! execute_command( cmd, operationdetail, true ) ;
- success &= ! execute_command_timed( "umount -v " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + mount_point, operationdetail, true ) ;
}
rm_temp_dir( mount_point, operationdetail ) ;
diff --git a/src/xfs.cc b/src/xfs.cc
index a03782a..0d74b55 100644
--- a/src/xfs.cc
+++ b/src/xfs.cc
@@ -175,14 +175,14 @@ bool xfs::resize( const Partition & partition_new, OperationDetail & operationde
if ( mount_point .empty() )
return false ;
- success &= ! execute_command_timed( "mount -v -t xfs " + partition_new .get_path() + " " + mount_point,
- operationdetail ) ;
+ success &= ! execute_command( "mount -v -t xfs " + partition_new .get_path() + " " + mount_point,
+ operationdetail, true ) ;
if ( success )
{
- success &= ! execute_command_timed( "xfs_growfs " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "xfs_growfs " + mount_point, operationdetail, true ) ;
- success &= ! execute_command_timed( "umount -v " + mount_point, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + mount_point, operationdetail, true ) ;
}
rm_temp_dir( mount_point, operationdetail ) ;
@@ -204,7 +204,7 @@ bool xfs::copy( const Glib::ustring & src_part_path,
{
bool success = true ;
- success &= ! execute_command_timed( "mkfs.xfs -f " + dest_part_path, operationdetail ) ;
+ success &= ! execute_command( "mkfs.xfs -f " + dest_part_path, operationdetail, true ) ;
if ( ! success )
return false ;
@@ -219,24 +219,24 @@ bool xfs::copy( const Glib::ustring & src_part_path,
return false ;
}
- success &= ! execute_command_timed( "mount -v -t xfs -o noatime,ro " + src_part_path +
- " " + src_mount_point, operationdetail ) ;
+ success &= ! execute_command( "mount -v -t xfs -o noatime,ro " + src_part_path +
+ " " + src_mount_point, operationdetail, true ) ;
if ( success )
{
- success &= ! execute_command_timed( "mount -v -t xfs " + dest_part_path +
- " " + dest_mount_point, operationdetail ) ;
+ success &= ! execute_command( "mount -v -t xfs " + dest_part_path +
+ " " + dest_mount_point, operationdetail, true ) ;
if ( success )
{
- success &= ! execute_command_timed( "xfsdump -J - " + src_mount_point +
- " | xfsrestore -J - " + dest_mount_point,
- operationdetail ) ;
+ success &= ! execute_command( "xfsdump -J - " + src_mount_point +
+ " | xfsrestore -J - " + dest_mount_point,
+ operationdetail, true ) ;
- success &= ! execute_command_timed( "umount -v " + dest_part_path, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + dest_part_path, operationdetail, true ) ;
}
- success &= ! execute_command_timed( "umount -v " + src_part_path, operationdetail ) ;
+ success &= ! execute_command( "umount -v " + src_part_path, operationdetail, true ) ;
}
rm_temp_dir( dest_mount_point, operationdetail ) ;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]