예제 #1
0
bool zSocket::sync()
{
	//Zebra::logger->trace("zSocket::sync");
	if(need_enc())
	{
		unsigned int nSize = 0, current_cmd = 0, offset = 0;
		mutex.lock();
		if (_snd_queue.rd_ready())
		{
			nSize = _snd_queue.rd_size();
			current_cmd = _current_cmd;
			offset = _enc_queue.rd_size();
			_enc_queue.put(_snd_queue.rd_buf(), nSize);
			_snd_queue.rd_flip(nSize);
			_current_cmd = 0;
		}
		mutex.unlock();
		if (nSize)
			packetPackEnc(_enc_queue, current_cmd, offset);
		if (_enc_queue.rd_ready())
		{
			int retcode = sendRawData_NoPoll(_enc_queue.rd_buf(), _enc_queue.rd_size());
			if (retcode > 0)
			{
				_enc_queue.rd_flip(retcode);
			}
			else if (-1 == retcode)
			{
				return false;
			}
		}
	}
	else
	{
		mutex.lock();
		if (_snd_queue.rd_ready())
		{
			_enc_queue.put(_snd_queue.rd_buf(), _snd_queue.rd_size());
			_snd_queue.rd_flip(_snd_queue.rd_size());
		}
		mutex.unlock();
		if (_enc_queue.rd_ready())
		{
			int retcode = sendRawData_NoPoll(_enc_queue.rd_buf(), _enc_queue.rd_size());
			if (retcode > 0)
			{
				_enc_queue.rd_flip(retcode);
			}
			else if (-1 == retcode)
			{
				return false;
			}
		}
	}

	return true;
}
예제 #2
0
bool CSocket::sync()
{
	//Zebra::logger->debug("CSocket::sync");
	if (_enc_queue.rd_ready())
	{
		mutex.lock();
		int retcode = sendRawData_NoPoll(_enc_queue.rd_buf(),_enc_queue.rd_size());
		mutex.unlock();
		if (retcode > 0)
		{
			_enc_queue.rd_flip(retcode);
		}
		else if (-1 == retcode)
		{
			return false;
		}
	}
	return true;
}