From b9304640ae7a85d55d7dbc498f7cd875a2f1e215 Mon Sep 17 00:00:00 2001 From: Aki Date: Mon, 28 Mar 2022 22:30:38 +0200 Subject: Removed windows headers and moved NetServer a bit closer to standard --- NetEx/NetServer.cpp | 102 +++++++++++++++------------------------------------- NetEx/NetServer.h | 21 +++++------ 2 files changed, 39 insertions(+), 84 deletions(-) (limited to 'NetEx') diff --git a/NetEx/NetServer.cpp b/NetEx/NetServer.cpp index 665b69b..7357928 100644 --- a/NetEx/NetServer.cpp +++ b/NetEx/NetServer.cpp @@ -3,34 +3,29 @@ Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. - AUTHOR: John DiCamillo + AUTHOR: John DiCamillo - OVERVIEW - ======== - Network Server Pump for HTTP Server + OVERVIEW + ======== + Network Server Pump for HTTP Server */ #include "NetServer.h" -#include "NetHost.h" -#include "NetLayer.h" -#include -#include -#include - -// +-------------------------------------------------------------------+ +#include +#include +#include +#include -DWORD WINAPI NetServerListenerProc(LPVOID link); -DWORD WINAPI NetServerReaderProc(LPVOID link); - -struct PoolItem { NetServer* server; int thread_index; }; +#include "NetHost.h" +#include "NetLayer.h" // +-------------------------------------------------------------------+ -NetServer::NetServer(WORD port, int nthreads) - : sock(true), pool(0), conn(0), poolsize(nthreads), err(0), - server_shutdown(false), hreader(0) +NetServer::NetServer(std::uint16_t port, int nthreads) + : sock(true), pool(nullptr), conn(nullptr), poolsize(nthreads), err(0), + server_shutdown(false) { NetHost host; addr = NetAddr(host.Address().IPAddr(), port); @@ -40,27 +35,19 @@ NetServer::NetServer(WORD port, int nthreads) if (poolsize < 1) poolsize = 1; - pool = new HANDLE[poolsize]; + pool = new std::thread[poolsize]; conn = new NetSock*[poolsize]; clients = new NetAddr[poolsize]; if (pool && conn && clients) { - ZeroMemory(pool, poolsize * sizeof(HANDLE)); - ZeroMemory(conn, poolsize * sizeof(NetSock*)); - - DWORD thread_id = 0; + std::memset(pool, 0, poolsize * sizeof(std::thread)); + std::memset(conn, 0, poolsize * sizeof(NetSock*)); for (int i = 0; i < poolsize; i++) { - thread_id = 0; - PoolItem* item = new PoolItem; - item->server = this; - item->thread_index = i; - - pool[i] = CreateThread(0, 4096, NetServerReaderProc, (LPVOID) item, 0, &thread_id); + pool[i] = std::thread([=]{ Reader(i); }); } - thread_id = 0; - hreader = CreateThread(0, 4096, NetServerListenerProc, (LPVOID) this, 0, &thread_id); + hreader = std::thread([&]{ Listener(); }); } } @@ -71,17 +58,17 @@ NetServer::~NetServer() sock.close(); } - if (hreader) { - WaitForSingleObject(hreader, 1000); - CloseHandle(hreader); + if (hreader.joinable()) { + hreader.join(); } if (pool && poolsize) { for (int i = 0; i < poolsize; i++) { - WaitForSingleObject(pool[i], 1000); - CloseHandle(pool[i]); + if (pool[i].joinable()) { + pool[i].join(); + } delete conn[i]; - conn[i] = 0; + conn[i] = nullptr; } delete [] pool; @@ -100,17 +87,7 @@ NetServer::Shutdown() // +--------------------------------------------------------------------+ -DWORD WINAPI NetServerListenerProc(LPVOID link) -{ - NetServer* net_server = (NetServer*) link; - - if (net_server) - return net_server->Listener(); - - return (DWORD) E_POINTER; -} - -DWORD +void NetServer::Listener() { while (!server_shutdown) { @@ -132,37 +109,16 @@ NetServer::Listener() // wait for a thread to become not busy if (s) - Sleep(10); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } - - return 0; } // +--------------------------------------------------------------------+ -DWORD WINAPI NetServerReaderProc(LPVOID link) -{ - if (!link) return (DWORD) E_POINTER; - - PoolItem* item = (PoolItem*) link; - NetServer* net_server = item->server; - int index = item->thread_index; - - delete item; - - if (net_server) - return net_server->Reader(index); - - return (DWORD) E_POINTER; -} - -DWORD +void NetServer::Reader(int index) { - // init random seed for this thread: - srand(timeGetTime()); - while (!server_shutdown) { sync.lock(); NetSock* s = conn[index]; @@ -208,11 +164,9 @@ NetServer::Reader(int index) sync.unlock(); } else { - Sleep(5); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); } } - - return 0; } // +--------------------------------------------------------------------+ diff --git a/NetEx/NetServer.h b/NetEx/NetServer.h index 0869f2a..1fcc938 100644 --- a/NetEx/NetServer.h +++ b/NetEx/NetServer.h @@ -3,21 +3,22 @@ Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors Copyright (c) 1997-2006, Destroyer Studios LLC. - AUTHOR: John DiCamillo + AUTHOR: John DiCamillo - OVERVIEW - ======== - Network Server Pump for HTTP Server + OVERVIEW + ======== + Network Server Pump for HTTP Server */ #ifndef NetServer_h #define NetServer_h +#include #include +#include -#include #include "NetAddr.h" #include "NetGram.h" #include "NetSock.h" @@ -30,14 +31,14 @@ class NetServer public: static const char* TYPENAME() { return "NetServer"; } - NetServer(WORD port, int poolsize=1); + NetServer(std::uint16_t port, int poolsize=1); virtual ~NetServer(); int operator == (const NetServer& l) const { return addr == l.addr; } virtual void Shutdown(); - virtual DWORD Listener(); - virtual DWORD Reader(int index); + virtual void Listener(); + virtual void Reader(int index); virtual Text ProcessRequest(Text request, const NetAddr& addr); virtual Text DefaultResponse(); @@ -52,8 +53,8 @@ protected: NetAddr client_addr; int poolsize; - HANDLE hreader; - HANDLE* pool; + std::thread hreader; + std::thread* pool; NetSock** conn; NetAddr* clients; int err; -- cgit v1.1