コード例 #1
0
ファイル: inc.c プロジェクト: fritzo/inet
int main(int argc, char *argv[])
{
	extern int yyparse();

	const char incname[] = "in.tab.c";
	const char inhname[] = "in.tab.h";

	int error;

	setlocale(LC_ALL, "");

	inh = chkptr(fopen(inhname, "w"), inhname);
	inc = chkptr(fopen(incname, "w"), incname);

	fputs(INBASE "\n", inc);
	fputs(INYANK "\n", inc);
	fputs(INQUEUE "\n", inc);
	fputs(INWIRE "\n", inc);
	fputs(INDETERM "\n", inc);

	chkptr((void *)(intptr_t)hcreate(HASHNEL), "hcreate");
	amb = getagent("amb");
	error = yyparse();

	fputs(INSIM, inc);

	fclose(inh);
	fclose(inc);
	return error;
}
コード例 #2
0
void
Messenger::onStreamDied(::net::IStream::TId streamId)
{
	IMessengerDelegate* delegate_ = 0;

	{
		util::ScopedLock lock(&s_sync);

		TMessengerDelegates::iterator ii = m_messengerDelegates.find(streamId);
		if (ii != m_messengerDelegates.end())
		{
			delegate_ = ii->second;

			ODS("Removing delegates for stream: " << ii->first);

			m_messengerDelegates.erase(ii);
		}
		else
		{
			assert(!"Stream not found");
		}

		// Clean data associated with the stream
		m_streamData.erase(streamId);
	}

	if (delegate_)
	{
		chkptr(delegate_);
		delegate_->onStreamDied(streamId);
	}
}
コード例 #3
0
	void reset(T* arr)
	{
		if (m_arr)
		{
			delete[] m_arr;
			m_arr = 0;
		}

		m_arr = arr;
		chkptr(m_arr);
	}
コード例 #4
0
void
Messenger::setMessageFactory(IMessageFactory* messageFactory)
{
	util::ScopedLock lock(&s_sync);
	m_messageFactory = messageFactory;

	if (m_messageFactory)
	{
		chkptr(m_messageFactory);
	}
}
コード例 #5
0
void
Messenger::setBindingDelegate(::msg::IBindingDelegate* bindingDelegate)
{
	util::ScopedLock lock(&s_sync);
	m_bindingDelegate = bindingDelegate;

	if (m_bindingDelegate)
	{
		chkptr(m_bindingDelegate);
	}
}
コード例 #6
0
Messenger&
Messenger::instance()
{
	util::ScopedLock lock(&s_sync);
	if (0 == s_instance.get())
	{
		s_instance.reset(new Messenger);
		chkptr(s_instance.get());
	}

	return *s_instance;
}
コード例 #7
0
ScopedLock::ScopedLock(util::ISyncObject* sync)
: m_sync(sync)
{
	chkptr(m_sync);
	m_sync->lock();
}
コード例 #8
0
ScopedLock::~ScopedLock()
{
	chkptr(m_sync);
	m_sync->unlock();
}
コード例 #9
0
	ScopedArray(T* arr) : m_arr(arr)
	{
		chkptr(m_arr);
	}
