00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 #ifndef STXXL_UFSFILEBASE_HEADER
00016 #define STXXL_UFSFILEBASE_HEADER
00017 
00018 #include <stxxl/bits/io/iobase.h>
00019 
00020 
00021 __STXXL_BEGIN_NAMESPACE
00022 
00025 
00026 class ufs_request_base;
00027 
00029 class ufs_file_base : public file
00030 {
00031 protected:
00032     int file_des;          
00033     int mode_;             
00034     ufs_file_base(const std::string & filename, int mode, int disk);
00035 
00036 public:
00037     int get_file_des() const;
00038     ~ufs_file_base();
00039     stxxl::int64 size();
00040     void set_size(stxxl::int64 newsize);
00041     void lock();
00042 };
00043 
00045 class ufs_request_base : public request
00046 {
00047     friend class ufs_file_base;
00048 
00049 protected:
00050     
00051     enum { OP = 0, DONE = 1, READY2DIE = 2 };
00052     
00053     
00054     
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062     state _state;
00063     mutex waiters_mutex;
00064     std::set<onoff_switch *> waiters;
00065 
00066     ufs_request_base(
00067         ufs_file_base * f,
00068         void * buf,
00069         stxxl::int64 off,
00070         size_t b,
00071         request_type t,
00072         completion_handler on_cmpl);
00073     bool add_waiter(onoff_switch * sw);
00074     void delete_waiter(onoff_switch * sw);
00075     int nwaiters();             
00076     void check_aligning();
00077 
00078 public:
00079     virtual ~ufs_request_base();
00080     void wait();
00081     bool poll();
00082     const char * io_type();
00083 };
00084 
00086 
00087 __STXXL_END_NAMESPACE
00088 
00089 #endif // !STXXL_UFSFILEBASE_HEADER