switched to use a spin lock on behalf of a mutex
This commit is contained in:
		| @ -39,12 +39,6 @@ QSE_BEGIN_NAMESPACE(QSE) | ||||
| #include "../cmn/syserr.h" | ||||
| IMPLEMENT_SYSERR_TO_ERRNUM (TcpServer::ErrorCode, TcpServer::) | ||||
|  | ||||
|  | ||||
| TcpServer::Client::~Client() | ||||
| { | ||||
| 	if (this->csmtx) qse_mtx_close(this->csmtx); | ||||
| } | ||||
|  | ||||
| // | ||||
| // NOTICE: the guarantee class below could have been placed  | ||||
| //         inside TCPServer::Client::run () without supporting  | ||||
| @ -52,16 +46,16 @@ TcpServer::Client::~Client() | ||||
| // | ||||
| class guarantee_tcpsocket_close { | ||||
| public: | ||||
| 	guarantee_tcpsocket_close (Socket* socket, qse_mtx_t* mtx): psck(socket), mtx(mtx) {} | ||||
| 	guarantee_tcpsocket_close (Socket* socket, SpinLock* spl): psck(socket), spl(spl) {} | ||||
| 	~guarantee_tcpsocket_close ()  | ||||
| 	{  | ||||
| 		qse_mtx_lock (this->mtx, QSE_NULL); | ||||
| 		spl->lock (); | ||||
| 		/*psck->shutdown ();*/ | ||||
| 		psck->close ();  | ||||
| 		qse_mtx_unlock (this->mtx); | ||||
| 		spl->unlock (); | ||||
| 	} | ||||
| 	Socket* psck; | ||||
| 	qse_mtx_t* mtx; | ||||
| 	SpinLock* spl; | ||||
| }; | ||||
|  | ||||
| int TcpServer::Client::main () | ||||
| @ -72,7 +66,7 @@ int TcpServer::Client::main () | ||||
| 	// it would just block signals to the TcpProxy thread. | ||||
| 	this->blockAllSignals (); // don't care about the result. | ||||
|  | ||||
| 	guarantee_tcpsocket_close close_socket (&this->socket, this->csmtx); | ||||
| 	guarantee_tcpsocket_close close_socket (&this->socket, &this->csspl); | ||||
| 	if (this->listener->server->handle_client(&this->socket, &this->address) <= -1) return -1; | ||||
| 	return 0; | ||||
| } | ||||
| @ -88,10 +82,9 @@ int TcpServer::Client::stop () QSE_CPP_NOEXCEPT | ||||
| 	//       as it might not be thread-safe. | ||||
| 	//       but it is still ok because Client::stop()  | ||||
| 	//       is rarely called. | ||||
| 	qse_mtx_lock (this->csmtx, QSE_NULL); | ||||
| 	this->csspl.lock (); | ||||
| 	this->socket.shutdown (); | ||||
| 	//this->socket.close (); | ||||
| 	qse_mtx_unlock (this->csmtx); | ||||
| 	this->csspl.unlock (); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -364,15 +357,6 @@ int TcpServer::start (const qse_char_t* addrs) QSE_CPP_NOEXCEPT | ||||
| 						break; | ||||
| 					} | ||||
|  | ||||
| 					client->csmtx = qse_mtx_open(QSE_MMGR_GETDFL(), 0); | ||||
| 					if (!client->csmtx) | ||||
| 					{ | ||||
| 						// TODO: logging  ....  | ||||
| 						// don't delete client. just close the socket. for reuse. | ||||
| 						client->socket.close ();  | ||||
| 						continue; | ||||
| 					} | ||||
|  | ||||
| 					client->setStackSize (this->thread_stack_size); | ||||
| 				#if defined(_WIN32) | ||||
| 					if (client->start(Thread::DETACHED) <= -1)  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user