コード例 #10
0
void
Messenger::onDataReceived(
	::net::IStream::TId streamId,
	const unsigned char* buf,
	size_t bufSize)
{
	util::ScopedLock lock(&s_sync);

	try
	{
		// Append data to corresponding data buffer

		TStreamData::iterator dd = m_streamData.find(streamId);
		if (dd == m_streamData.end())
		{
			dd = m_streamData.insert(std::make_pair(streamId, TData(0))).first;
		}

		TData& data = dd->second;

		// Required data length
		size_t dataSize = data.size();
		size_t requiredLen = dataSize + bufSize;
		size_t availableLen = data.capacity();

#ifndef NDEBUG
		{
			char buf2[128];
			memset(buf2, 0, sizeof(buf2));
			sprintf(buf2, "%p data before: ", reinterpret_cast<void*>(streamId));
			OutputDebugStringA(buf2);

			if (0 < data.size())
				dumpBinBuffer(&data[0], data.size());
			else
				OutputDebugStringA("<empty>\n");
		}
#endif // !NDEBUG

		// Resize data buffer if it is not large enough
		if (availableLen < requiredLen)
		{
			// Reserve 20% more
			size_t reserve = static_cast<size_t>(requiredLen * 1.2);

			if (reserve < KMSG_INITIAL_DATA_BUF_SIZE)
				reserve = KMSG_INITIAL_DATA_BUF_SIZE;

			data.reserve(reserve);
		}

		data.resize(requiredLen);

		// Copy data to buffer
		memcpy(&data[dataSize], buf, bufSize);

		// Try to extract message from data
		while (sizeof(MessageHeader) <= (dataSize = data.size()))
		{
			MessageHeader header;
			memset(&header, 0, sizeof(header));

			assert(data.size() == dataSize);

			unsigned char* pData = &data[0];
			memcpy(&header, pData, sizeof(header));

			util::T_UI4 messageSize = header.payloadSize + sizeof(MessageHeader); // two bytes at the beginning are message type and payload length
			if (messageSize <= dataSize)
			{
				TMessagePtr message;

				try
				{
					if (!m_messageFactory)
					{
						assert(!"Message factory must be set before receiving messages");
						throw std::logic_error("Internal error");
					}

					chkptr(m_messageFactory);
					message = m_messageFactory->createMessage(header.messageType);

					{
						util::ScopedLock lock(&m_memStreamSync);
						util::MemoryStream memstream(pData + sizeof(MessageHeader), pData + messageSize);
						message->load(memstream);
					}

					// Remove message bytes from data
					{
						TData::iterator bb = data.begin();
						std::advance(bb, messageSize);

#ifndef NDEBUG
						size_t dataSizeBefore = data.size();
						assert(dataSizeBefore >= messageSize);
#endif // !NDEBUG

						data.erase(data.begin(), bb);

#ifndef NDEBUG
						size_t dataSizeAfter = data.size();
						assert(dataSizeAfter + messageSize == dataSizeBefore);
						assert(dd->second.size() == dataSizeAfter);

						{
							char buf2[128];
							memset(buf2, 0, sizeof(buf2));
							sprintf(buf2, "%p data after: ", reinterpret_cast<void*>(streamId));
							OutputDebugStringA(buf2);

							if (0 < data.size())
								dumpBinBuffer(&data[0], data.size());
							else
								OutputDebugStringA("<empty>\n");
						}
#endif // !NDEBUG
					}

					TMessengerDelegates::iterator ii = m_messengerDelegates.find(streamId);
					if (ii == m_messengerDelegates.end())
					{
						assert(0);
						throw util::Error("Stream not found");
					}

					IMessengerDelegate* delegate_ = ii->second;
					chkptr(delegate_);

					delegate_->onMessageReceived(streamId, message);
				}
				catch (const std::exception& x)
				{
#ifndef NDEBUG
					const char* szMsg = x.what();
#endif
					// Unknown messages and message handling errors are simple discarded
					ignore_unused(x);
					assert(!"Unknown message type or message handling error");
				}
				catch (...)
				{
					// Unknown messages and message handling errors are simple discarded
					assert(!"Unknown message type or message handling error");
				}
			}
			else
			{
				// Not enough data
				break;
			}
		}
	}
	catch (const std::exception& x)
	{
		// Some error (probably bad_alloc) occured while processing stream data.
		// In this case stream is assumed to be in incosistent state and thus is not used any more.
		net::StreamListener::instance().closeStream(streamId, x.what());
	}
	catch (...)
	{
		// Some unknown error occured while processing stream data.
		// In this case stream is assumed to be in incosistent state and thus is not used any more.
		net::StreamListener::instance().closeStream(streamId, "Unknown error");
	}
}