ML Reference
|
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