Esempio n. 1
0
Protocol* Server::request(Protocol &p) {
	int dataLen = 0;
	int fd = socketPool->getSocket();
	if (fd < 0) {
		markAsDead();
		return NULL;
	} else if (fd == 0) {
		return NULL;
	}
	char *data = p.getBytes(dataLen);
	int sessionId = p.getSessionID();
	int err = CSocket::sendData(fd, data, dataLen, sessionId);
	if (err < 0) {
		socketPool->closeSocket(fd);
		delete[] data;
		if (!test()) {
			markAsDead();
		}
		throw std::runtime_error("socket send data error\n");
	}
	socketPool->releaseSocket(fd);
	delete[] data;
	data = CSocket::receive(dataLen, sessionId, spp->getReceiveTimeout());
	Protocol *retP = Protocol::fromBytes(data, dataLen);
	if (retP == NULL) {
		errno = -2;
		throw std::runtime_error("Protocol is null\n");
	}
	if (this->state == SERVER_TESTING) {
		relive();
	}
	free(data);
	return retP;
}
Esempio n. 2
0
void KoulesSimulator::step(const ob::State *start, const oc::Control* control,
    const double t, ob::State *result)
{
    unsigned int ii;

    memcpy(&qcur_[0], start->as<KoulesStateSpace::StateType>()->values, numDimensions_ * sizeof(double));
    time_ = 0.;
    endTime_ = t;
    std::fill(dead_.begin(), dead_.end(), false);
    updateShip(control, t);
    for (unsigned int i = 0; i <= numKoules_; ++i)
    {
        ii = ind(i);
        dead_[i] = qcur_[ii] == -2. * kouleRadius;
        if (!dead_[i])
        {
            if (i)
                rungeKutta4(&qcur_[ii], t, &qnext_[ii]);
            qcur_[ii + 2] = (qnext_[ii    ] - qcur_[ii    ]) / t;
            qcur_[ii + 3] = (qnext_[ii + 1] - qcur_[ii + 1]) / t;
        }
    }
    initCollisionEvents();
    while (!collisionEvents_.empty())
    {
        CollisionEvent event = collisionEvents_.top();
        double ct = std::get<0>(event);
        unsigned int i = std::get<1>(event), j = std::get<2>(event);

        collisionEvents_.pop();
        advance(ct);
        if (j <= numKoules_)
            elasticCollision(i, j);
        else
        {
            markAsDead(i);
            if (i == 0)
            {
                memcpy(result->as<KoulesStateSpace::StateType>()->values, &qcur_[0], numDimensions_ * sizeof(double));
                return;
            }
        }

        for (unsigned int k = 0; k <= numKoules_ + 2; ++k)
        {
            if (k < i)
                computeCollisionEvent(k, i);
            else if (k > i && k != j)
                computeCollisionEvent(i, k);
            if (k < j && k != i)
                computeCollisionEvent(k, j);
            else if (k > j)
                computeCollisionEvent(j, k);
        }
    }
    advance(t);
    memcpy(result->as<KoulesStateSpace::StateType>()->values, &qcur_[0], numDimensions_ * sizeof(double));
}