示例#1
0
LLCurl::Multi::~Multi()
{
	llassert(isStopped());

	if (LLCurl::sMultiThreaded)
	{
		LLCurl::Easy::sMultiMutex->lock();
	}

	delete mSignal;
	mSignal = NULL;

	// Clean up active
	for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
		iter != mEasyActiveList.end(); ++iter)
	{
		Easy* easy = *iter;
		check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
		delete easy;
	}
	mEasyActiveList.clear();
	mEasyActiveMap.clear();
	
	// Clean up freed
	for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());	
	mEasyFreeList.clear();

	check_curl_multi_code(curl_multi_cleanup(mCurlMultiHandle));
	--gCurlMultiCount;

	if (LLCurl::sMultiThreaded)
	{
		LLCurl::Easy::sMultiMutex->unlock();
	}
}
示例#2
0
文件: llcurl.cpp 项目: HizWylder/GIS
S32 LLCurl::Multi::process()
{
	if(!isValid())
	{
		return 0 ;
	}

	waitToComplete() ;

	if (getState() != STATE_COMPLETED)
	{
		return 0;
	}

	CURLMsg* msg;
	int msgs_in_queue;

	S32 processed = 0;
	while ((msg = info_read(&msgs_in_queue)))
	{
		++processed;
		if (msg->msg == CURLMSG_DONE)
		{
			U32 response = 0;
			Easy* easy = NULL ;

			{
				LLMutexLock lock(mEasyMutexp) ;
				easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
				if (iter != mEasyActiveMap.end())
				{
					easy = iter->second;
				}
			}

			if(easy)
			{
				response = easy->report(msg->data.result);
				removeEasy(easy);
			}
			else
			{
				response = 499;
				//*TODO: change to llwarns
				llerrs << "cleaned up curl request completed!" << llendl;
			}
			if (response >= 400)
			{
				// failure of some sort, inc mErrorCount for debugging and flagging multi for destruction
				++mErrorCount;
			}
		}
	}

	setState(STATE_READY);

	return processed;
}
示例#3
0
step SearchEngine::nextStep(int board[gridNum][gridNum], int state)
{
    step temp;
    if (id == 0)
    {
        Easy a;
        temp = a.nextStep(board,state);
    }
    return temp;

}
示例#4
0
void historical(const string& ticker, const gr::date& from, const gr::date& to, forward_list<pair<string,quote_>>& quotes)
{
  ostringstream sout;
  sout<< "http://ichart.yahoo.com/table.csv?" << "s=" << ticker << "&a=" << int(from.month()) - 1 << "&b=" << from.day() << "&c="
      << from.year() << "&d=" << int(to.month()) - 1 << "&e=" << to.day() << "&f=" << to.year() << "&g=d&ignore=.csv";

  Easy result;
  result.setOpt(Options::Url(sout.str()));
  ostringstream oss;
  oss<< result;
  istringstream iss(oss.str());

  parseQuotes(iss, quotes);
}
示例#5
0
void LLCurl::Multi::cleanup(bool deleted)
{
	if(!mCurlMultiHandle)
	{
		return ; //nothing to clean.
	}
	llassert_always(deleted || !mValid) ;

	LLMutexLock lock(mDeletionMutexp);
	
	// Clean up active
	for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
		iter != mEasyActiveList.end(); ++iter)
	{
		Easy* easy = *iter;
		check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));

		if(deleted)
		{
			easy->mResponder = NULL ; //avoid triggering mResponder.
		}
		delete easy;
	}
	mEasyActiveList.clear();
	mEasyActiveMap.clear();
	
	// Clean up freed
	for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());	
	mEasyFreeList.clear();

	check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));
	mCurlMultiHandle = NULL ;
	
	delete mMutexp ;
	mMutexp = NULL ;
	delete mEasyMutexp ;
	mEasyMutexp = NULL ;

	mQueued = 0 ;
	mState = STATE_COMPLETED;
	
	--gCurlMultiCount;

	return ;
}
示例#6
0
LLCurl::Easy* LLCurl::Multi::allocEasy()
{
    Easy* easy = 0;

    if (mEasyFreeList.empty())
    {
        easy = Easy::getEasy();
    }
    else
    {
        easy = *(mEasyFreeList.begin());
        mEasyFreeList.erase(easy);
    }
    if (easy)
    {
        mEasyActiveList.insert(easy);
        mEasyActiveMap[easy->getCurlHandle()] = easy;
    }
    return easy;
}
示例#7
0
LLCurl::Multi::~Multi()
{
    // Clean up active
    for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
            iter != mEasyActiveList.end(); ++iter)
    {
        Easy* easy = *iter;
        curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle());
        delete easy;
    }
    mEasyActiveList.clear();
    mEasyActiveMap.clear();

    // Clean up freed
    for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());
    mEasyFreeList.clear();

    curl_multi_cleanup(mCurlMultiHandle);
    --gCurlMultiCount;
}
示例#8
0
文件: llcurl.cpp 项目: HizWylder/GIS
void LLCurl::Multi::cleanup()
{
	if(!mCurlMultiHandle)
	{
		return ; //nothing to clean.
	}

	// Clean up active
	for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
		iter != mEasyActiveList.end(); ++iter)
	{
		Easy* easy = *iter;
		check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
		delete easy;
	}
	mEasyActiveList.clear();
	mEasyActiveMap.clear();
	
	// Clean up freed
	for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());	
	mEasyFreeList.clear();

	check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));
	mCurlMultiHandle = NULL ;

	delete mMutexp ;
	mMutexp = NULL ;
	delete mDeletionMutexp ;
	mDeletionMutexp = NULL ;
	delete mEasyMutexp ;
	mEasyMutexp = NULL ;
	
	mQueued = 0 ;
	mState = STATE_COMPLETED;
	
	--gCurlMultiCount;

	return ;
}
示例#9
0
S32 LLCurl::Multi::process()
{
    perform();

    CURLMsg* msg;
    int msgs_in_queue;

    S32 processed = 0;
    while ((msg = info_read(&msgs_in_queue)))
    {
        ++processed;
        if (msg->msg == CURLMSG_DONE)
        {
            U32 response = 0;
            easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
            if (iter != mEasyActiveMap.end())
            {
                Easy* easy = iter->second;
                response = easy->report(msg->data.result);
                removeEasy(easy);
            }
            else
            {
                response = 499;
                //*TODO: change to llwarns
                llerrs << "cleaned up curl request completed!" << llendl;
            }
            if (response >= 400)
            {
                // failure of some sort, inc mErrorCount for debugging and flagging multi for destruction
                ++mErrorCount;
            }
        }
    }
    return processed;
}