00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #ifndef STXXL_SIMDISK_FILE_HEADER
00014 #define STXXL_SIMDISK_FILE_HEADER
00015 
00016 #ifdef STXXL_BOOST_CONFIG
00017  #include <boost/config.hpp>
00018 #endif
00019 
00020 #ifndef BOOST_MSVC
00021 
00022 
00023 #include <cmath>
00024 #include <sys/mman.h>
00025 
00026 #include <stxxl/bits/io/ufs_file.h>
00027 
00028 
00029 __STXXL_BEGIN_NAMESPACE
00030 
00033 
00034  #define AVERAGE_SPEED (15 * 1024 * 1024)
00035 
00036 class DiskGeometry : private noncopyable
00037 {
00038     struct Zone
00039     {
00040         
00041         
00042         
00043         
00044         int first_sector;
00045         int sectors;
00046         double sustained_data_rate;             
00047         inline Zone(int _first_sector) : first_sector(_first_sector)
00048         { }                                     
00049 
00050         inline Zone(
00051             
00052             
00053             int _first_sector,
00054             int _sectors, double _rate) :
00055             
00056             
00057             first_sector(_first_sector),
00058             sectors(_sectors),
00059             sustained_data_rate(_rate)
00060         { }
00061     };
00062     struct ZoneCmp
00063     {
00064         inline bool operator () (const Zone & a, const Zone & b) const
00065         {
00066             return a.first_sector < b.first_sector;
00067         }
00068     };
00069 
00070 protected:
00071     int nsurfaces;
00072     int bytes_per_sector;
00073     double cmd_ovh;                     
00074     double seek_time;                   
00075     double rot_latency;                 
00076     double head_switch_time;            
00077     double cyl_switch_time;             
00078     double revolution_time;             
00079     double interface_speed;             
00080     std::set<Zone, ZoneCmp> zones;
00081 
00082     void add_zone(int & first_cyl, int last_cyl,
00083                   int sec_per_track, int & first_sect);
00084 
00085 public:
00086     inline DiskGeometry()
00087     { }
00088     double get_delay(stxxl::int64 offset, size_t size);                
00089 
00090     inline ~DiskGeometry()
00091     { }
00092 };
00093 
00094 
00095 class IC35L080AVVA07 : public DiskGeometry              
00096 {
00097 public:
00098     IC35L080AVVA07();
00099 };
00100 
00101 class sim_disk_request;
00102 
00105 class sim_disk_file : public ufs_file_base, public IC35L080AVVA07
00106 {
00107 public:
00113     inline sim_disk_file(const std::string & filename, int mode, int disk) : ufs_file_base(filename, mode, disk)
00114     {
00115         std::cout << "Please, make sure that '" << filename <<
00116         "' is resided on swap memory partition!" <<
00117         std::endl;
00118     }
00119     request_ptr aread(void * buffer, stxxl::int64 pos, size_t bytes,
00120                       completion_handler on_cmpl);
00121     request_ptr awrite(void * buffer, stxxl::int64 pos, size_t bytes,
00122                        completion_handler on_cmpl);
00123     void set_size(stxxl::int64 newsize);
00124 };
00125 
00126 
00128 class sim_disk_request : public ufs_request_base
00129 {
00130     friend class sim_disk_file;
00131 
00132 protected:
00133     inline sim_disk_request(sim_disk_file * f, void * buf, stxxl::int64 off,
00134                             size_t b, request_type t,
00135                             completion_handler on_cmpl) :
00136         ufs_request_base(f,
00137                          buf,
00138                          off,
00139                          b,
00140                          t,
00141                          on_cmpl)
00142     { }
00143     void serve();
00144 
00145 public:
00146     inline const char * io_type()
00147     {
00148         return "simdisk";
00149     }
00150 };
00151 
00153 
00154 __STXXL_END_NAMESPACE
00155 
00156 #endif // #ifndef BOOST_MSVC
00157 
00158 #endif // !STXXL_SIMDISK_FILE_HEADER