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