示例#1
0
	virtual void run(void *arg)
	{
		Event ev;
		if(isCollect)
		{
			EventAnswer *answ = ev.triggerAndCollect(name, buf, bufSize);
			EventMessage msg(name, waitId, answ);
			int msgLen;
			char *msgBuf = msg.serialize(msgLen, msgManager);
			msgManager->sendMessage(addr, msgBuf, msgLen);
			delete []msgBuf;
			delete answ;
			Thread *thread = (Thread *)arg;
			delete thread;
		}
		else
		{
			ev.triggerAndWait(name, buf, bufSize);
			EventMessage msg(name, waitId);
			int msgLen;
			char *msgBuf = msg.serialize(msgLen, msgManager);
			msgManager->sendMessage(addr, msgBuf, msgLen);
			delete []msgBuf;
			Thread *thread = (Thread *)arg;
			delete thread;
		}
	}
bool Resources::fileExists(const string &path, InstanceID instanceId, const shared_ptr<Query>& query)
{
    LOG4CXX_TRACE(logger, "Resources::fileExists. Checking file '" << path << "'");
    NetworkManager* networkManager = NetworkManager::getInstance();

    if (instanceId == query->getInstanceID())
    {
        LOG4CXX_TRACE(logger, "Resources::fileExists. Instance id " << instanceId << " is local instance. Returning result.");
        return checkFileExists(path);
    }
    else
    {
        LOG4CXX_TRACE(logger, "Resources::fileExists. Instance id " << instanceId << " is remote instance. Requesting result.");
        FileExistsResourcesCollector* collector = new FileExistsResourcesCollector();
        uint64_t id = 0;
        {
            ScopedMutexLock lock(_lock);
            id = ++_lastResourceCollectorId;
            _resourcesCollectors[id] = collector;
        }

        shared_ptr<MessageDesc> msg = make_shared<MessageDesc>(mtResourcesFileExistsRequest);
        shared_ptr<scidb_msg::ResourcesFileExistsRequest> request =
            msg->getRecord<scidb_msg::ResourcesFileExistsRequest>();
        msg->setQueryID(0);
        request->set_resource_request_id(id);
        request->set_file_path(path);
        networkManager->sendMessage(instanceId, msg);

        LOG4CXX_TRACE(logger, "Resources::fileExists. Waiting while instance return result for collector " << id);

        try
        {
           Semaphore::ErrorChecker errorChecker = bind(&Query::validateQueryPtr, query);
           collector->_collectorSem.enter(1, errorChecker);
        }
        catch (...)
        {
            LOG4CXX_TRACE(logger, "Resources::fileExists. Waiting for result of collector " << id <<
                " interrupter by error");
            {
                ScopedMutexLock lock(_lock);
                delete _resourcesCollectors[id];
                _resourcesCollectors.erase(id);
            }
            throw;
        }

        LOG4CXX_TRACE(logger, "Resources::fileExists. Returning result of collector " << id);

        bool result;
        {
            ScopedMutexLock lock(_lock);
            result = ((FileExistsResourcesCollector*) _resourcesCollectors[id])->_instancesMap[instanceId];
            delete _resourcesCollectors[id];
            _resourcesCollectors.erase(id);
        }
        return result;
    }
}
void Resources::handleFileExists(const shared_ptr<MessageDesc>& messageDesc)
{
    NetworkManager* networkManager = NetworkManager::getInstance();

    if (mtResourcesFileExistsRequest == messageDesc->getMessageType())
    {
        LOG4CXX_TRACE(logger, "Message is mtResourcesFileExistsRequest");
        shared_ptr<scidb_msg::ResourcesFileExistsRequest> inMsgRecord =
            messageDesc->getRecord<scidb_msg::ResourcesFileExistsRequest>();
        const string& file = inMsgRecord->file_path();
        LOG4CXX_TRACE(logger, "Checking file " << file);

        shared_ptr<MessageDesc> msg = make_shared<MessageDesc>(mtResourcesFileExistsResponse);
        msg->setQueryID(0);

        shared_ptr<scidb_msg::ResourcesFileExistsResponse> outMsgRecord =
            msg->getRecord<scidb_msg::ResourcesFileExistsResponse>();
        outMsgRecord->set_resource_request_id(inMsgRecord->resource_request_id());
        outMsgRecord->set_exits_flag(Resources::getInstance()->checkFileExists(file));

        networkManager->sendMessage(messageDesc->getSourceInstanceID(), msg);
    }
    // mtResourcesFileExistsResponse
    else
    {
        LOG4CXX_TRACE(logger, "Message is mtResourcesFileExistsResponse");
        shared_ptr<scidb_msg::ResourcesFileExistsResponse> inMsgRecord =
            messageDesc->getRecord<scidb_msg::ResourcesFileExistsResponse>();

        LOG4CXX_TRACE(logger, "Marking file");
        Resources::getInstance()->markFileExists(
            inMsgRecord->resource_request_id(),
            messageDesc->getSourceInstanceID(),
            inMsgRecord->exits_flag());
    }
}