Exemplo n.º 1
0
WeakPtr<IPCClass> IPCManager::createClass(const char* name)
{
	if (!g_pmIPCClassList)
		throw gcException(ERR_IPC, "Class list is NULL");

	uint32 hash = UTIL::MISC::RSHash_CSTR(name);
	std::map<uint32, newClassFunc>::iterator it = g_pmIPCClassList->find(hash);

	if (it == g_pmIPCClassList->end())
		throw gcException(ERR_IPC, "Cant find class to create");

	uint32 id = 0;
	SmartPtr<IPCClass> ipcc;
	{
		Thread::AutoLock al(&m_ClassMutex);

		id = m_mClassId;

		if (m_bServer)
			m_mClassId++;
		else
			m_mClassId--;

		ipcc = SmartPtr<IPCClass>(it->second(this, id, m_uiItemId));
	}

	IPCScopedLock<IPCManager> lock(this, newLock());

	IPCCreateClass cc;
	cc.hash = hash;
	cc.id = id;
	cc.lock = lock->id;
	sendMessage( (const char*)&cc, sizeofStruct(&cc), 0, MT_CREATECLASS);

	lock->timedWait();

	SmartPtr<IPCParameterI> ret(lock->result);

	if (ret.get() == NULL)
	{
		throw gcException(ERR_IPC, "Return is NULL");
	}
	else if (ret->getType() == PException::getTypeS())
	{
		throw gcException((gcException*)getParameterValue<gcException*>(ret.get()));	
	}
	else if (!ret->getValue()) //should be bool
	{
		throw gcException(ERR_IPC, "Return value is false");
	}


	Thread::AutoLock al(&m_ClassMutex);
	m_vClassList.push_back(ipcc);

	return ipcc;
}
Exemplo n.º 2
0
void Thread::start()
{
    MutexLock newLock( m_Mutex );

    m_Handle = ( HANDLE )_beginthreadex( NULL, 0, ThreadWrapper, ( LPVOID )this, CREATE_SUSPENDED, &m_ID );

    SetThreadPriority( m_Handle, ConvertPriorityToNT_Priority( m_Priority ) );

    ResumeThread( m_Handle );


    m_State = RUNNING;
}
Exemplo n.º 3
0
IPCParameterI* IPCClass::callFunction(const char* name, bool async, std::vector<IPCParameterI*> &pList)
{
	IPCFunctionCall *fch;

	uint32 tsize;
	char* data = serializeList(pList, tsize);

	char* buff = new char[tsize + IPCFunctionCallSIZE];
	fch = (IPCFunctionCall*)buff;

	fch->size = tsize;
	fch->functionHash = UTIL::MISC::RSHash_CSTR(name);
	fch->numP = pList.size();
	memcpy(&fch->data, data, tsize );
	
	safe_delete(data);

	IPCParameterI* ret = NULL;

	if (async)
	{
		fch->id = 0;
		this->sendMessage(MT_FUNCTIONCALL_ASYNC, (const char*)fch, sizeofStruct(fch) );
		safe_delete(buff);

		ret = new PVoid();
	}
	else
	{	
		IPCScopedLock<IPCClass> lock(this, newLock());

		fch->id = lock->id;

		this->sendMessage(MT_FUNCTIONCALL, (const char*)fch, sizeofStruct(fch) );
		safe_delete(buff);

		//wait on mutex
		if (lock->wait(30, 0))
			throw gcException(ERR_IPC, "Waited too long with no response");

		ret = lock->result;
	}

	return ret;
}
Exemplo n.º 4
0
int StructureManager::declareResidence(CreatureObject* player,
		StructureObject* structureObject) {
	if (!structureObject->isBuildingObject()) {
		player->sendSystemMessage(
				"@player_structure:residence_must_be_building"); //Your declared residence must be a building.
		return 1;
	}

	PlayerObject* ghost = player->getPlayerObject();

	if (!player->checkCooldownRecovery("declare_residence") && !ghost->isPrivileged()) {
		Time* timeremaining = player->getCooldownTime("declare_residence");
		StringIdChatParameter params("player_structure",
				"change_residence_time"); //You cannot change residence for %NO hours.
		params.setTO(
				String::valueOf(
						ceil(timeremaining->miliDifference() / -3600000.f)));

		player->sendSystemMessage(params);
		return 1;
	}

	ManagedReference<BuildingObject*> buildingObject =
			cast<BuildingObject*>(structureObject);

	if (!buildingObject->isOwnerOf(player)) {
		player->sendSystemMessage("@player_structure:declare_must_be_owner"); //You must be the owner of the building to declare residence.
		return 1;
	}


	uint64 objectid = player->getObjectID();

	uint64 declaredOidResidence = ghost->getDeclaredResidence();

	ManagedReference<BuildingObject*> declaredResidence =
			server->getObject(declaredOidResidence).castTo<BuildingObject*>();
	ManagedReference<CityRegion*> cityRegion = buildingObject->getCityRegion();

	CityManager* cityManager = server->getCityManager();

	if (declaredResidence != NULL) {
		if (declaredResidence == buildingObject) {
			player->sendSystemMessage("@player_structure:already_residence"); //This building is already your residence.
			return 1;
		}

		ManagedReference<CityRegion*> residentCity =
				declaredResidence->getCityRegion();

		if (residentCity != NULL) {
			Locker lock(residentCity, player);

			if (residentCity->isMayor(objectid)) {
				player->sendSystemMessage("@city/city:mayor_residence_change"); //As a city Mayor, your residence is always the city hall of the city in which you are mayor.  You cannot declare a new residence.
				return 1;
			}

			cityManager->unregisterCitizen(residentCity, player);
		}

		player->sendSystemMessage("@player_structure:change_residence"); //You change your residence to this building.
	} else {
		player->sendSystemMessage("@player_structure:declared_residency"); //You have declared your residency here.
	}

	if (cityRegion != NULL) {
		Locker lock(cityRegion, player);

		if (cityRegion->isMayor(objectid) && structureObject != cityRegion->getCityHall()) {
			player->sendSystemMessage("@city/city:mayor_residence_change"); //As a city Mayor, your residence is always the city hall of the city in which you are mayor.  You cannot declare a new residence.
			return 1;
		}

		cityManager->registerCitizen(cityRegion, player);
	}

	//Set the characters home location to this structure.
	ghost->setDeclaredResidence(buildingObject);

	if(declaredResidence != NULL){
		Locker oldLock(declaredResidence, player);
		declaredResidence->setResidence(false);

	}

	Locker newLock(buildingObject,player);
	buildingObject->setResidence(true);

	player->addCooldown("declare_residence", 24 * 3600 * 1000); //1 day

	return 0;
}
Exemplo n.º 5
0
void Thread::setState( ThreadState newState )
{
    MutexLock newLock( m_Mutex );
    m_State = newState;
}
Exemplo n.º 6
0
gh::ThreadState Thread::getCurrentState()
{
    MutexLock newLock( m_Mutex );

    return m_State;
}