Text archives Help
- From: abhinav@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r927 - in trunk/fox/afr_demo/Engine: Control ImageTraversers/AFR
- Date: Sat, 11 Feb 2006 11:52:44 -0700 (MST)
Author: abhinav
Date: Sat Feb 11 11:52:42 2006
New Revision: 927
Modified:
trunk/fox/afr_demo/Engine/Control/AFRPipeline.cc
trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.cc
trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.h
Log:
added threadsafe version of finding a tile for a sample for the stafr
sampler.
Modified: trunk/fox/afr_demo/Engine/Control/AFRPipeline.cc
==============================================================================
--- trunk/fox/afr_demo/Engine/Control/AFRPipeline.cc (original)
+++ trunk/fox/afr_demo/Engine/Control/AFRPipeline.cc Sat Feb 11 11:52:42
2006
@@ -586,6 +586,7 @@
wait_for_transactions = false;
// Wait for all of the other processors to finish setup.
+ cout << "syncing in thread " << proc << endl;
//pipeline_setup_barrier.wait(numProcs);
outer_loop_barrier.wait(numProcs);
}
@@ -688,6 +689,7 @@
}
} // End of inner loop.
while(getCurrentTime()<end_time);
+ //cout << "tread " << proc << "finished loop " << innerloopcalls << " at
time " << getCurrentTime() << endl;
for(int index = 0;index < static_cast<int>(channels.size());index++)
{
Channel* channel = channels[index];
Modified: trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.cc
==============================================================================
--- trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.cc (original)
+++ trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.cc Sat Feb 11
11:52:42 2006
@@ -234,7 +234,7 @@
int top = rootheight;
int right = rootwidth;
int level = 0;
- while(!treenode[index].type==VALID_TILE)
+ while(!(treenode[index].type==VALID_TILE))
{
if(index>totalNodes)
{
@@ -275,6 +275,63 @@
return index;
}
+int KDTree::getTileforXYSafely(float x, float y)
+{
+ int index = 1;
+ int left = 0;
+ int bottom = 0;
+ int top = rootheight;
+ int right = rootwidth;
+ int level = 0;
+ bool done = false;
+ while(!done)
+ {
+ if(!treenode[index].beingUpdated && treenode[index].trylock())
+ done = (treenode[index].type==VALID_TILE);
+ else
+ return -1;
+ treenode[index].unlock();
+ if(done) break;
+
+ if(index>totalNodes)
+ {
+ cerr << "error: no valid tile found" << endl;
+ // I guess we should exit here
+ exit(1);
+ return 1;
+ }
+ if(level%2==0)
+ {
+ if(x<left+(right-left)/2)
+ {
+ right = left + (right-left)/2;
+ index *= 2;
+ }
+ else
+ {
+ left = left + (right-left)/2;
+ index = index*2 + 1;
+ }
+ }
+ else
+ {
+ if(y<bottom+(top-bottom)/2)
+ {
+ top = bottom + (top-bottom)/2;
+ index *= 2;
+ }
+ else
+ {
+ bottom = bottom + (top-bottom)/2;
+ index = index*2 + 1;
+ }
+ }
+ level++;
+ }
+
+ return index;
+}
+
// swap in an array, element pos1 with element pos2
void KDTree::swap_tiles(Tile *arrayptr, int pos1, int pos2)
{
@@ -1341,7 +1398,9 @@
}
if(!doingMasterTask)
{
- newsampleset->tileindex = getTileforXY(newsampleset->oldviewX,
newsampleset->oldviewY);
+ int tindex = getTileforXYSafely(newsampleset->oldviewX,
newsampleset->oldviewY);
+ if(tindex==-1) return 0;
+ newsampleset->tileindex = tindex;
if(!treenode[newsampleset->tileindex].beingUpdated
&& treenode[newsampleset->tileindex].trylock())
{
@@ -1366,7 +1425,9 @@
if(doingMasterTask) return 0;
// add to the valid tile containing the sampleset
- newsampleset->tileindex = getTileforXY(newsampleset->viewX,
newsampleset->viewY);
+ int tindex = getTileforXYSafely(newsampleset->viewX, newsampleset->viewY);
+ if(tindex==-1) return 0;
+ newsampleset->tileindex = tindex;
if (treenode[newsampleset->tileindex].type != VALID_TILE)
{
//cerr << "error: could not locate a valid tile for this sample set " <<
endl;
@@ -1416,7 +1477,9 @@
}
if(!doingMasterTask)
{
- newsampleset->tileindex = getTileforXY(newsampleset->oldviewX,
newsampleset->oldviewY);
+ int tindex = getTileforXYSafely(newsampleset->oldviewX,
newsampleset->oldviewY);
+ if(tindex==-1) return 0;
+ newsampleset->tileindex = getTileforXYSafely(newsampleset->oldviewX,
newsampleset->oldviewY);
if(!treenode[newsampleset->tileindex].beingUpdated
&& treenode[newsampleset->tileindex].trylock())
{
@@ -1441,7 +1504,9 @@
if(doingMasterTask) return 0;
// add to the valid tile containing the sampleset
- newsampleset->tileindex = getTileforXY(newsampleset->viewX,
newsampleset->viewY);
+ int tindex = getTileforXYSafely(newsampleset->viewX, newsampleset->viewY);
+ if(tindex==-1) return 0;
+ newsampleset->tileindex = tindex;
if (treenode[newsampleset->tileindex].type != VALID_TILE)
{
//cerr << "error: could not locate a valid tile for this sample set " <<
endl;
Modified: trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.h
==============================================================================
--- trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.h (original)
+++ trunk/fox/afr_demo/Engine/ImageTraversers/AFR/kdtree.h Sat Feb 11
11:52:42 2006
@@ -63,6 +63,7 @@
void updateMinMax(int index, float tilearea, unsigned int
samplingrate, Timestamp currenttime); // update the min/max when some tile
changes
inline int number_of_tiles() { return numVTarrayElems; }
int getTileforXY(float x, float y);
+ int getTileforXYSafely(float x, float y);
int writeToFile(FILE *fp, Timestamp currenttime, int samplingrate);
inline int getNumLevels()
{
- [MANTA] r927 - in trunk/fox/afr_demo/Engine: Control ImageTraversers/AFR, abhinav, 02/11/2006
Archive powered by MHonArc 2.6.16.