[gparted] Refactor device parsing logic into Proc_Partitions_Info class



commit fd77e73c46f0a3f023b432202ce8ab2872f9aa69
Author: Curtis Gedak <gedakc gmail com>
Date:   Tue Dec 7 16:01:54 2010 -0700

    Refactor device parsing logic into Proc_Partitions_Info class
    
    The reason for refactoring is to simplify the large GParted_Core
    class, to help minimize disk reads, and to group the logic for
    processing the file /proc/partitions into a single logical class.

 include/Proc_Partitions_Info.h |    2 ++
 src/GParted_Core.cc            |   37 +++++++++----------------------------
 src/Proc_Partitions_Info.cc    |   32 +++++++++++++++++++++++++++++++-
 3 files changed, 42 insertions(+), 29 deletions(-)
---
diff --git a/include/Proc_Partitions_Info.h b/include/Proc_Partitions_Info.h
index 1f0c86a..9fe17d1 100644
--- a/include/Proc_Partitions_Info.h
+++ b/include/Proc_Partitions_Info.h
@@ -36,10 +36,12 @@ public:
 	Proc_Partitions_Info() ;
 	Proc_Partitions_Info( bool do_refresh ) ;
 	~Proc_Partitions_Info() ;
+	std::vector<Glib::ustring> get_device_paths() ;
 	std::vector<Glib::ustring> get_alternate_paths( const Glib::ustring & path ) ;
 private:
 	void load_proc_partitions_info_cache() ;
 	static bool proc_partitions_info_cache_initialized ;
+	static std::vector<Glib::ustring> device_paths_cache ;
 	static std::map< Glib::ustring, Glib::ustring > alternate_paths_cache ;
 };
 
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index f142cac..744f2f2 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -174,36 +174,17 @@ void GParted_Core::set_devices( std::vector<Device> & devices )
 		//        This was a problem with no floppy drive yet BIOS indicated one existed.
 		//        http://parted.alioth.debian.org/cgi-bin/trac.cgi/ticket/194
 		//
-		//try to find all available devices
-		std::ifstream proc_partitions( "/proc/partitions" ) ;
-		if ( proc_partitions )
+		//try to find all available devices if devices exist in /proc/partitions
+		std::vector<Glib::ustring> temp_devices = pp_info .get_device_paths() ;
+		if ( ! temp_devices .empty() )
 		{
-			//parse device names from /proc/partitions
-			std::string line ;
-			std::string device ;
-			while ( getline( proc_partitions, line ) )
+			//Try to find all devices in /proc/partitions
+			for (unsigned int k=0; k < temp_devices .size(); k++)
 			{
-				//Whole disk devices are the ones we want.
-				//Device names without a trailing digit refer to the whole disk.
-				device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+([^0-9]+)$") ;
-				//Recognize /dev/mmcblk* devices.
-				//E.g., device = /dev/mmcblk0, partition = /dev/mmcblk0p1
-				if ( device == "" )
-					device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(mmcblk[0-9]+)$") ;
-				//Device names that end with a #[^p]# are HP Smart Array Devices (disks)
-				//E.g., device = /dev/cciss/c0d0, partition = /dev/cciss/c0d0p1
-				if ( device == "" )
-					device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(.*[0-9]+[^p]{1}[0-9]+)$") ;
-				if ( device != "" )
-				{
-					//try to have libparted detect the device and add it to the list
-					device = "/dev/" + device;
-					/*TO TRANSLATORS: looks like Scanning /dev/sda */ 
-					set_thread_status_message( String::ucompose ( _("Scanning %1"), device ) ) ;
-					ped_device_get( device .c_str() ) ;
-				}
+				/*TO TRANSLATORS: looks like Scanning /dev/sda */
+				set_thread_status_message( String::ucompose ( _("Scanning %1"), temp_devices[ k ] ) ) ;
+				ped_device_get( temp_devices[ k ] .c_str() ) ;
 			}
-			proc_partitions .close() ;
 
 			//Try to find all swraid devices
 			if (swraid .is_swraid_supported() ) {
@@ -229,7 +210,7 @@ void GParted_Core::set_devices( std::vector<Device> & devices )
 		}
 		else
 		{
-			//file /proc/partitions doesn't exist so use libparted to probe devices
+			//No devices found in /proc/partitions so use libparted to probe devices
 			ped_device_probe_all();
 		}
 
diff --git a/src/Proc_Partitions_Info.cc b/src/Proc_Partitions_Info.cc
index 0595c01..f5490cc 100644
--- a/src/Proc_Partitions_Info.cc
+++ b/src/Proc_Partitions_Info.cc
@@ -24,6 +24,7 @@ namespace GParted
 
 //Initialize static data elements
 bool Proc_Partitions_Info::proc_partitions_info_cache_initialized = false ;
+std::vector<Glib::ustring> Proc_Partitions_Info::device_paths_cache ;
 std::map< Glib::ustring, Glib::ustring > Proc_Partitions_Info::alternate_paths_cache ;
 
 Proc_Partitions_Info::Proc_Partitions_Info()
@@ -54,6 +55,11 @@ Proc_Partitions_Info::~Proc_Partitions_Info()
 {
 }
 
+std::vector<Glib::ustring> Proc_Partitions_Info::get_device_paths()
+{
+	return device_paths_cache ;
+}
+
 std::vector<Glib::ustring> Proc_Partitions_Info::get_alternate_paths( const Glib::ustring & path ) 
 {
 	std::vector<Glib::ustring> paths ;
@@ -70,15 +76,38 @@ std::vector<Glib::ustring> Proc_Partitions_Info::get_alternate_paths( const Glib
 void Proc_Partitions_Info::load_proc_partitions_info_cache()
 {
 	alternate_paths_cache .clear();
+	device_paths_cache .clear() ;
 
 	//Initialize alternate_paths
-	std::string line ;
 	std::ifstream proc_partitions( "/proc/partitions" ) ;
 	if ( proc_partitions )
 	{
+		std::string line ;
+		std::string device ;
 		char c_str[4096+1] ;
 
 		while ( getline( proc_partitions, line ) )
+		{
+			//Build cache of disk devices.
+			//Whole disk devices are the ones we want.
+			//Device names without a trailing digit refer to the whole disk.
+			device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+([^0-9]+)$") ;
+			//Recognize /dev/mmcblk* devices.
+			//E.g., device = /dev/mmcblk0, partition = /dev/mmcblk0p1
+			if ( device == "" )
+				device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(mmcblk[0-9]+)$") ;
+			//Device names that end with a #[^p]# are HP Smart Array Devices (disks)
+			//E.g., device = /dev/cciss/c0d0, partition = /dev/cciss/c0d0p1
+			if ( device == "" )
+				device = Utils::regexp_label(line, "^[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(.*[0-9]+[^p]{1}[0-9]+)$") ;
+			if ( device != "" )
+			{
+				//add potential device to the list
+				device = "/dev/" + device;
+				device_paths_cache .push_back( device ) ;
+			}
+
+			//Build cache of potential alternate paths
 			if ( sscanf( line .c_str(), "%*d %*d %*d %4096s", c_str ) == 1 )
 			{
 				line = "/dev/" ; 
@@ -97,6 +126,7 @@ void Proc_Partitions_Info::load_proc_partitions_info_cache()
 				}
 			}
 
+		}
 		proc_partitions .close() ;
 	}
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]