Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #124177

Re: How to inline the main function of a thread?

From "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com>
Newsgroups comp.lang.c++
Subject Re: How to inline the main function of a thread?
Date 2026-07-03 12:44 -0700
Organization A noiseless patient Spider
Message-ID <11293ea$3l5mi$1@dont-email.me> (permalink)
References (2 earlier) <11206me$10vvd$1@dont-email.me> <1123pg3$23fuu$1@dont-email.me> <11256ip$150r7$1@dont-email.me> <1126bdf$2r6qm$1@dont-email.me> <1127tlv$39ak8$1@dont-email.me>

Show all headers | View raw


On 7/3/2026 1:59 AM, boltar@caprica.universe wrote:
> On Thu, 2 Jul 2026 11:41:48 -0700
> "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> gabbled:
>> On 7/2/2026 1:13 AM, boltar@caprica.universe wrote:
>>> They're hard enough to make it a lot of pointless work if its not 
>>> necessary. As I said, if you're creating threads every few 
>>> milliseconds then
>>> use a thread pool. If you're just creating a thread every few seconds 
>>> or longer then a pool is a complete waste of time.
>>
>> Thread per connection model? If that works for your work load, so be 
>> it. Just don't be alarmed if you get 10000 threads all of sudden. Or, 
>> say a connection comes in every second for say a half an hour. 1800 
>> connections? Also you need to think about a connection that sends a 
>> little data then just sits there doing nothing for say 20 minutes.
> 
> You do realise setting up and pulling down a TCP connection takes far more
> CPU resources than simply adding a new program counter into the scheduler
> list, right? If we were talking about creating a new process via fork() 
> then
> your argument might have some merit, but threads? No.
> 
>>>> how are you handling the sync in your program logic to them? What do 
>>>> they do?
>>>
>>> Is that supposed to be some kind of trick question?
>>
>> No. It means how to you say, join them, or are you detaching them? How 
>> can you gain data from them? You need to know all about this if you 
>> are going to use threads at all. Well, imvho that is...
> 
> I would imagine most threads in a server process run detached. Joining 
> makes
> little sense unless you specifically need to wait for the thread to 
> complete
> its task in which case there might be an argument for doing the task 
> sequentially anyway.
> 
>> Do you have a "reaper" thread that can conduct "maintenance"? Zombie 
>> states? Are you do graceful shutdowns?
> 
> I'd hate to see your code, must be an overcomplicated mess.
> 

Set your coffee down! Here is my raw test for my mind trying to sketch 
out an IOCP server setup from my memory... It should compile for you, I 
will show my ralloc code in follow up. I had a little trouble 
remembering what the AcceptEx format for buffers is, IPv4 here. There 
should be a sockaddrs for ipv6. Sigh, but I got this for now. Almost 
ready for a proper thread pool! :^D

ct_main.cpp
________



#include "ct_ralloc.hpp"

#include <cstdio>
#include <cstdlib>
#include <cassert>

#include <iostream>
#include <thread>
#include <atomic>
#include <mutex>
#include <vector>


#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <mswsock.h>
#include <windows.h>






namespace ct
{
     namespace tools
     {
         template<typename T>
         struct ctor_dtor
         {
             T* m_ptr;

             ctor_dtor(
                 T* ptr
             ): m_ptr(ptr) {
                 m_ptr->ctor();
             }

             ~ctor_dtor()
             {
                 m_ptr->dtor();
             }
         };

         template<typename T>
         struct dtor
         {
             T* m_ptr;

             dtor(
                 T* ptr
             ) : m_ptr(ptr) {

             }

             ~dtor()
             {
                 m_ptr->dtor();
             }
         };
     }


     namespace proxy_0_0_0_0
     {
         struct atomic_region
         {
             unsigned char* m_raw_buffer = nullptr;
             std::size_t m_usable = 0;
             std::atomic<std::size_t> m_head = { 0 };

             // move it out into an init...
             void
             init(
                 unsigned char* const raw_buffer,
                 std::size_t usable
             ) {
                 m_raw_buffer = raw_buffer;
                 m_usable = usable;
                 m_head.store(0, std::memory_order_relaxed);
             }



             unsigned char*
             alloc(
                 std::size_t size
             ) {
                 /*
                 std::size_t old = m_head.fetch_add(size, 
std::memory_order_relaxed);

                 if (old + size > m_usable)
                 {
                     m_head.exchange(m_usable, std::memory_order_relaxed);

                     return nullptr;
                 }
                 */

                 // using a CAS loop here. Sigh. Shit happens! ;^)
                 std::size_t old = m_head.load(std::memory_order_relaxed);

                 do
                 {
                     if (old + size > m_usable) return nullptr;
                 } while (! m_head.compare_exchange_weak(old, old + 
size, std::memory_order_relaxed));

                 return m_raw_buffer + old;
             }
         };



