00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 #ifndef ACE_FILECACHE_H
00015 #define ACE_FILECACHE_H
00016 
00017 #include  "ace/pre.h"
00018 
00019 #include "ace/Mem_Map.h"
00020 
00021 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00022 # pragma once
00023 #endif 
00024 
00025 #include "ace/Hash_Map_Manager_T.h"
00026 #include "ace/Null_Mutex.h"
00027 #include "ace/Synch_Traits.h"
00028 #include "ace/RW_Thread_Mutex.h"
00029 #include "ace/OS_NS_sys_stat.h"
00030 
00031 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00032 
00033 enum ACE_Filecache_Flag
00034 {
00035   ACE_NOMAP = 0,
00036   ACE_MAPIT = 1
00037 };
00038 
00039 class ACE_Filecache_Object;
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 class ACE_Export ACE_Filecache_Handle
00074 {
00075   
00076   
00077   
00078   
00079   
00080   
00081   
00082   
00083   
00084   
00085   
00086   
00087   
00088   
00089   
00090   
00091 public:
00092 
00093 
00094 
00095   ACE_Filecache_Handle (const ACE_TCHAR *filename,
00096                         ACE_Filecache_Flag mapit = ACE_MAPIT);
00097 
00098 
00099 
00100 
00101 
00102 
00103   ACE_Filecache_Handle (const ACE_TCHAR *filename,
00104                         int size,
00105                         ACE_Filecache_Flag mapit = ACE_MAPIT);
00106 
00107 
00108   ~ACE_Filecache_Handle (void);
00109 
00110 
00111   void *address (void) const;
00112 
00113 
00114   ACE_HANDLE handle (void) const;
00115 
00116 
00117   int error (void) const;
00118 
00119 
00120   ACE_OFF_T size (void) const;
00121 
00122 protected:
00123 
00124   ACE_Filecache_Handle (void);
00125 
00126 
00127   void init (void);
00128 
00129 public:
00130 
00131   enum
00132   {
00133     ACE_SUCCESS = 0,
00134     ACE_ACCESS_FAILED,
00135     ACE_OPEN_FAILED,
00136     ACE_COPY_FAILED,
00137     ACE_STAT_FAILED,
00138     ACE_MEMMAP_FAILED,
00139     ACE_WRITE_FAILED
00140   };
00141 
00142 private:
00143 
00144   ACE_Filecache_Object *file_;
00145 
00146 
00147   ACE_HANDLE handle_;
00148 
00149   int mapit_;
00150 };
00151 
00152 typedef ACE_Hash_Map_Manager_Ex<const ACE_TCHAR *, ACE_Filecache_Object *, ACE_Hash<const ACE_TCHAR *>, ACE_Equal_To<const ACE_TCHAR *>, ACE_Null_Mutex>
00153         ACE_Filecache_Hash;
00154 
00155 typedef ACE_Hash_Map_Entry<const ACE_TCHAR *, ACE_Filecache_Object *> ACE_Filecache_Hash_Entry;
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 class ACE_Export ACE_Filecache
00166 {
00167 public:
00168 
00169   static ACE_Filecache *instance (void);
00170 
00171   ~ACE_Filecache (void);
00172 
00173 
00174 
00175   int find (const ACE_TCHAR *filename);
00176 
00177 
00178 
00179   ACE_Filecache_Object *fetch (const ACE_TCHAR *filename, int mapit = 1);
00180 
00181 
00182   ACE_Filecache_Object *remove (const ACE_TCHAR *filename);
00183 
00184 
00185   ACE_Filecache_Object *create (const ACE_TCHAR *filename, int size);
00186 
00187 
00188 
00189   ACE_Filecache_Object *finish (ACE_Filecache_Object *&new_file);
00190 
00191 protected:
00192   ACE_Filecache_Object *insert_i (const ACE_TCHAR *filename,
00193                                   ACE_SYNCH_RW_MUTEX &filelock,
00194                                   int mapit);
00195   ACE_Filecache_Object *remove_i (const ACE_TCHAR *filename);
00196   ACE_Filecache_Object *update_i (const ACE_TCHAR *filename,
00197                                   ACE_SYNCH_RW_MUTEX &filelock,
00198                                   int mapit);
00199 
00200 public:
00201 
00202   enum
00203   {
00204 
00205 
00206     ACE_DEFAULT_VIRTUAL_FILESYSTEM_TABLE_SIZE = 512,
00207 
00208 
00209 
00210     ACE_DEFAULT_VIRTUAL_FILESYSTEM_CACHE_SIZE = 20
00211   };
00212 
00213 protected:
00214 
00215   ACE_Filecache (void);
00216 
00217 private:
00218   ACE_OFF_T size_;
00219 
00220 
00221   ACE_Filecache_Hash hash_;
00222 
00223 
00224   static ACE_Filecache *cvf_;
00225 
00226   
00227   ACE_SYNCH_RW_MUTEX hash_lock_[ACE_DEFAULT_VIRTUAL_FILESYSTEM_TABLE_SIZE];
00228   ACE_SYNCH_RW_MUTEX file_lock_[ACE_DEFAULT_VIRTUAL_FILESYSTEM_TABLE_SIZE];
00229 };
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 class ACE_Export ACE_Filecache_Object
00240 {
00241 public:
00242   friend class ACE_Filecache;
00243 
00244 
00245   ACE_Filecache_Object (const ACE_TCHAR *filename,
00246                         ACE_SYNCH_RW_MUTEX &lock,
00247                         LPSECURITY_ATTRIBUTES sa = 0,
00248                         int mapit = 1);
00249 
00250 
00251   ACE_Filecache_Object (const ACE_TCHAR *filename,
00252                         ACE_OFF_T size,
00253                         ACE_SYNCH_RW_MUTEX &lock,
00254                         LPSECURITY_ATTRIBUTES sa = 0);
00255 
00256 
00257   ~ACE_Filecache_Object (void);
00258 
00259 
00260   int acquire (void);
00261 
00262 
00263   int release (void);
00264 
00265   
00266   int error (void) const;
00267   int error (int error_value,
00268              const ACE_TCHAR *s = ACE_TEXT ("ACE_Filecache_Object"));
00269 
00270 
00271   const ACE_TCHAR *filename (void) const;
00272 
00273 
00274   ACE_HANDLE handle (void) const;
00275 
00276 
00277   void *address (void) const;
00278 
00279 
00280   ACE_OFF_T size (void) const;
00281 
00282 
00283   int update (void) const;
00284 
00285 protected:
00286 
00287   ACE_Filecache_Object (void);
00288 
00289 
00290   void init (void);
00291 
00292 private:
00293 
00294   int error_i (int error_value,
00295                const ACE_TCHAR *s = ACE_TEXT ("ACE_Filecache_Object"));
00296 
00297 public:
00298 
00299   enum Creation_States
00300   {
00301     ACE_READING = 1,
00302     ACE_WRITING = 2
00303   };
00304 
00305   enum Error_Conditions
00306   {
00307     ACE_SUCCESS = 0,
00308     ACE_ACCESS_FAILED,
00309     ACE_OPEN_FAILED,
00310     ACE_COPY_FAILED,
00311     ACE_STAT_FAILED,
00312     ACE_MEMMAP_FAILED,
00313     ACE_WRITE_FAILED
00314   };
00315 
00316 private:
00317 
00318 
00319   ACE_TCHAR *tempname_;
00320   ACE_TCHAR filename_[MAXPATHLEN + 1];
00321 
00322 
00323   ACE_Mem_Map mmap_;
00324 
00325 
00326   ACE_HANDLE handle_;
00327 
00328 
00329   ACE_stat stat_;
00330   ACE_OFF_T size_;
00331 
00332 
00333   int action_;
00334   int error_;
00335 
00336 
00337   int stale_;
00338 
00339 
00340   LPSECURITY_ATTRIBUTES sa_;
00341 
00342 
00343   ACE_SYNCH_RW_MUTEX junklock_;
00344 
00345 
00346   ACE_SYNCH_RW_MUTEX &lock_;
00347 };
00348 
00349 ACE_END_VERSIONED_NAMESPACE_DECL
00350 
00351 #include  "ace/post.h"
00352 
00353 #endif