ML Reference
MeVis/Foundation/Sources/ML/include/host/mlPageRequest.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //-------------------------------------------------------------------------
00009 //-------------------------------------------------------------------------
00010 #ifndef __mlPageRequest_H
00011 #define __mlPageRequest_H
00012 
00013 // ML-includes
00014 #ifndef __mlInitSystemML_H
00015 #include "mlInitSystemML.h"
00016 #endif
00017 
00018 #include "mlPagedImage.h"
00019 
00020 ML_START_NAMESPACE
00021 
00022 class TileRequest;
00023 class PageRequestQueueInterface;
00024 
00025 //-------------------------------------------------------------------------------------------
00028 //-------------------------------------------------------------------------------------------
00029 class PageRequest
00030 {
00031 public:
00033   static PageRequest* allocate();
00034 
00036   static void deallocate(PageRequest* request);
00037 
00039   static void clearFreeList();
00040 
00041 private:
00042   PageRequest();
00043 
00045   void cleanup();
00046 
00048   PageRequest* _freeListNext;
00049 
00051   static PageRequest* _freeListHead;
00053   static Mutex        _freeListMutex;
00054 
00055 public:
00056 
00058   void init(PagedImage* outputImage, MLint pageId, int processingScope);
00059 
00060   //------------------------------------------------------
00062 
00063   //------------------------------------------------------
00064 
00068   void createInputTileRequests();
00069 
00074   void addNeededBy(TileRequest* request) {
00075     _neededByTiles.push_back(request);
00076   }
00077 
00079   bool tileRequestFinished();
00080 
00082   inline bool isNeededByTiles() { return _neededByTiles.size()!=0; }
00083 
00085 
00086   //------------------------------------------------------
00088 
00089   //------------------------------------------------------
00090 
00093   bool isReadyForProcessing();
00094 
00097   MLErrorCode runCalculateOutputSubImage(UserThreadData* userThreadData);
00098 
00101   void copyPageToTileRequests(PageRequestQueueInterface& queue);
00102 
00104   PagedImage* getPagedImage() { return _image; }
00105 
00107   MLint getPageId() { return _pageId; }
00108 
00110   int getProcessingScope() const  { return _processingScope; }
00111 
00113 
00114   //------------------------------------------------------
00116 
00117   //------------------------------------------------------
00118 
00121   void propagateErrorUpwards(MLErrorCode error);
00122 
00126   bool propagateCancellationDownIfRequestNotNeededAnymore();
00127 
00129   void collectPageRequestsWithErrors(std::set<PageRequest*>& result);
00130 
00132   bool hasError() const { return _error!=ML_RESULT_OK; }
00133 
00135   void setError(MLErrorCode error) { _error = error; }
00136 
00138   MLErrorCode getError() { return _error; }
00139 
00141 
00142 protected:
00144   void freeInputTiles();
00145 
00147   friend class PageRequestCursor;
00148 
00150   std::vector <TileRequest*> _inputTiles;
00152   int                        _inputTilesNeeded;
00153 
00154   // TODO: replace with atomic counter of _inputTilesNeeded
00155   Mutex                      _inputTilesNeededMutex;
00156 
00158   int                        _totalInputTilesNeeded;
00159 
00161   int                        _traversalCursorPosition;
00163   int                        _traversalCreatedTiles;
00164 
00166   MLMemoryBlockHandle        _page;
00168   PagedImage*                _image;
00170   MLint                      _pageId;
00171 
00173   MLErrorCode _error;
00174 
00176   int _processingScope;
00177 
00179   std::vector <TileRequest*> _neededByTiles;
00180 
00182   bool _needsToBeRemovedFromPagedImage;
00183 };
00184 
00185 
00186 ML_END_NAMESPACE
00187 
00188 #endif //of __mlPageRequest_H
00189