         namespace win
         {
             bool
             close_handle(
                 HANDLE handle
             ) {
                 BOOL status = CloseHandle(handle);

                 if (! status)
                 {
                     assert(status && "close_handle failed... God damn 
it!");
                     // throw; Grrrr! SHIT is REALLY BAD!
                     // formatmessage, display? ;^)
                     return false;
                 }

                 return true;
             }


             struct alignas(MEMORY_ALLOCATION_ALIGNMENT) slist_node {
                 SLIST_ENTRY entry;
             };

             // Non-templated raw list (if n ever want it)
             struct slist_raw {
                 SLIST_HEADER head;

                 void init() noexcept {
                     InitializeSListHead(&head);
                 }

                 void push(slist_node* n) noexcept {
                     InterlockedPushEntrySList(&head, &n->entry);
                 }

                 slist_node* pop() noexcept {
                     SLIST_ENTRY* e = InterlockedPopEntrySList(&head);
                     return e ? CONTAINING_RECORD(e, slist_node, entry) 
: nullptr;
                 }

                 void flush() noexcept {
                     InterlockedFlushSList(&head);
                 }
             };




             struct wsa_extensions
             {
                 LPFN_ACCEPTEX           m_acceptex = nullptr;
                 LPFN_CONNECTEX          m_connectex = nullptr;
                 LPFN_DISCONNECTEX       m_disconnectex = nullptr;
                 LPFN_GETACCEPTEXSOCKADDRS m_getacceptexsockaddrs = nullptr;

                 bool
                 load(
                     SOCKET socket
                 ) {
                     if (!load_fn(socket, WSAID_ACCEPTEX, &m_acceptex)) 
          return false;
                     if (!load_fn(socket, WSAID_CONNECTEX, 
&m_connectex))         return false;
                     if (!load_fn(socket, WSAID_DISCONNECTEX, 
&m_disconnectex))   return false;
                     if (!load_fn(socket, WSAID_GETACCEPTEXSOCKADDRS,
                         &m_getacceptexsockaddrs)) 
  return false;

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "wsa_extensions::load()\n"
                         "  m_acceptex             = " << m_acceptex << "\n"
                         "  m_connectex            = " << m_connectex << 
"\n"
                         "  m_disconnectex         = " << m_disconnectex 
<< "\n"
                         "  m_getacceptexsockaddrs = " << 
m_getacceptexsockaddrs << "\n";

                     return true;
                 }

             private:

                 template<typename T>
                 bool
                 load_fn(
                     SOCKET socket,
                     GUID guid,
                     T* fn_out
                 ) {
                     DWORD bytes = 0;

                     int status = WSAIoctl(
                         socket,
                         SIO_GET_EXTENSION_FUNCTION_POINTER,
                         &guid, sizeof(guid),
                         fn_out, sizeof(*fn_out),
                         &bytes,
                         nullptr,
                         nullptr
                     );

                     if (status == SOCKET_ERROR)
                     {
                         std::cout << "WSAIoctl() failed: " << 
WSAGetLastError() << "\n";
                         return false;
                     }

                     return true;
                 }
             };


             struct winsock
             {
                 WSADATA m_wsa_data = { };
                 wsa_extensions m_wsaex = { };

                 // extend for version...
                 winsock()
                 {
                     int status = WSAStartup(MAKEWORD(2, 2), &m_wsa_data);

                     if (status) {
                         std::cout << "WSAStartup() failed...\n";
                         throw std::runtime_error("WSAStartup failed");
                     }

                     std::cout << "WSAStartup()\n";
                 }

                 ~winsock()
                 {
                     if (WSACleanup() == SOCKET_ERROR)
                     {
                         std::cout << "WSACleanup() failed...\n";
                         return;
                     }

                     std::cout << "WSACleanup()\n";
                 }
             };


             struct addr_info
             {
                 addrinfo* m_result = nullptr;
                 addrinfo* m_ptr = nullptr;
                 addrinfo m_hints = { };

                 // need to extend add params
                 addr_info()
                 {
                     m_hints.ai_family = AF_INET;
                     m_hints.ai_socktype = SOCK_STREAM;
                     m_hints.ai_protocol = IPPROTO_TCP;
                     m_hints.ai_flags = AI_PASSIVE;

                     // resolve?
                     int status = getaddrinfo(nullptr, "8080", &m_hints, 
&m_result);
                     if (status)
                     {
                         std::cout << "getaddrinfo() failed...\n";
                         throw std::runtime_error("getaddrinfo failed");
                     }

                     std::cout << "addr_info::addr_info()\n";
                 }

                 ~addr_info()
                 {
                     freeaddrinfo(m_result);
                     std::cout << "addr_info::~addr_info()\n";
                 }
             };


             struct iocp
             {
                 HANDLE m_iocp = nullptr;

                 iocp(
                     HANDLE handle = INVALID_HANDLE_VALUE,
                     HANDLE existing = nullptr,
                     ULONG_PTR key = 0,
                     DWORD thread_n = 0
                 ) {
                     m_iocp = CreateIoCompletionPort(handle, existing, 
key, thread_n);

                     if (! m_iocp)
                     {
                         DWORD last_error = GetLastError();

                         std::cout <<
                             "(" << this << ")->"
                             "ct::proxy_0_0_0_0::win::"
                             "iocp::iocp()::last_error = " <<
                             last_error;

                         throw 
std::runtime_error("CreateIoCompletionPort failed");
                     }

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "iocp::iocp()::ctor()\n";
                 }

                 ~iocp()
                 {
                     if (! m_iocp)
                     {
                         assert(false && "m_iocp unexpectedly null in 
destructor, fuck it all!");
                         // fuc% me! GRRRR!
                         return;
                     }

                     if (! close_handle(m_iocp))
                     {
                         // really bad!
                         return;
                     }

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "iocp::iocp()::dtor()\n";
                 }

                 // no APC shit for now...
                 DWORD
                 gqcsex(
                     LPOVERLAPPED_ENTRY pol_inout,
                     ULONG pol_in_n,
                     PULONG pol_out_n,
                     DWORD timeout = INFINITE
                 ) {
                     if (! GetQueuedCompletionStatusEx(
                         m_iocp,
                         pol_inout,
                         pol_in_n,
                         pol_out_n,
                         timeout,
                         FALSE
                     )) {

                         // humm, iirc these can be tricky...

                         DWORD last_error = GetLastError();

                         std::cout <<
                             "(" << this << ")->"
                             "ct::proxy_0_0_0_0::win::"
                             "iocp::gqcsex()::last_error = " <<
                             last_error;

                         // humm remember FormatMessage

                         return last_error;
                     }

                     return 0;
                 }

                 HANDLE
                 bind(
                     HANDLE handle,
                     ULONG_PTR key
                 ) {
                     HANDLE status = CreateIoCompletionPort(
                         (HANDLE)handle,
                         m_iocp,
                         (ULONG_PTR)key,
                         0
                     );

                     return status;
                 }


             };

             // just for the windows test...
             // its in the win namespace anyway... ;^)
             #define CT_MACRO_QUOTE_0(mp_0)#mp_0 // rofl!
             #define CT_MACRO_QUOTE(mp_0)CT_MACRO_QUOTE_0(mp_0) // rofl!


             #define CT_IO_SYSTEM_L2_CACHE_LINE (128)


             #define CT_PER_IO_ALIGN_PAD (CT_IO_SYSTEM_L2_CACHE_LINE)

             #define CT_PER_IO_STATE_ACCEPT      0x1
             #define CT_PER_IO_STATE_CONNECT     0x2
             #define CT_PER_IO_STATE_DISCONNECT  0x4
             #define CT_PER_IO_STATE_RECV        0x8
             #define CT_PER_IO_STATE_SEND        0x10



             #define CT_PER_SOCKET_ALIGN_PAD (CT_IO_SYSTEM_L2_CACHE_LINE)
             #define CT_PER_SOCKET_BUFFER (CT_PER_SOCKET_ALIGN_PAD * 32)
             #define CT_PER_SOCKET_STATE_CONNECTED   0x1
             #define CT_PER_SOCKET_FROM_MALLOC 0x2

             // per_io always owned by a single thread at any one time...
             struct alignas(CT_PER_IO_ALIGN_PAD) per_io
             {
                 struct per_io_raw
                 {
                     WSAOVERLAPPED m_ol;
                     slist_node m_slist_node;
                     per_io* m_next;
                     struct per_socket* m_per_socket; // not totally 
nesserary... Humm...
                     unsigned long m_state;

                     unsigned char* m_buf;
                     std::size_t m_buf_n;
                 };


                 per_io_raw m_raw;

                 void ctor()
                 {
                     static_assert(offsetof(per_io, m_raw) == 0, "m_raw 
must be first!");
                     static_assert(offsetof(per_io_raw, m_ol) == 0, 
"m_ol must be first!");

                     m_raw = { };

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "per_io::ctor()\n";
                 }

                 // not mandatory
                 void dtor()
                 {
                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "per_io::dtor()\n";
                 }
             };

             static_assert(
                 sizeof(per_io) == CT_PER_IO_ALIGN_PAD,
                 "per_io pad error" CT_MACRO_QUOTE(CT_PER_IO_ALIGN_PAD)
             );




             struct alignas(CT_PER_IO_ALIGN_PAD) per_socket
             {
                 struct buffer
                 {
                     unsigned char m_raw_buffer[CT_PER_SOCKET_BUFFER];
                 };

                 struct per_socket_raw
                 {
                     slist_node m_slist_node;
                     per_socket* m_next;
                     std::atomic<unsigned long> m_state;
                     SOCKET m_socket;

                     unsigned char* m_buf;
                     std::size_t m_buf_n;

                     alignas(CT_PER_IO_ALIGN_PAD) buffer m_raw_buffer;
                 };

                 per_socket_raw m_raw;

                 void ctor()
                 {
                     m_raw.m_slist_node = { };
                     m_raw.m_next = nullptr;
                     m_raw.m_state.store(0, std::memory_order_relaxed);
                     m_raw.m_socket = INVALID_SOCKET;
                     m_raw.m_buf = m_raw.m_raw_buffer.m_raw_buffer;
                     m_raw.m_buf_n = CT_PER_SOCKET_BUFFER;

                     // well, init m_raw.m_raw_buffer ;^)
                     m_raw.m_raw_buffer = { 0 };

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "per_socket::ctor()\n";
                 }

                 void dtor()
                 {
                     if (m_raw.m_socket != INVALID_SOCKET)
                     {
                         SOCKET old_socket = m_raw.m_socket;
                         m_raw.m_socket = INVALID_SOCKET;

                         if (closesocket(old_socket))
                         {
                             // GOD DAMN IT!
                             // fucking throw!
                             // GRRRRR!
                             // or extend ctor and dtor to return status
                             // How C can you get in C++? ;^D
                             return;
                         }
                     }

                     std::cout <<
                         "(" << this << ")->"
                         "ct::proxy_0_0_0_0::win::"
                         "per_socket::dtor()\n";
                 }

                 wsa_extensions
                 get_wsaex()
                 {
                     wsa_extensions wsaex;
                     wsaex.load(m_raw.m_socket);
                     return wsaex;
                 }

             };

             static_assert(
                 sizeof(per_socket) == CT_PER_SOCKET_ALIGN_PAD + 
CT_PER_SOCKET_BUFFER &&
                 sizeof(per_socket) % CT_PER_SOCKET_ALIGN_PAD == 0,
                 "per_socket pad error" 
CT_MACRO_QUOTE(CT_PER_SOCKET_ALIGN_PAD)
             );

             template<typename T>
             struct single_threaded_stack
             {
                 T* m_head = nullptr;

                 void
                 push(
                     T* node
                 ) {
                     node->m_raw.m_next = m_head;
                     m_head = node;
                 }

                 T*
                 pop_try()
                 {
                     T* head = m_head;
                     if (head)
                     {
                         m_head = head->m_raw.m_next;
                     }
                     return head;
                 }
             };


             // abstract into io_system
             struct io_system
             {
                 ct::proxy_0_0_0_0::win::winsock m_winsock;
                 ct::proxy_0_0_0_0::win::iocp m_iocp;
                 std::vector<unsigned char> m_raw_buffer;
                 atomic_region m_atomic_region;

                 single_threaded_stack<per_io> m_per_io_pool;
                 single_threaded_stack<per_socket> m_per_socket_pool;

                 // need to ponder...
                 single_threaded_stack<per_socket> m_per_socket_active;




                 struct io_worker
                 {
                     io_system& m_system;

                     io_worker(
                         io_system& system

                     ) : m_system(system)
                     {

                     }


                     int
                     io_worker_loop()
                     {
                         return 0;
                     }
                 };


                 // well might as well use a C++ ctor here...
                 // ;^D
                 io_system(
                     std::size_t usable,
                     std::size_t align,
                     std::size_t prime_per_io_n,
                     std::size_t prime_per_socket_n
                 ):  m_raw_buffer(usable + align - 1)
                 {

                     region raw_region = { };
                     rinit(&raw_region, m_raw_buffer.data(), 
m_raw_buffer.size());

                     unsigned char* aligned_buffer =
                         static_cast<unsigned 
char*>(rallocex(&raw_region, usable, align));

                     m_atomic_region.init(aligned_buffer, usable);

                     // prime per-io
                     {
                         std::size_t n = prime_per_io_n;
                         region pool_reg = 
create_region_from_atomic(sizeof(per_io) * n);
                         for (int i = 0; i < n; ++i) {
                             per_io* p = 
static_cast<per_io*>(rallocex(&pool_reg, sizeof(*p), CT_PER_IO_ALIGN_PAD));
                             p->ctor(); // Ensure constructor is called
                             m_per_io_pool.push(p);
                         }
                     }

                     // prime per-socket
                     {
                         std::size_t n = prime_per_socket_n;
                         region pool_reg = 
create_region_from_atomic(sizeof(per_socket) * n);
                         for (int i = 0; i < n; ++i) {
                             per_socket* p = 
static_cast<per_socket*>(rallocex(&pool_reg, sizeof(*p), 
CT_PER_SOCKET_ALIGN_PAD));
                             p->ctor(); // Ensure constructor is called
                             m_per_socket_pool.push(p);
                         }
                     }
                 }

                 ~io_system()
                 {

                 }


                 region
                 create_region_from_atomic(
                     std::size_t usable
                 ) {
                     unsigned char* p = m_atomic_region.alloc(usable);
                     if (! p)
                     {
                         // time to fly...
                         return { nullptr };
                     }

                     region r = { };
                     rinit(&r, p, usable);
                     return r;
                 }


                 int
                 create_accept(
                     per_socket& listen_sock,      // also renamed for 
consistency
                     per_socket& accept_sock,      // <--- demon slain
                     per_io& pio
                 ) {
                     accept_sock.m_raw.m_socket = WSASocket(
                         AF_INET, SOCK_STREAM, IPPROTO_TCP,
                         nullptr, 0, WSA_FLAG_OVERLAPPED
                     );

                     if (accept_sock.m_raw.m_socket == INVALID_SOCKET)
                     {
                         std::cout << "create_accept WSASocket() failed: "
                             << WSAGetLastError() << "\n";
                         return 1;
                     }

                     std::cout << "accept_socket = " << 
accept_sock.m_raw.m_socket << "\n";

                     pio.m_raw.m_buf = accept_sock.m_raw.m_buf;
                     pio.m_raw.m_buf_n = accept_sock.m_raw.m_buf_n;

                     pio.m_raw.m_per_socket = &accept_sock;
                     pio.m_raw.m_state |= CT_PER_IO_STATE_ACCEPT;

                     DWORD bytes_received = 0;

                     BOOL ok = m_winsock.m_wsaex.m_acceptex(
                         listen_sock.m_raw.m_socket,
                         accept_sock.m_raw.m_socket,
                         pio.m_raw.m_buf,
                         0,
                         sizeof(SOCKADDR_IN) + 16,
                         sizeof(SOCKADDR_IN) + 16,
                         &bytes_received,
                         &pio.m_raw.m_ol
                     );

                     if (!ok && WSAGetLastError() != ERROR_IO_PENDING)
                     {
                         std::cout << "AcceptEx failed: " << 
WSAGetLastError() << "\n";
                         return 1;
                     }

                     std::cout << "AcceptEx posted!\n";
                     return 0;
                 }



                 void
                 complete_accept(
                     per_socket& listen_sock,      // renamed for 
consistency
                     per_io& pio
                 ) {
                     {
                         SOCKADDR* local_addr = nullptr;
                         SOCKADDR* remote_addr = nullptr;
                         int local_len = 0;
                         int remote_len = 0;

                         m_winsock.m_wsaex.m_getacceptexsockaddrs(
                             pio.m_raw.m_buf,
                             0,
                             sizeof(SOCKADDR_IN) + 16,
                             sizeof(SOCKADDR_IN) + 16,
                             &local_addr,
                             &local_len,
                             &remote_addr,
                             &remote_len
                         );

                         auto* local_in = 
reinterpret_cast<SOCKADDR_IN*>(local_addr);
                         auto* remote_in = 
reinterpret_cast<SOCKADDR_IN*>(remote_addr);

                         char addrbuf[INET6_ADDRSTRLEN] = { };

                         InetNtopA(
                             AF_INET,
                             &remote_in->sin_addr,
                             addrbuf,
                             sizeof(addrbuf)
                         );

                         std::cout << "client connected from "
                             << addrbuf << ":"
                             << ntohs(remote_in->sin_port) << "\n";


                     }

                     // fix up the accepted socket
                     int status = setsockopt(
                         pio.m_raw.m_per_socket->m_raw.m_socket,
                         SOL_SOCKET,
                         SO_UPDATE_ACCEPT_CONTEXT,
                         (char*)&listen_sock.m_raw.m_socket,
                         sizeof(SOCKET)
                     );

                     if (status)
                     {
                         // oh fuck me!
                         // throw; die die die! rofl. ;^D
                         return;
                     }

                     pio.m_raw.m_per_socket->m_raw.m_state.store(
                         CT_PER_SOCKET_STATE_CONNECTED,
                         std::memory_order_relaxed
                     );

                     // zero buffer before bind? ;^D Don't even need to, 
but...
                     pio.m_raw.m_per_socket->m_raw.m_raw_buffer = { 0 };

                     // bind the sucker!
                     m_iocp.bind(
                         (HANDLE)pio.m_raw.m_per_socket->m_raw.m_socket,
                         (ULONG_PTR)pio.m_raw.m_per_socket
                     );
                 }


                 void
                 create_listen(
                     addr_info& addr_info_,
                     per_socket& listen_sock
                 ) {
                     listen_sock.m_raw.m_socket = WSASocket(
                         addr_info_.m_result->ai_family,
                         addr_info_.m_result->ai_socktype,
                         addr_info_.m_result->ai_protocol,
                         nullptr, 0, WSA_FLAG_OVERLAPPED
                     );

                     if (listen_sock.m_raw.m_socket == INVALID_SOCKET)
                     {
                         std::cout << "WSASocket() for listen failed: " 
<< WSAGetLastError() << "\n";
                         return;
                     }

                     std::cout << "listen socket = " << 
listen_sock.m_raw.m_socket << "\n";

                     m_winsock.m_wsaex.load(listen_sock.m_raw.m_socket);

                     if (::bind(listen_sock.m_raw.m_socket,          // 
explicit ::bind
                         addr_info_.m_result->ai_addr,
                         (int)addr_info_.m_result->ai_addrlen) == 
SOCKET_ERROR)
                     {
                         std::cout << "bind() failed: " << 
WSAGetLastError() << "\n";
                         return;
                     }

                     if (listen(listen_sock.m_raw.m_socket, SOMAXCONN) 
== SOCKET_ERROR)
                     {
                         std::cout << "listen() failed: " << 
WSAGetLastError() << "\n";
                         return;
                     }

                     if (!m_iocp.bind(
                         (HANDLE)listen_sock.m_raw.m_socket,
                         (ULONG_PTR)&listen_sock
                     ))
                     {
                         std::cout << "IOCP associate failed: " << 
GetLastError() << "\n";
                         return;
                     }

                     std::cout << "Listen socket fully set up.\n";
                 }

                 int
                 issue_recv(
                     per_socket& socket,
                     per_io& pio
                 ) {
                     pio.m_raw.m_state |= CT_PER_IO_STATE_RECV;

                     WSABUF wbuf;
                     wbuf.buf = reinterpret_cast<char*>(pio.m_raw.m_buf);
                     wbuf.len = static_cast<ULONG>(pio.m_raw.m_buf_n);

                     DWORD flags = 0;
                     DWORD bytes = 0;

                     pio.m_raw.m_ol = WSAOVERLAPPED{};

                     int rc = WSARecv(
                         socket.m_raw.m_socket,
                         &wbuf,
                         1,
                         &bytes,
                         &flags,
                         &pio.m_raw.m_ol,
                         nullptr
                     );

                     if (rc == SOCKET_ERROR)
                     {
                         int err = WSAGetLastError();
                         if (err != WSA_IO_PENDING)
                         {
                             std::cout << "WSARecv failed: " << err << "\n";
                             return 1;
                         }
                     }

                     std::cout << "WSARecv posted\n";
                     return 0;

                 }


                 int
                 issue_send(
                     per_socket& socket,
                     per_io& pio
                 ) {

                     // mark this IO as a send
                     pio.m_raw.m_state |= CT_PER_IO_STATE_SEND;

                     WSABUF wbuf;
                     wbuf.buf = reinterpret_cast<char*>(pio.m_raw.m_buf);
                     wbuf.len = static_cast<ULONG>(pio.m_raw.m_buf_n);

                     DWORD bytes = 0;
                     DWORD flags = 0;

                     // reset OVERLAPPED for this op
                     pio.m_raw.m_ol = WSAOVERLAPPED{};

                     int rc = WSASend(
                         socket.m_raw.m_socket,
                         &wbuf,
                         1,
                         &bytes,
                         flags,
                         &pio.m_raw.m_ol,
                         nullptr
                     );

                     if (rc == SOCKET_ERROR)
                     {
                         int err = WSAGetLastError();
                         if (err != WSA_IO_PENDING)
                         {
                             std::cout << "WSASend failed: " << err << "\n";
                             return 1;
                         }
                     }

                     std::cout << "WSASend posted\n";
                     return 0;

                 }

             };



         }


         int
         manifest()
         {
             int manifest_state = 0;

             {
                 std::cout <<
                     "ct::proxy_0_0_0_0\n"
                     "ver (0.0.0.0) (pre-alpha)\n"
                     "by: Chris M. Thomasson\n"
                     "____________________________________" <<
                     std::endl;

                 {
                     // logic...

                     std::size_t iosys_usable = 1024 * 1024;
                     std::size_t iosys_prime_per_io = 16;
                     std::size_t iosys_prime_per_socket = 16;
                     std::size_t iosys_align = 8192;

                     ct::proxy_0_0_0_0::win::io_system iosys(
                         iosys_usable,
                         iosys_align,
                         iosys_prime_per_io,
                         iosys_prime_per_socket
                     );


                     {
                         struct ct::proxy_0_0_0_0::win::per_socket* 
psocket_listen =
                             iosys.m_per_socket_pool.pop_try();

                         if (! psocket_listen)
                         {
                             // oh fuck that!
                             //throw; ;^D
                             return 1;
                         }

                         ct::tools::dtor 
psocket_listen_raii(psocket_listen);

                         std::cout << "psocket_listen = " << 
psocket_listen << "\n";

                         {
                             ct::proxy_0_0_0_0::win::addr_info addr_info;
                             iosys.create_listen(addr_info, 
*psocket_listen);

                             struct ct::proxy_0_0_0_0::win::per_socket* 
psocket_accept =
                                 iosys.m_per_socket_pool.pop_try();

                             ct::tools::dtor 
psocket_accept_raii(psocket_accept);

                             std::cout << "psocket_accept = " << 
psocket_accept << "\n";

                             {
                                 struct ct::proxy_0_0_0_0::win::per_io* 
pio0 =
                                     iosys.m_per_io_pool.pop_try();

                                 if (! pio0)
                                 {
                                     // oh fuck that!
                                     //throw; ;^D
                                     return 1;
                                 }

                                 std::cout << "pio0 = " << pio0 << "\n";



                                 iosys.create_accept(*psocket_listen, 
*psocket_accept, *pio0);

                                 {
                                     // ADD THIS!
                                     std::cout << "waiting... telnet 
localhost 8080!\n";

                                     // ;^D 42 hard code. Need to ponder.
                                     OVERLAPPED_ENTRY pol[42] = { { } };
                                     ULONG pol_n = 0;

                                     // only recv 1...
                                     DWORD s = iosys.m_iocp.gqcsex(pol, 
1, &pol_n, INFINITE);

                                     if (pol_n > 0)
                                     {
                                         // need a loop here... ;^) But

                                         ct::proxy_0_0_0_0::win::per_io* 
pio =
  
(ct::proxy_0_0_0_0::win::per_io*)pol[0].lpOverlapped;

                                         std::cout << "socket match: " 
<< (pio->m_raw.m_per_socket == psocket_accept ? "YES!!!" : "NO!!!") << "\n";
                                     }

                                     if (s == 0)
                                     {
                                         ct::proxy_0_0_0_0::win::per_io* 
pio =
  
(ct::proxy_0_0_0_0::win::per_io*)pol[0].lpOverlapped;

                                         std::cout << "gqcsex fired!\n";
                                         std::cout << "pio  = " << pio 
<< "\n";
                                         std::cout << "pio0 = " << pio0 
<< "\n";
                                         std::cout << "match: " << (pio 
== pio0 ? "YES!!!" : "NO!!!") << "\n";
                                         std::cout << "WE HAVE A 
CONNECTION!!!\n";

                                         if (pio->m_raw.m_state & 
CT_PER_IO_STATE_ACCEPT)
                                         {
                                             std::cout << "accepted 
per_socket " << pio->m_raw.m_per_socket << "\n";


  
iosys.complete_accept(*psocket_listen, *pio);


                                             std::cout << 
"CT_PER_IO_STATE_ACCEPT\n";

                                             // 
pio->m_raw.m_per_socket->issue_wsa_recv(*pio);
  
iosys.issue_recv(*pio->m_raw.m_per_socket, *pio);
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }

                 std::cout <<
                     "manifest_state = " << manifest_state << "\n";

                 std::cout << "____________________________________" <<
                     std::endl;
             }


             return manifest_state;
         }
     }
}




int main()
{
     int main_state = 0;

     std::cout <<
         "ct_proxy\n"
         "ver (0.0.0.0) (pre-alpha)\n"
         "by: Chris M. Thomasson\n"
         "getting back to my old IOCP work...\n"
         "________________________________________________\n" <<
         std::endl;

     {
         int state = ct::proxy_0_0_0_0::manifest();

         {
             // ponder on state. Some failures can be success... ;^)
         }

         main_state = state;
     }

     std::cout <<
         "\n________________________________________________\n" <<
         "main_state = " << main_state <<
         "\nfin" <<
         std::endl;

     return EXIT_SUCCESS;
}


Back to comp.lang.c++ | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

How to inline the main function of a thread? Wuns Haerst <Wuns.Haerst@wurstfabrik.at> - 2026-06-30 10:27 +0200
  Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-06-30 01:42 -0700
    Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-06-30 10:44 +0000
      Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-01 12:23 -0700
        Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-02 08:13 +0000
          Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-02 11:41 -0700
            Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-03 08:59 +0000
              Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-03 14:41 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-03 15:59 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 13:22 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-06 09:29 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-06 12:31 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-07 10:41 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-07 15:30 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-08 09:38 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-08 14:13 -0700
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-03 12:44 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-03 12:45 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-04 09:16 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-04 17:32 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-04 17:35 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-05 08:19 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 01:21 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-05 15:48 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 13:01 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-06 09:28 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-06 21:42 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-06 12:45 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-06 12:53 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-07 15:07 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-07 10:40 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-07 20:36 +0300
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-07 18:09 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-07 21:40 +0300
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-07 22:11 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-08 09:34 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-08 22:16 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-08 14:16 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-09 08:55 +0000
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-09 15:18 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-09 15:43 +0000
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-10 15:32 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 16:03 +0000
                Re: How to inline the main function of a thread? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2026-07-09 14:07 -0700
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-10 15:34 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-09 22:15 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 09:21 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-10 14:02 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 11:22 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-10 14:45 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 15:12 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-10 18:43 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 16:06 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-10 19:13 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-11 09:28 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-11 14:41 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-12 15:23 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-13 13:12 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-14 11:05 +0000
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-14 14:31 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-14 15:42 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 15:33 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 15:33 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-08 14:15 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-09 08:55 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-09 12:51 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 09:22 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-10 14:22 +0300
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 11:24 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 12:32 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-11 09:29 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-11 14:09 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-12 15:15 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-12 10:58 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-13 09:39 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-13 13:14 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 13:16 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-06 09:29 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-06 12:49 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-07 10:41 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-07 15:17 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-08 09:38 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-08 14:17 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-09 08:56 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-09 12:53 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 09:24 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 13:36 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-11 09:30 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-11 14:08 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-07 15:19 -0700
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-04 23:36 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-05 08:21 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 01:22 -0700
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-05 14:39 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-05 15:50 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-12 11:22 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-05 15:49 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 00:16 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-10 09:25 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-10 15:36 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-11 09:32 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-11 14:10 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-12 15:18 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-12 11:21 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-13 10:26 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-13 13:05 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-14 10:58 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-14 13:45 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-15 11:23 +0000
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-15 14:07 +0000
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-15 15:54 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-15 15:51 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-16 10:44 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-16 12:37 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-17 09:26 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-17 13:32 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-17 12:00 -0700
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-18 23:12 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-18 17:15 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-18 17:18 -0700
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-19 04:56 +0300
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-19 05:00 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-19 13:54 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-19 07:57 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-19 13:54 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-19 13:57 -0700
                Re: How to inline the main function of a thread? boltar@battlestar-galactica.com - 2026-07-20 07:51 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-20 13:15 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-18 17:37 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-16 12:40 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-17 09:27 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-19 13:55 -0700
                Re: How to inline the main function of a thread? boltar@battlestar-galactica.com - 2026-07-20 07:49 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-20 13:16 -0700
                Re: How to inline the main function of a thread? boltar@battlestar-galactica.com - 2026-07-21 15:55 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-21 13:47 -0700
                Re: How to inline the main function of a thread? boltar@battlestar-galactica.com - 2026-07-21 21:13 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-21 14:28 -0700
                Re: How to inline the main function of a thread? boltar@battlestar.co.uk - 2026-07-22 08:01 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-22 13:28 -0700
                Re: How to inline the main function of a thread? boltar@battlestar.co.uk - 2026-07-23 15:01 +0000
                Re: How to inline the main function of a thread? cross@spitfire.i.gajendra.net (Dan Cross) - 2026-07-22 01:53 +0000
                Re: How to inline the main function of a thread? boltar@battlestar.co.uk - 2026-07-22 08:02 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-22 13:30 -0700
                Re: How to inline the main function of a thread? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2026-07-22 16:02 -0700
                Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-23 15:00 +0000
                Re: How to inline the main function of a thread? boltar@caprica.space - 2026-07-23 15:05 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-11 14:11 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-12 15:19 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-12 11:02 -0700
                Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-13 09:42 +0000
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-16 13:50 -0700
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-12 23:05 +0300
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-13 13:08 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-16 13:56 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-16 13:58 -0700
            Re: How to inline the main function of a thread? Ross Finlayson <ross.a.finlayson@gmail.com> - 2026-07-03 10:45 -0700
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-03 12:36 -0700
          Re: How to inline the main function of a thread? Tristan Wibberley <tristan.wibberley+netnews2@alumni.manchester.ac.uk> - 2026-07-28 12:50 +0100
  Re: How to inline the main function of a thread? David Brown <david.brown@hesbynett.no> - 2026-06-30 11:07 +0200
    Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-06-30 10:46 +0000
      Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-01 12:25 -0700
        Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-02 08:13 +0000
  Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-06-30 10:41 +0000
  Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-06-30 14:14 +0000
    Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-06-30 16:30 +0200
      Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-06-30 15:25 +0000
        Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-01 12:30 -0700
        Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-05 14:03 +0200
          Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-05 14:41 +0000
            Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-05 20:08 +0200
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 13:05 -0700
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 14:03 -0700
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-05 14:36 -0700
              Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-07-06 17:47 +0000
                Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-06 21:49 +0300
                Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-08 15:47 +0200
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-08 14:32 -0700
                Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-09 10:34 +0200
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-09 13:01 -0700
                Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-10 05:58 +0200
                Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-12 11:19 -0700
                Re: How to inline the main function of a thread? Bonita Montero <Bonita.Montero@gmail.com> - 2026-07-17 13:56 +0200
      Re: How to inline the main function of a thread? Tristan Wibberley <tristan.wibberley+netnews2@alumni.manchester.ac.uk> - 2026-07-28 13:31 +0100
    Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-06-30 15:39 +0000
      Re: How to inline the main function of a thread? Wuns Haerst <Wuns.Haerst@wurstfabrik.at> - 2026-06-30 18:00 +0200
        Re: How to inline the main function of a thread? scott@slp53.sl.home (Scott Lurndal) - 2026-06-30 17:05 +0000
          Re: How to inline the main function of a thread? boltar@caprica.universe - 2026-07-01 08:22 +0000
            Re: How to inline the main function of a thread? Tristan Wibberley <tristan.wibberley+netnews2@alumni.manchester.ac.uk> - 2026-07-28 14:43 +0100
              Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-28 12:31 -0700
              Re: How to inline the main function of a thread? boltar@uxvz2mpj0o8fzg70vyzzcf46nvx2.biz - 2026-07-29 08:36 +0000
  Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-06-30 23:29 +0300
    Re: How to inline the main function of a thread? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-07-04 23:47 -0700
  Re: How to inline the main function of a thread? Wuns Haerst <Wuns.Haerst@wurstfabrik.at> - 2026-07-17 13:45 +0200
    Re: How to inline the main function of a thread? Michael S <already5chosen@yahoo.com> - 2026-07-17 15:23 +0300

csiph-web