From b2be5fd687a17e3392ecb6c18be00b297eef53b8 Mon Sep 17 00:00:00 2001 From: David Brodsky Date: Sun, 9 Jul 2006 23:19:50 +0200 Subject: [PATCH] Make writing to a socket thread-safe. --- src/net-core/socket.cpp | 10 +++++++++- src/net-core/socket.h | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/net-core/socket.cpp b/src/net-core/socket.cpp index 3824684..cbaf2a3 100644 --- a/src/net-core/socket.cpp +++ b/src/net-core/socket.cpp @@ -70,6 +70,7 @@ Socket::~Socket() delete connectedFunctor; delete errorFunctor; delete readyWriteFunctor; + delete mutex; } /* }}} */ @@ -141,6 +142,7 @@ void Socket::error() void Socket::init() { inBuffer = new char[bufLength]; + mutex = new Tairon::Core::Mutex(); connectedFunctor = 0; errorFunctor = Tairon::Core::methodFunctor(this, &Socket::error); readyReadFunctor = 0; @@ -196,32 +198,38 @@ size_t Socket::readTo(void *buf, size_t length) /* {{{ Socket::readyWrite() */ void Socket::readyWrite() { + mutex->lock(); ssize_t length = send(fd, outBuffer.data(), outBuffer.length(), 0); if (length == -1) { + mutex->unlock(); error(); return; } outBuffer.erase(0, length); if (!outBuffer.length()) Poll::self()->delSocketToWrite(fd); + mutex->unlock(); } /* }}} */ /* {{{ Socket::write(const String &) */ void Socket::write(const String &data) { + mutex->lock(); outBuffer.append(data); ssize_t length = send(fd, outBuffer.data(), outBuffer.length(), MSG_DONTWAIT); if (length == -1) if (errno == EAGAIN) - Poll::self()->addSocketToWrite(fd, readyWriteFunctor); + length = 0; else { + mutex->unlock(); error(); return; } outBuffer.erase(0, length); if (outBuffer.length()) Poll::self()->addSocketToWrite(fd, readyWriteFunctor); + mutex->unlock(); } /* }}} */ diff --git a/src/net-core/socket.h b/src/net-core/socket.h index b018f52..1a22d55 100644 --- a/src/net-core/socket.h +++ b/src/net-core/socket.h @@ -160,6 +160,10 @@ class Socket */ char *inBuffer; + /** Mutex for locking write methods. + */ + Tairon::Core::Mutex *mutex; + /** Buffer for output data. */ String outBuffer; -- 2.11.4.GIT