LAMA
/home/brandes/workspace/LAMA/src/lama/Context.hpp
Go to the documentation of this file.
00001 
00035 #ifndef LAMA_CONTEXT_HPP_
00036 #define LAMA_CONTEXT_HPP_
00037 
00038 // for dll_import
00039 #include <lama/config.hpp>
00040 
00041 // base classes
00042 #include <lama/Printable.hpp>
00043 #include <lama/NonCopyable.hpp>
00044 
00045 #include <lama/LAMATypes.hpp>
00046 
00047 // logging
00048 #include <logging/logging.hpp>
00049 
00050 // boost
00051 #include <boost/shared_ptr.hpp>
00052 #include <boost/function.hpp>
00053 
00054 namespace lama
00055 {
00056 
00057 class SyncToken;  // forward declaration
00058 
00059 class Context;  // forward declaration
00060 
00063 typedef boost::shared_ptr<const Context> ContextPtr;
00064 
00077 class LAMA_DLL_IMPORTEXPORT Context : public Printable,
00078                                       private NonCopyable
00079 {
00080 public:
00081 
00090     enum ContextType { Host,        
00091                        CUDA,        
00092                        OpenCL,      
00093 //                       NewContext,  //!< can be used for any new device
00094                        MaxContext   
00095                     };
00096 
00097     struct LAMA_DLL_IMPORTEXPORT ContextData : private NonCopyable
00098     {
00099         enum AccessKind
00100         {
00101             Read,            
00102             Write,           
00103             MaxAccessKind    
00104         };
00105 
00106         ContextPtr          context;   
00107 
00108         void*               pointer;   
00109 
00110         size_t              size;      
00111 
00112         bool                allocated; 
00113 
00114         bool                valid;     
00115 
00116         unsigned char       lock[MaxAccessKind]; 
00117 
00120         ContextData( ContextPtr context );
00121 
00122         ~ContextData();
00123 
00126         void allocate( const size_t size );
00127 
00130         void setRef( void* reference, const size_t size );
00131 
00139         void realloc( const size_t newSize, const size_t saveSize );
00140 
00143         void free();
00144 
00145         bool isPinned() const;
00146 
00147         void setPinned() const;
00148 
00149         void setCleanFunction( boost::function<void( void* )> cleanFunktion ) const;
00150 
00151     private:
00152 
00153         mutable bool pinned;
00154 
00155         mutable boost::function<void( void* )> mCleanFunktion;
00156 
00157         ContextData();   // disable default constructor
00158     };
00159 
00160     virtual ~Context();
00161 
00164     ContextType getType() const { return mContextType; }
00165 
00170     bool operator==(const Context& other) const;
00171 
00174     bool operator!=(const Context& other) const;
00175 
00182     virtual bool canUseData(const Context& other) const = 0;
00183 
00188     virtual void writeAt( std::ostream& stream ) const;
00189 
00196     //virtual void* allocate( const size_t size ) const = 0;
00197 
00205     virtual void allocate( ContextData& contextData, const size_t size ) const = 0;
00206 
00215     virtual void free( void* pointer, const size_t size ) const = 0;
00216 
00224     virtual void free( ContextData& contextData ) const = 0;
00225 
00235     virtual void memcpy( void* dst, const void* src, const size_t size ) const = 0;
00236 
00237     virtual std::auto_ptr<SyncToken> memcpyAsync( void* dst, const void* src, const size_t size ) const = 0;
00238 
00245     virtual bool cancpy( const ContextData& dst, const ContextData& src ) const =0;
00246 
00260     virtual void memcpy( ContextData& dst, const ContextData& src, const size_t size ) const = 0;
00261 
00262     virtual std::auto_ptr<SyncToken> memcpyAsync( ContextData& dst, const ContextData& src, const size_t size ) const = 0;
00263 
00266     virtual std::auto_ptr<SyncToken> getSyncToken() const = 0;
00267 
00277     virtual void enable( const char* file, int line ) const;
00278 
00283     virtual void disable( const char* file, int line ) const;
00284 
00287     const class LAMAInterface& getInterface() const;
00288 
00289 protected:
00290 
00293     Context( ContextType type );
00294 
00295     LAMA_LOG_DECL_STATIC_LOGGER(logger);
00296 
00297     ContextType mContextType;
00298 
00299     mutable bool mEnabled;       
00300 
00301     mutable const char* mFile;   
00302 
00303     mutable int mLine;           
00304 };
00305 
00308 typedef Context::ContextType ContextType;
00309 
00310 LAMA_DLL_IMPORTEXPORT std::ostream& operator<<(std::ostream& stream, const ContextType type);
00311 
00312 }
00313 
00314 #endif // LAMA_CONTEXT_HPP_