From 678b962a330d7688518cc0eb61620e2dd4a1503d Mon Sep 17 00:00:00 2001 From: Zebiolo Date: Wed, 7 Mar 2012 22:31:07 +0000 Subject: [PATCH] git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@2544 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- common/log/log.cpp | 2 +- protocol/amcp/AMCPCommandsImpl.cpp | 20 ++++++++-------- protocol/util/AsyncEventServer.cpp | 37 +++++++++++++++++++++++++++--- protocol/util/AsyncEventServer.h | 6 ++--- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/common/log/log.cpp b/common/log/log.cpp index 9dd218384..e067d6ef7 100644 --- a/common/log/log.cpp +++ b/common/log/log.cpp @@ -96,7 +96,7 @@ void my_formatter(std::wostream& strm, boost::log::basic_record const& strm << L" "; } - strm << rec.message(); + strm << replace_nonprintable_copy(rec.message(), L'?'); } namespace internal{ diff --git a/protocol/amcp/AMCPCommandsImpl.cpp b/protocol/amcp/AMCPCommandsImpl.cpp index 700533e6f..48ff1bfef 100644 --- a/protocol/amcp/AMCPCommandsImpl.cpp +++ b/protocol/amcp/AMCPCommandsImpl.cpp @@ -433,33 +433,33 @@ bool MixerCommand::DoExecute() auto value = boost::lexical_cast(_parameters.at(1)); int duration = _parameters.size() > 2 ? boost::lexical_cast(_parameters[2]) : 0; std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; - auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform + transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform { transform.brightness = value; return transform; - }, duration, tween); + }, duration, tween)); } else if(_parameters[0] == L"SATURATION") { auto value = boost::lexical_cast(_parameters.at(1)); int duration = _parameters.size() > 2 ? boost::lexical_cast(_parameters[2]) : 0; std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; - auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform + transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform { transform.saturation = value; return transform; - }, duration, tween); + }, duration, tween)); } else if(_parameters[0] == L"CONTRAST") { auto value = boost::lexical_cast(_parameters.at(1)); int duration = _parameters.size() > 2 ? boost::lexical_cast(_parameters[2]) : 0; std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; - auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform + transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform { transform.contrast = value; return transform; - }, duration, tween); + }, duration, tween)); } else if(_parameters[0] == L"LEVELS") { @@ -472,11 +472,11 @@ bool MixerCommand::DoExecute() int duration = _parameters.size() > 6 ? boost::lexical_cast(_parameters[6]) : 0; std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear"; - auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform + transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform { transform.levels = value; return transform; - }, duration, tween); + }, duration, tween)); } else if(_parameters[0] == L"VOLUME") { @@ -484,11 +484,11 @@ bool MixerCommand::DoExecute() std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; double value = boost::lexical_cast(_parameters[1]); - auto transform = stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform + transforms.push_back(stage::transform_tuple_t(GetLayerIndex(), [=](frame_transform transform) -> frame_transform { transform.volume = value; return transform; - }, duration, tween); + }, duration, tween)); } else if(_parameters[0] == L"CLEAR") { diff --git a/protocol/util/AsyncEventServer.cpp b/protocol/util/AsyncEventServer.cpp index 3d0680566..558b4725b 100644 --- a/protocol/util/AsyncEventServer.cpp +++ b/protocol/util/AsyncEventServer.cpp @@ -254,6 +254,22 @@ bool AsyncEventServer::OnAccept(SocketInfoPtr& pSI) { SocketInfoPtr pClientSocket(new SocketInfo(clientSocket, this)); + try + { // !!!!!!!!!!!! + if(socketInfoCollection_.Size() >= 50) + { + HANDLE handle = nullptr; + { + tbb::mutex::scoped_lock lock(socketInfoCollection_.mutex_); + handle = *(socketInfoCollection_.waitEvents_.begin()+0); + if(handle == pListenSocketInfo_->event_) + handle = *(socketInfoCollection_.waitEvents_.begin()+1); + } + socketInfoCollection_.RemoveSocketInfo(handle); + CASPAR_LOG(error) << " Too many connections. Removed last used connection."; + } + }catch(...){} + //Determine if we can handle one more client if(socketInfoCollection_.Size() >= CASPAR_MAXIMUM_SOCKET_CLIENTS) { CASPAR_LOG(error) << "Could not accept ) << too many connections)."; @@ -271,7 +287,7 @@ bool AsyncEventServer::OnAccept(SocketInfoPtr& pSI) { socketInfoCollection_.AddSocketInfo(pClientSocket); - CASPAR_LOG(info) << "Accepted connection from " << pClientSocket->host_.c_str(); + CASPAR_LOG(info) << "Accepted connection from " << pClientSocket->host_.c_str() << " " << socketInfoCollection_.Size(); return true; } @@ -342,6 +358,21 @@ bool ConvertMultiByteToWideChar(UINT codePage, char* pSource, int sourceLength, // COMMENT: Called then something arrives on the socket that has to be read bool AsyncEventServer::OnRead(SocketInfoPtr& pSI) { int recvResult = SOCKET_ERROR; + + try + { // !!!!!!!!!!!! + if(pSI) + { + tbb::mutex::scoped_lock lock(socketInfoCollection_.mutex_); + auto it = std::find(socketInfoCollection_.waitEvents_.begin(), socketInfoCollection_.waitEvents_.end(), pSI->event_); + if(it != socketInfoCollection_.waitEvents_.end()) + { + auto handle = *it; + socketInfoCollection_.waitEvents_.erase(it); + socketInfoCollection_.waitEvents_.push_back(handle); + } + } + }catch(...){} int maxRecvLength = sizeof(pSI->recvBuffer_)-pSI->recvLeftoverOffset_; recvResult = recv(pSI->socket_, pSI->recvBuffer_+pSI->recvLeftoverOffset_, maxRecvLength, 0); @@ -362,7 +393,7 @@ bool AsyncEventServer::OnRead(SocketInfoPtr& pSI) { maxRecvLength = sizeof(pSI->recvBuffer_)-pSI->recvLeftoverOffset_; recvResult = recv(pSI->socket_, pSI->recvBuffer_+pSI->recvLeftoverOffset_, maxRecvLength, 0); } - + if(recvResult == SOCKET_ERROR) { int errorCode = WSAGetLastError(); if(errorCode == WSAEWOULDBLOCK) @@ -380,7 +411,7 @@ bool AsyncEventServer::OnRead(SocketInfoPtr& pSI) { // AsyncEventServer::OnWrite // PARAMS: ... // COMMENT: Called when the socket is ready to send more data -void AsyncEventServer::OnWrite(SocketInfoPtr& pSI) { +void AsyncEventServer::OnWrite(SocketInfoPtr& pSI) { DoSend(*pSI); } diff --git a/protocol/util/AsyncEventServer.h b/protocol/util/AsyncEventServer.h index b10ed430a..27ee8d6d8 100644 --- a/protocol/util/AsyncEventServer.h +++ b/protocol/util/AsyncEventServer.h @@ -125,12 +125,12 @@ private: void Clear(); ClientDisconnectEvent onSocketInfoRemoved; - + + HandleVector waitEvents_; + tbb::mutex mutex_; private: SocketInfoMap socketInfoMap_; - HandleVector waitEvents_; bool bDirty_; - tbb::mutex mutex_; }; SocketInfoCollection socketInfoCollection_; tbb::mutex mutex_; -- 2.39.2