void TileBoundsCalculator::setImages(const cv::Mat& r1, const cv::Mat& r2)
{
  _r1 = r1;
  _r2 = r2;

  _calculateMin();

  _exportImage(_r1, "tmp/r1.png");
  _exportImage(_r2, "tmp/r2.png");
  _exportImage(_min, "tmp/min.png");
}
void TileBoundsCalculator::renderImage(shared_ptr<OsmMap> map)
{
  _envelope = map->calculateBounds();

  renderImage(map, _r1, _r2);

  _calculateMin();

  _exportImage(_r1, "tmp/r1.png");
  _exportImage(_r2, "tmp/r2.png");
  _exportImage(_min, "tmp/min.png");
}
예제 #3
0
unsigned int SipperProxyQueue::eventDequeueBlk(SipperProxyQueueData *outdata, unsigned int count, 
                                      unsigned int timeout, bool blockFlag)
{
   int oldstate;

   pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
   pthread_mutex_lock(&tEventQueueMutex);

   while(sleepingConsumers == MAX_QUEUE_THR && bQueueStopped == false)
   {
      waitingConsumers++;
      pthread_cond_wait(&waitingConsumerCond, &tEventQueueMutex);
      waitingConsumers--;
   }

   unsigned int ret = 0;
   t_EventQueueNodePtr currNode = NULL;

   int consumerIdx = -1;

   int alreadyTimedOut = 0; 
   int timeCalculated = 0;
   struct timespec WaitTime;

   do
   {
      //Logically this if condition should not be there. When the queue is 
      //stopped still deque should be successful till there are messages held in
      //queue. This condition will raise memory leak as consumers cant get the 
      //messages. Only reason I thought of why this condition was added is 
      //during shutdown we want the consumer to come out quickly- Suriya.
      //Now a CleanupFunction registeration is added to take care of the memory 
      //leak caused because of this condition.
      if(bQueueStopped == true)
      {
         break;
      }

      for(; ret < count; ret++)
      {
         if(ptHeadPtr != NULL)
         {
            currNode = ptHeadPtr;
            ptHeadPtr  = ptHeadPtr->ptNextNode;
            iQueueCount--;

            outdata[ret] = currNode->_queueData;

            if(iFreeNodes < highWaterMark)
            {
               currNode->ptNextNode = ptFreeList;
               ptFreeList = currNode;

               iFreeNodes++;
            }
            else
            {
               delete currNode;
            }

            if(ptHeadPtr == NULL)
            {
               ptTailPtr = NULL;
            }
         }
         else
         {
            break;
         }
      }

      if(ret == count || blockFlag == false)
      {
         break;
      }

      if(bQueueStopped == true)
      {
         pthread_cond_broadcast(&waitingConsumerCond);
         break;
      }

      if(consumerIdx == -1)
      {
         consumerIdx = _getFreeThr(consumerData);
      }

      if((count - ret) >= highWaterMark)
      {
         consumerData[consumerIdx].count = highWaterMark;
      }
      else
      {
         consumerData[consumerIdx].count = count - ret;
      }

      if(minConsumer != -1)
      {
         if(consumerData[minConsumer].count > consumerData[consumerIdx].count)
         {
            minConsumer = consumerIdx;
         }
      }
      else
      {
         minConsumer = consumerIdx;
      }

      //Queue is Empty.

      if(sleepingFeeders)
      {
         int locid = _calculateMax(feederData);

         pthread_cond_signal(&feederData[locid].condition);
      }

      if(alreadyTimedOut)
      {
         break;
      }

      sleepingConsumers++;

      if(timeout == 0)
      {
         pthread_cond_wait(&consumerData[consumerIdx].condition, 
                           &tEventQueueMutex);
      }
      else
      {
         if(timeCalculated == 0)
         {
            struct timeval currTime;

            gettimeofday(&currTime, NULL);

            WaitTime.tv_sec = currTime.tv_sec;
            WaitTime.tv_nsec = (currTime.tv_usec * 1000);

            WaitTime.tv_sec += (timeout / 1000);
            long millisec = timeout % 1000;
            WaitTime.tv_nsec += (millisec * 1000000);

            if(WaitTime.tv_nsec >= 1000000000L)
            {
               WaitTime.tv_nsec -= 1000000000L;
               WaitTime.tv_sec++;
            }

            timeCalculated = 1;
         }

         if(pthread_cond_timedwait(&consumerData[consumerIdx].condition,
                                &tEventQueueMutex, &WaitTime) == ETIMEDOUT)
         {
            alreadyTimedOut = 1;
         }
      }

      sleepingConsumers--;
   }while(1);

   if(consumerIdx != -1)
   {
      consumerData[consumerIdx].count = 0;

      if(minConsumer == consumerIdx)
      {
         minConsumer = _calculateMin(consumerData);
      }
   }

   if(sleepingFeeders)
   {
      if((feederData[minFeeder].count <= iFreeNodes) ||
         (iQueueCount <= lowWaterMark))
      {
         pthread_cond_signal(&feederData[minFeeder].condition);
      }
   }

   if(sleepingConsumers)
   {
      if(consumerData[minConsumer].count <= iQueueCount)
      {
         pthread_cond_signal(&consumerData[minConsumer].condition);
      }
   }

   if(waitingConsumers)
   {
      pthread_cond_signal(&waitingConsumerCond);
   }

   pthread_mutex_unlock(&tEventQueueMutex);
   pthread_setcancelstate(oldstate, NULL);
   return ret;
}
예제 #4
0
unsigned int SipperProxyQueue::eventEnqueueBlk(SipperProxyQueueData *indata, unsigned int count)
{
   int oldstate;

   pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
   pthread_mutex_lock(&tEventQueueMutex);

   if(bQueueStopped == true)
   {
      pthread_mutex_unlock(&tEventQueueMutex);
      pthread_setcancelstate(oldstate, NULL);
      return 0;
   }

   while(sleepingFeeders == MAX_QUEUE_THR && bQueueStopped == false)
   {
      waitingFeeders++;
      pthread_cond_wait(&waitingFeederCond, &tEventQueueMutex);
      waitingFeeders--;
   }

   unsigned int ret = 0;
   t_EventQueueNodePtr currNode = NULL;

   int feederIdx = -1;

   do
   {
      if(bQueueStopped == true)
      {
         break;
      }

      for(; ret < count; ret++)
      {
         if(ptFreeList != NULL)
         {
            currNode = ptFreeList;
            ptFreeList  = ptFreeList->ptNextNode;
            iFreeNodes--;
         }
         else
         {
            if(flowControlEnabled == false)
            {
               currNode = new t_EventQueueNode;
            }
            else
            {
               break;
            }
         }
   
         currNode->_queueData = indata[ret];
         currNode->ptNextNode = NULL;

         if(ptHeadPtr == NULL)
         {
            ptTailPtr = ptHeadPtr = currNode;
         }
         else
         {
            ptTailPtr->ptNextNode = currNode;
            ptTailPtr = currNode;
         }

         iQueueCount++;
      }

      if(ret == count)
      {
         break;
      }

      if(feederIdx == -1)
      {
         feederIdx = _getFreeThr(feederData);
      }

      if((count - ret) >= highWaterMark)
      {
         feederData[feederIdx].count = highWaterMark;
      }
      else
      {
         feederData[feederIdx].count = count - ret;
      }

      if(minFeeder != -1)
      {
         if(feederData[minFeeder].count > feederData[feederIdx].count)
         {
            minFeeder = feederIdx;
         }
      }
      else
      {
         minFeeder = feederIdx;
      }

      //Queue is Full.

      if(sleepingConsumers)
      {
         int locid = _calculateMax(consumerData);

         pthread_cond_signal(&consumerData[locid].condition);
      }

      sleepingFeeders++;
      pthread_cond_wait(&feederData[feederIdx].condition, &tEventQueueMutex);
      sleepingFeeders--;
   }while(1);

   if(feederIdx != -1)
   {
      feederData[feederIdx].count = 0;

      if(minFeeder == feederIdx)
      {
         minFeeder = _calculateMin(feederData);
      }
   }

   if(sleepingFeeders)
   {
      if((feederData[minFeeder].count <= iFreeNodes) ||
         (iQueueCount <= lowWaterMark))
      {
         pthread_cond_signal(&feederData[minFeeder].condition);
      }
   }

   if(sleepingConsumers)
   {
      if(consumerData[minConsumer].count <= iQueueCount)
      {
         pthread_cond_signal(&consumerData[minConsumer].condition);
      }
   }

   if(waitingFeeders)
   {
      pthread_cond_signal(&waitingFeederCond);
   }

   pthread_mutex_unlock(&tEventQueueMutex);
   pthread_setcancelstate(oldstate, NULL);
   return ret;
}