[gparted] Refactor device parsing logic into Proc_Partitions_Info class
- From: Curtis Gedak <gedakc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted] Refactor device parsing logic into Proc_Partitions_Info class
- Date: Tue, 7 Dec 2010 23:02:54 +0000 (UTC)
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]