00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef STXXL_MEM_FILE_HEADER
00014 #define STXXL_MEM_FILE_HEADER
00015
00016 #include <stxxl/bits/io/iobase.h>
00017
00018
00019 __STXXL_BEGIN_NAMESPACE
00020
00023
00025 class mem_file : public file
00026 {
00027 char * ptr;
00028 unsigned_type sz;
00029
00030 public:
00033 mem_file(
00034 int disk = -1);
00035 request_ptr aread(
00036 void * buffer,
00037 stxxl::int64 pos,
00038 size_t bytes,
00039 completion_handler on_cmpl);
00040 request_ptr awrite(
00041 void * buffer,
00042 stxxl::int64 pos,
00043 size_t bytes,
00044 completion_handler on_cmpl);
00045 char * get_ptr() const;
00046 ~mem_file();
00047 stxxl::int64 size();
00048 void set_size(stxxl::int64 newsize);
00049 void lock();
00050 void delete_region(int64 offset, unsigned_type size);
00051 };
00052
00054 class mem_request : public request
00055 {
00056 friend class mem_file;
00057
00058 protected:
00059
00060 enum { OP = 0, DONE = 1, READY2DIE = 2 };
00061
00062
00063
00064 state _state;
00065 mutex waiters_mutex;
00066 std::set<onoff_switch *> waiters;
00067
00068 mem_request(
00069 mem_file * f,
00070 void * buf,
00071 stxxl::int64 off,
00072 size_t b,
00073 request_type t,
00074 completion_handler on_cmpl);
00075 bool add_waiter(onoff_switch * sw);
00076 void delete_waiter(onoff_switch * sw);
00077 int nwaiters();
00078 void check_aligning();
00079 void serve();
00080
00081 public:
00082 virtual ~mem_request();
00083 void wait();
00084 bool poll();
00085 const char * io_type();
00086 };
00087
00089
00090 __STXXL_END_NAMESPACE
00091
00092 #endif // !STXXL_MEM_FILE_HEADER