Commit 399b4b65 authored by hrchilds's avatar hrchilds
Browse files

Update from November 11, 2003

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@118 18c085ea-50e0-402c-830e-de6fd14e8384
parent 53d82746
......@@ -445,9 +445,9 @@ env command for configure.
#
# Build and install it in the visit directory.
#
gunzip visit031020.tar.gz
tar xf visit031020.tar
cd visit031020/config-site
gunzip visit031117.tar.gz
tar xf visit031117.tar
cd visit031117/config-site
echo VISITHOME=`cat ../../visitpath` > `hostname`.conf
cat Template.conf >> `hostname`.conf
cd ..
......@@ -456,11 +456,11 @@ make
clearcase_bin/visit-bin-dist
# Use the appropriate install command based on the operating system on
# which you built VisIt.
clearcase_bin/visit-install 1.2.3 aix `cat ../visitpath`
clearcase_bin/visit-install 1.2.3 irix6 `cat ../visitpath`
clearcase_bin/visit-install 1.2.3 linux `cat ../visitpath`
clearcase_bin/visit-install 1.2.3 osf1 `cat ../visitpath`
clearcase_bin/visit-install 1.2.3 sunos5 `cat ../visitpath`
clearcase_bin/visit-install 1.2.4 aix `cat ../visitpath`
clearcase_bin/visit-install 1.2.4 irix6 `cat ../visitpath`
clearcase_bin/visit-install 1.2.4 linux `cat ../visitpath`
clearcase_bin/visit-install 1.2.4 osf1 `cat ../visitpath`
clearcase_bin/visit-install 1.2.4 sunos5 `cat ../visitpath`
When running the configure script you can enable or disable certain dependent
packages. All the configure options are listed at the beginning of the
......
......@@ -17,7 +17,7 @@ Unix:
where
"version" will be 1.2.3 for the current distribution.
"version" will be 1.2.4 for the current distribution.
"platform" will be one of the following: aix, irix6, linux, osf1,
or sunos5 depending on the machine. The one you use should match
......@@ -28,17 +28,17 @@ Unix:
For example
visit-install 1.2.3 irix6 /usr/local/visit
visit-install 1.2.4 irix6 /usr/local/visit
will install the irix6, 1.2.3 version of visit in the directory
will install the irix6, 1.2.4 version of visit in the directory
"/usr/local/visit". Note that you will need to have the file
"visit1_2_3.irix6.tar.gz" present in the current directory for this
"visit1_2_4.irix6.tar.gz" present in the current directory for this
to function properly. You can install multiple binaries into the
same directory. For example, you could then execute
visit-install -a 1.2.3 linux /usr/local/visit
visit-install -a 1.2.4 linux /usr/local/visit
to add a linux, 1.2.3 version of visit to the same directory.
to add a linux, 1.2.4 version of visit to the same directory.
2. Add the bin directory below the installation directory
(/usr/local/visit/bin in our example) to each user's search path.
......@@ -76,15 +76,15 @@ Unix:
Windows:
1. Copy the file visit1.2.3.exe to your desktop.
1. Copy the file visit1.2.4.exe to your desktop.
2. Right click on the visit1.2.3.exe icon using your mouse and selecting
"Extract to folder C:\...\Desktop\visit1.2.3" from the popup menu. A
2. Right click on the visit1.2.4.exe icon using your mouse and selecting
"Extract to folder C:\...\Desktop\visit1.2.4" from the popup menu. A
window will popup as the file is extracted into the directory. Once
the process is complete a "visit1.2.3" directory icon should appear on
the process is complete a "visit1.2.4" directory icon should appear on
your desktop.
3. Double click on the "visit1.2.3" directory icon bringing up a file
3. Double click on the "visit1.2.4" directory icon bringing up a file
system browsing window.
4. Double click on the SETUP icon with the computer display icon to run
......
......@@ -16,7 +16,7 @@
<Field name="id" type="stringVector">Streamline_1.0 </Field>
<Field name="enabled" type="intVector">0 </Field>
</Object>
<Object name="HostProfileList" childObjects="17">
<Object name="HostProfileList" childObjects="21">
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">blue.llnl.gov</Field>
......@@ -193,6 +193,94 @@
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit </Field>
<Field name="parallel" type="bool">true</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">ilx.llnl.gov</Field>
<Field name="hostAliases" type="string">ilx#.llnl.gov ilx##.llnl.gov ilx# ilx##</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">1</Field>
<Field name="numNodesSet" type="bool">false</Field>
<Field name="numNodes" type="int">1</Field>
<Field name="partitionSet" type="bool">false</Field>
<Field name="partition" type="string"></Field>
<Field name="bankSet" type="bool">false</Field>
<Field name="bank" type="string"></Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">false</Field>
<Field name="launchMethod" type="string"></Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">true</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit </Field>
<Field name="parallel" type="bool">false</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">mcr.llnl.gov</Field>
<Field name="hostAliases" type="string">mcr#.llnl.gov mcr##.llnl.gov mcr###.llnl.gov mcr####.llnl.gov mcr# mcr## mcr### mcr####</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">1</Field>
<Field name="numNodesSet" type="bool">false</Field>
<Field name="numNodes" type="int">1</Field>
<Field name="partitionSet" type="bool">false</Field>
<Field name="partition" type="string"></Field>
<Field name="bankSet" type="bool">false</Field>
<Field name="bank" type="string"></Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">false</Field>
<Field name="launchMethod" type="string"></Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">true</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit </Field>
<Field name="parallel" type="bool">false</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel interactive pdebug</Field>
<Field name="host" type="string">mcr.llnl.gov</Field>
<Field name="hostAliases" type="string">mcr#.llnl.gov mcr##.llnl.gov mcr###.llnl.gov mcr####.llnl.gov mcr# mcr## mcr### mcr####</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">2</Field>
<Field name="numNodesSet" type="bool">true</Field>
<Field name="numNodes" type="int">1</Field>
<Field name="partitionSet" type="bool">true</Field>
<Field name="partition" type="string">pdebug</Field>
<Field name="bankSet" type="bool">false</Field>
<Field name="bank" type="string"></Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">true</Field>
<Field name="launchMethod" type="string">prun</Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">false</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit</Field>
<Field name="parallel" type="bool">true</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel batch pbatch</Field>
<Field name="host" type="string">mcr.llnl.gov</Field>
<Field name="hostAliases" type="string">mcr#.llnl.gov mcr##.llnl.gov mcr###.llnl.gov mcr####.llnl.gov mcr# mcr## mcr### mcr####</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">4</Field>
<Field name="numNodesSet" type="bool">true</Field>
<Field name="numNodes" type="int">2</Field>
<Field name="partitionSet" type="bool">true</Field>
<Field name="partition" type="string">mcr,pbatch</Field>
<Field name="bankSet" type="bool">true</Field>
<Field name="bank" type="string">bdivp</Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">true</Field>
<Field name="launchMethod" type="string">psub/prun</Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">false</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit</Field>
<Field name="parallel" type="bool">true</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">riptide.llnl.gov</Field>
......@@ -284,7 +372,7 @@
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">pengra.llnl.gov</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra# pengra## pengra###</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra###.llnl.gov pengra# pengra## pengra###</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">1</Field>
<Field name="numNodesSet" type="bool">false</Field>
......@@ -306,7 +394,7 @@
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel interactive pdebug</Field>
<Field name="host" type="string">pengra.llnl.gov</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra# pengra## pengra###</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra###.llnl.gov pengra# pengra## pengra###</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">2</Field>
<Field name="numNodesSet" type="bool">true</Field>
......@@ -328,7 +416,7 @@
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel batch pbatch</Field>
<Field name="host" type="string">pengra.llnl.gov</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra# pengra## pengra###</Field>
<Field name="hostAliases" type="string">pengra#.llnl.gov pengra##.llnl.gov pengra###.llnl.gov pengra# pengra## pengra###</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">4</Field>
<Field name="numNodesSet" type="bool">true</Field>
......@@ -350,7 +438,7 @@
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">pvc.llnl.gov</Field>
<Field name="hostAliases" type="string">pvc#.llnl.gov pvc##.llnl.gov pvc# pvc## pvc###</Field>
<Field name="hostAliases" type="string">pvc#.llnl.gov pvc##.llnl.gov pvc###.llnl.gov pvc# pvc## pvc###</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">1</Field>
<Field name="numNodesSet" type="bool">false</Field>
......@@ -372,7 +460,7 @@
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel pbatch</Field>
<Field name="host" type="string">pvc.llnl.gov</Field>
<Field name="hostAliases" type="string">pvc#.llnl.gov pvc##.llnl.gov pvc# pvc## pvc###</Field>
<Field name="hostAliases" type="string">pvc#.llnl.gov pvc##.llnl.gov pvc###.llnl.gov pvc# pvc## pvc###</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">4</Field>
<Field name="numNodesSet" type="bool">true</Field>
......
......@@ -8,6 +8,7 @@
#include <avtDataObjectWriter.h>
#include <avtExternallyRenderedImagesActor.h>
#include <avtImage.h>
#include <avtNullData.h>
#include <avtTerminatingSource.h>
#include <float.h>
......@@ -20,7 +21,7 @@
#include <vtkRenderer.h>
#include <vtkTIFFReader.h>
#include <BadIndexException.h>
#include <ImproperUseException.h>
#include <DebugStream.h>
#include <TimingsManager.h>
......@@ -39,6 +40,8 @@ avtExternallyRenderedImagesActor::avtExternallyRenderedImagesActor()
{
myMapper = vtkImageMapper::New();
dummyImage = vtkImageData::New();
lastNonDummyImage = NULL;
myMapper->SetInput(dummyImage);
myMapper->SetColorWindow(255);
myMapper->SetColorLevel(127);
myActor = vtkActor2D::New();
......@@ -69,6 +72,11 @@ avtExternallyRenderedImagesActor::~avtExternallyRenderedImagesActor()
myMapper->Delete();
myMapper = NULL;
}
if (lastNonDummyImage != NULL)
{
lastNonDummyImage->Delete();
lastNonDummyImage = NULL;
}
}
......@@ -154,26 +162,49 @@ avtExternallyRenderedImagesActor::PrepareForRender(void)
return;
// issue the external rendering callback
// we play a trick with initialization of dob to create a useful
// NULL-like pointer that we can distinguish from NULL itself
int n = 2;
avtDataObject_p dob = ref_ptr<avtDataObject>((avtDataObject*)1,&n);
// we use the dummyData 'value' to detect if dob was updated by the
// DoExternalRender call
avtNullData_p dummyData = new avtNullData(NULL);
avtDataObject_p dummyDob;
CopyTo(dummyDob, dummyData);
avtDataObject_p dob = dummyDob;
DoExternalRender(dob);
if ((*dob != NULL) && (*dob != (avtDataObject*)1) && !strcmp(dob->GetType(),"avtImage"))
if ((*dob != *dummyDob) && (*dob != NULL))
{
// we know this is really an avtImage object, so make one from it
// make sure we've recieved an image and not something else
if (strcmp(dob->GetType(),"avtImage") != 0)
{
EXCEPTION1(ImproperUseException, "Expected avtImage object");
}
// put up the new image
avtImage_p img;
CopyTo(img, dob);
avtImageRepresentation& imgRep = img->GetImage();
myMapper->SetInput(imgRep.GetImageVTK());
// update the last non dummy image
if (lastNonDummyImage != NULL)
{
lastNonDummyImage->Delete();
lastNonDummyImage = NULL;
}
lastNonDummyImage = imgRep.GetImageVTK();
lastNonDummyImage->Register(NULL);
}
else
{
// if we got back nothing, put up the dummy (blank) image
if (*dob == NULL)
myMapper->SetInput(dummyImage);
}
// if we got 'no-change' put up the last non dummy image
if (*dob == *dummyDob)
myMapper->SetInput(lastNonDummyImage);
}
}
......@@ -242,8 +273,7 @@ avtExternallyRenderedImagesActor::DisableExternalRenderRequests(void)
bool oldMode = makeExternalRenderRequests;
makeExternalRenderRequests = false;
SetVisibility(false);
myMapper->SetInput(dummyImage);
return oldMode ? false : true;
return oldMode;
}
// ****************************************************************************
......
......@@ -119,6 +119,7 @@ class PLOTTER_API avtExternallyRenderedImagesActor
vtkActor2D *myActor;
vtkImageMapper *myMapper;
vtkImageData *dummyImage;
vtkImageData *lastNonDummyImage;
VisCallbackWithDob *extRenderCallback;
void *extRenderCallbackArgs;
......
......@@ -918,6 +918,96 @@ ViewerEngineManager::LaunchMessage(const char *hostName) const
Warning(message);
}
// ****************************************************************************
// Method: ViewerEngineManager::ExternalRender
//
// Purpose:
// Sends various RPC's to engine(s) necessary to perform an external render
// request.
//
// Arguments:
// For each plot to be externally rendered, we have the following...
//
// pluginIDsList: the pluginID for the plot
// hostLists: the host of the engine where the plot will be computed
// plotIdsList: the network (or plot) id of the plot on the assoc. engine
// attsList: the attributes of the plot
//
// winAtts: window attributes for the window servicing the external
// render request.
// annotAtts: annotation attributes for the window servicing the external
// render request.
//
// shouldTurnOffScalableRendering: set to true if the engine has sent results
// back to the viewer indicating that scalable rendering is
// no longer required for this window.
// imgList: the list of images, one for each engine's render, returned
// to the caller.
//
// Programmer: Mark C. Miller
// Creation: November 11, 2003
//
// ****************************************************************************
bool
ViewerEngineManager::ExternalRender(std::vector<const char*> pluginIDsList,
stringVector hostsList,
intVector plotIdsList,
std::vector<const AttributeSubject *> attsList,
WindowAttributes winAtts,
AnnotationAttributes annotAtts,
bool& shouldTurnOffScalableRendering,
std::vector<avtImage_p>& imgList)
{
// container for per-engine vector of plot ids
std::map<std::string,std::vector<int> > perEnginePlotIds;
// send per-plot RPCs
for (int i = 0; i < plotIdsList.size(); i++)
{
if (!UpdatePlotAttributes(hostsList[i].c_str(),pluginIDsList[i],
plotIdsList[i],attsList[i]))
return false;
perEnginePlotIds[hostsList[i]].push_back(plotIdsList[i]);
}
int numEnginesToRender = perEnginePlotIds.size();
bool sendZBuffer = numEnginesToRender > 1 ? true : false;
// send per-engine RPCs
std::map<std::string,std::vector<int> >::iterator pos;
for (pos = perEnginePlotIds.begin(); pos != perEnginePlotIds.end(); pos++)
{
if (!SetWinAnnotAtts(pos->first.c_str(), &winAtts, &annotAtts))
return false;
avtDataObjectReader_p rdr = GetDataObjectReader(sendZBuffer, pos->first.c_str(), pos->second);
if (*rdr == NULL)
return false;
// check to see if engine decided that SR mode is no longer necessary
if (rdr->InputIs(AVT_NULL_IMAGE_MSG))
{
shouldTurnOffScalableRendering = true;
break;
}
// do some magic to update the network so we don't need the reader anymore
avtDataObject_p tmpDob = rdr->GetOutput();
avtPipelineSpecification_p spec =
tmpDob->GetTerminatingSource()->GetGeneralPipelineSpecification();
tmpDob->Update(spec);
// put the resultant image in the returned list
avtImage_p img;
CopyTo(img,tmpDob);
imgList.push_back(img);
}
return true;
}
// ****************************************************************************
// Method: ViewerEngineManager::GetDataObjectReader
//
......
......@@ -140,6 +140,15 @@ class VIEWER_API ViewerEngineManager : public ViewerServerManager,
void InterruptEngine(int index);
bool InExecute() const;
bool ExternalRender(std::vector<const char*> pluginIDsList,
stringVector hostsList,
intVector plotIdsList,
std::vector<const AttributeSubject *> attsList,
WindowAttributes winAtts,
AnnotationAttributes annotAtts,
bool& shouldTurnOfScalableRendering,
std::vector<avtImage_p>& imgList);
avtDataObjectReader_p GetDataObjectReader(ViewerPlot *const plot,
const int frame);
avtDataObjectReader_p UseDataObjectReader(ViewerPlot *const plot,
......
......@@ -5509,6 +5509,7 @@ ViewerWindow::SendScalableRenderingModeChangeMessage(bool newMode)
// Creation: Mon Nov 3 15:48:33 PST 2003
//
// ****************************************************************************
void
ViewerWindow::ClearLastExternalRenderRequest()
{
......@@ -5518,6 +5519,87 @@ ViewerWindow::ClearLastExternalRenderRequest()
lastExternalRenderRequest.attsList.clear();
}
// ****************************************************************************
// Method: ViewerWindow::UpdateLastExternalRenderRequest
//
// Purpose:
// Updates the last external render request info
//
// Programmer: Mark C. Miller
// Creation: November 10, 2003
//
// ****************************************************************************
void
ViewerWindow::UpdateLastExternalRenderRequest(
const ExternalRenderRequestInfo &newRequest)
{
lastExternalRenderRequest = newRequest;
}
// ****************************************************************************
// Method: ViewerWindow::CanSkipExternalRender
//
// Purpose:
// checks to see if anything in the external render request has really
// changed sucn that the image needs to be re-rendered and returns false
// if not, true otherwise.
//
// Programmer: Mark C. Miller
// Creation: November 10, 2003
//
// ****************************************************************************
bool
ViewerWindow::CanSkipExternalRender(const ExternalRenderRequestInfo& thisRequest) const
{
const ExternalRenderRequestInfo& lastRequest = lastExternalRenderRequest;
if (thisRequest.winAtts != lastRequest.winAtts)
return false;
if (thisRequest.annotAtts != lastRequest.annotAtts)
return false;
if ((thisRequest.plotIdsList.size() != 0) &&
(thisRequest.plotIdsList.size() != lastRequest.plotIdsList.size()))
return false;
for (int i = 0; i < thisRequest.plotIdsList.size(); i++)
{
// search for index of current plot in last list
int indexOfPlotInLastList = -1;
for (int j = 0; j < lastRequest.plotIdsList.size(); j++)
{
if (lastRequest.plotIdsList[j] == thisRequest.plotIdsList[i])
{
indexOfPlotInLastList = j;
break;
}
}
if (indexOfPlotInLastList == -1)
return false;
else
{
// compare plugin ids
if (thisRequest.pluginIDsList[i] != lastRequest.pluginIDsList[indexOfPlotInLastList])
return false;
// compare host names
if (thisRequest.hostsList[i] != lastRequest.hostsList[indexOfPlotInLastList])
return false;
// compare plot attributes
if (!thisRequest.attsList[i]->EqualTo(lastRequest.attsList[indexOfPlotInLastList]))
return false;
}
}
return true;
}
// Only place where ViewerWindow should need to talk to ViewerEngineManager
#include <ViewerEngineManager.h>
......@@ -5541,13 +5623,7 @@ ViewerWindow::ClearLastExternalRenderRequest()
void
ViewerWindow::ExternalRenderCallback(void *data, avtDataObject_p& dob)
{
static const char *me = "ViewerWindow::ExternalRenderCallback";
debug2 << "Entering " << me << endl;
ViewerWindow *win = (ViewerWindow *)data;
ViewerEngineManager *eMgr = ViewerEngineManager::Instance();
ExternalRenderRequestInfo &lastRequest = win->lastExternalRenderRequest;
ExternalRenderRequestInfo thisRequest;
// if we aren't currently in scalable rendering mode, we have nothing to do
......@@ -5567,131 +5643,66 @@ ViewerWindow::ExternalRenderCallback(void *data, avtDataObject_p& dob)
thisRequest.winAtts = win->GetWindowAttributes();
thisRequest.annotAtts = *(win->GetAnnotationAttributes());
// see if anything has really changed, release data where necessary
bool canSkipExternalRender = true;
{
if (thisRequest.winAtts != lastRequest.winAtts)
canSkipExternalRender = false;
if (thisRequest.annotAtts != lastRequest.annotAtts)
canSkipExternalRender = false;
if ((thisRequest.plotIdsList.size() != 0) &&
(thisRequest.plotIdsList.size() != lastRequest.plotIdsList.size()))
canSkipExternalRender = false;
// we don't break early so we can build a list of plots to release data on
for (int i = 0; i < thisRequest.plotIdsList.size(); i++)
{
// search for index of current plot in last list
int indexOfPlotInLastList = -1;
for (int j = 0; j < lastRequest.plotIdsList.size(); j++)
{
if (lastRequest.plotIdsList[j] == thisRequest.plotIdsList[i])
{
indexOfPlotInLastList = j;
break;
}
}
if (indexOfPlotInLastList == -1)
canSkipExternalRender = false;
else
{
bool shouldReleasePlot = false;
// compare plugin ids
if (thisRequest.pluginIDsList[i] != lastRequest.pluginIDsList[indexOfPlotInLastList])
shouldReleasePlot = true;
// compare host names
if (thisRequest.hostsList[i] != lastRequest.hostsList[indexOfPlotInLastList])
shouldReleasePlot = true;
// compare plot attributes