Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ShMemory.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright (c) 2003 University of Waterloo Computer Graphics Laboratory
00004 // Project administrator: Michael D. McCool
00005 // Authors: Zheng Qin, Stefanus Du Toit, Kevin Moule, Tiberiu S. Popa,
00006 //          Michael D. McCool
00007 //
00008 // This software is provided 'as-is', without any express or implied
00009 // warranty. In no event will the authors be held liable for any damages
00010 // arising from the use of this software.
00011 //
00012 // Permission is granted to anyone to use this software for any purpose,
00013 // including commercial applications, and to alter it and redistribute it
00014 // freely, subject to the following restrictions:
00015 //
00016 // 1. The origin of this software must not be misrepresented; you must
00017 // not claim that you wrote the original software. If you use this
00018 // software in a product, an acknowledgment in the product documentation
00019 // would be appreciated but is not required.
00020 //
00021 // 2. Altered source versions must be plainly marked as such, and must
00022 // not be misrepresented as being the original software.
00023 //
00024 // 3. This notice may not be removed or altered from any source
00025 // distribution.
00027 #ifndef SHMEMORY_HPP
00028 #define SHMEMORY_HPP
00029 
00030 #include <list>
00031 #include <map>
00032 #include <utility>
00033 #include <string>
00034 #include "ShDllExport.hpp"
00035 #include "ShRefCount.hpp"
00036 #include "ShMemoryDep.hpp"
00037 
00038 namespace SH {
00039 
00044 class ShStorage;
00045 
00054 class
00055 SH_DLLEXPORT ShMemory : public ShRefCountable {
00056 public:
00057   virtual ~ShMemory();
00058 
00060   int timestamp() const;
00061 
00063   ShPointer<ShStorage> findStorage(const std::string& id);
00064 
00067   template<typename Functor>
00068   ShPointer<ShStorage> findStorage(const std::string& id, const Functor& f);
00069 
00071   void removeStorage(const ShPointer<ShStorage>& storage);
00072 
00074   void add_dep(ShMemoryDep* dep);
00075 
00077   void flush();
00078 
00079 protected:
00080   ShMemory();
00081   
00082 private:
00083   void updateTimestamp(int timestamp);
00084 
00085   void addStorage(const ShPointer<ShStorage>& storage);
00086 
00087   typedef std::list< ShPointer<ShStorage> > StorageList;
00088   StorageList m_storages;
00089   int m_timestamp;
00090 
00092   std::list<ShMemoryDep*> dependencies;
00093 
00094   friend class ShStorage;
00095 
00097   ShMemory& operator=(const ShMemory& other);
00099   ShMemory(const ShMemory& other);
00100 };
00101 
00102 typedef ShPointer<ShMemory> ShMemoryPtr;
00103 typedef ShPointer<const ShMemory> ShMemoryCPtr;
00104 
00116 class
00117 SH_DLLEXPORT ShTransfer {
00118 public:
00120   virtual bool transfer(const ShStorage* from, ShStorage* to) = 0;
00121 
00125   virtual int cost() = 0;
00126 
00127 protected:
00128   ShTransfer(const std::string& from, const std::string& to);
00129 
00130 private:
00131   
00133   ShTransfer(const ShTransfer& other);
00135   ShTransfer& operator=(const ShTransfer& other);
00136 };
00137 
00146 class
00147 SH_DLLEXPORT ShStorage : public ShRefCountable {
00148 public:
00149   ShStorage();
00150   virtual ~ShStorage();
00151 
00153   int timestamp() const;
00155   void setTimestamp(int timestamp);
00157   const ShMemory* memory() const;
00159   ShMemory* memory();
00160 
00165   void sync();
00166 
00169   void dirty();
00170   
00171   // Mark an upcoming write to this storage.
00173   void dirtyall();
00174   
00178   virtual std::string id() const = 0;
00179   
00182   static int cost(ShStorage* from, ShStorage* to);
00183 
00186   static bool transfer(ShStorage* from, ShStorage* to);
00187 
00189   static void addTransfer(const std::string& from,
00190                           const std::string& to,
00191                           ShTransfer* transfer);
00192 
00194   void orphan();
00195   
00196 protected:
00197   ShStorage(ShMemory* memory);
00198 
00199 private:
00200   ShMemory* m_memory;
00201   int m_timestamp;
00202 
00203   typedef std::map<std::pair<std::string, std::string>, ShTransfer*> TransferMap;
00204   static TransferMap* m_transfers;
00205 
00207   ShStorage(const ShStorage& other);
00209   ShStorage& operator=(const ShStorage& other);
00210 };
00211 
00212 typedef ShPointer<ShStorage> ShStoragePtr;
00213 typedef ShPointer<const ShStorage> ShStorageCPtr;
00214 
00221 class
00222 SH_DLLEXPORT ShHostStorage : public ShStorage {
00223 public:
00224   ShHostStorage(ShMemory* memory, int length); 
00225   ShHostStorage(ShMemory* memory, int length, void* data); 
00226 
00229   ~ShHostStorage();
00230 
00231   std::string id() const;
00232 
00234   int length() const;
00235 
00237   const void* data() const;
00239   void* data();
00240   
00241 private:
00242   int m_length; 
00243   void* m_data; 
00244 
00245   bool m_managed; 
00246 
00247   // NOT IMPLEMENTED
00248   ShHostStorage& operator=(const ShHostStorage& other);
00249   ShHostStorage(const ShHostStorage& other);
00250 };
00251 
00252 typedef ShPointer<ShHostStorage> ShHostStoragePtr;
00253 typedef ShPointer<const ShHostStorage> ShHostStorageCPtr;
00254 
00259 class
00260 SH_DLLEXPORT ShHostMemory : public ShMemory {
00261 public:
00262   ShHostMemory(int length);
00263   ShHostMemory(int length, void* data);
00264 
00265   ~ShHostMemory();
00266 
00267   ShHostStoragePtr hostStorage();
00268   ShPointer<const ShHostStorage> hostStorage() const;
00269 
00270 private:
00271   ShHostStoragePtr m_hostStorage;
00272   // NOT IMPLEMENTED
00273   ShHostMemory& operator=(const ShHostMemory& other);
00274   ShHostMemory(const ShHostMemory& other);
00275 };
00276 
00277 typedef ShPointer<ShHostMemory> ShHostMemoryPtr;
00278 typedef ShPointer<const ShHostMemory> ShHostMemoryCPtr;
00279 
00280 template<typename Functor>
00281 ShPointer<ShStorage> ShMemory::findStorage(const std::string& id, const Functor& f)
00282 {
00283   for (StorageList::iterator I = m_storages.begin(); I != m_storages.end(); ++I) {
00284     if ((*I)->id() == id && f(*I)) return *I;
00285   }
00286   return 0;
00287 }
00288 
00291 }
00292 
00293 #endif

Generated on Mon Jan 24 18:36:33 2005 for Sh by  doxygen 1.4.1