Commit 29b8b3a1 authored by Pavel Vainerman's avatar Pavel Vainerman

thread safe processing for errno

parent 2e6eb5e1
......@@ -710,9 +710,10 @@ void LogDB::Log::write( ev::io& io )
if( ret < 0 )
{
dbwarn << peername << "(write): write to socket error(" << errno << "): " << strerror(errno) << endl;
int errnum = errno;
dbwarn << peername << "(write): write to socket error(" << errnum << "): " << strerror(errnum) << endl;
if( errno == EPIPE || errno == EBADF )
if( errnum == EPIPE || errnum == EBADF )
{
dbwarn << peername << "(write): write error.. terminate session.." << endl;
io.set(EV_NONE);
......@@ -816,6 +817,7 @@ void LogDB::handleRequest( Poco::Net::HTTPServerRequest& req, Poco::Net::HTTPSer
uri.getPathSegments(seg);
// проверка подключения к страничке со списком websocket-ов
// http://[xxxx:port]/logdb/ws/
if( seg.size() > 1 && seg[0] == "logdb" && seg[1] == "ws" )
{
// подключение..
......@@ -1398,10 +1400,12 @@ void LogDB::LogWebSocket::write()
if( ret < 0 )
{
int errnum = errno;
dblog3 << "(websocket): " << req->clientAddress().toString()
<< " write to socket error(" << errno << "): " << strerror(errno) << endl;
<< " write to socket error(" << errnum << "): " << strerror(errnum) << endl;
if( errno == EPIPE || errno == EBADF )
if( errnum == EPIPE || errnum == EBADF )
{
dblog3 << "(websocket): "
<< req->clientAddress().toString()
......
......@@ -307,8 +307,9 @@ namespace uniset
if( res < 0 )
{
if( errno != EAGAIN && dlog->is_warn() )
dlog->warn() << peername << "(getNextData): read from socket error(" << errno << "): " << strerror(errno) << endl;
int errnum = errno;
if( errnum != EAGAIN && dlog->is_warn() )
dlog->warn() << peername << "(getNextData): read from socket error(" << errnum << "): " << strerror(errnum) << endl;
return 0;
}
......
......@@ -301,10 +301,18 @@ namespace uniset
if( ret < 0 )
{
// копируем, а потом проверяем
// хоть POSIX говорит о том, что errno thread-local
// но почему-то словил, что errno (по крайней мере для EPIPE "broken pipe")
// в лог выводилось, а в if( ... ) уже не ловилось
// возможно связано с тем, что ввод/вывод "прерываемая" операция при многопоточности
int errnum = errno;
// можно было бы конечно убрать вывод лога в else, после проверки в if
if( mylog.is_warn() )
mylog.warn() << peername << "(LogSession::writeEvent): write to socket error(" << errno << "): " << strerror(errno) << endl;
mylog.warn() << peername << "(LogSession::writeEvent): write to socket error(" << errnum << "): " << strerror(errnum) << endl;
if( errno == EPIPE || errno == EBADF )
if( errnum == EPIPE || errnum == EBADF )
{
if( mylog.is_warn() )
mylog.warn() << peername << "(LogSession::writeEvent): write error.. terminate session.." << endl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment