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