NVIDIA DeepStream SDK API Reference

9.2 Release
includes/opentelemetry/ext/http/server/socket_tools.h
Go to the documentation of this file.
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3 #pragma once
4 
5 #include <algorithm>
6 #include <atomic>
7 #include <cassert>
8 #include <cstddef>
9 #include <cstring>
10 #include <iostream>
11 #include <map>
12 #include <sstream>
13 #include <string>
14 #include <thread>
15 #include <vector>
16 
17 #ifdef _WIN32
18 
19 // # include <Windows.h>
20 
21 # include <winsock2.h>
22 
23 // TODO: consider NOMINMAX
24 # undef min
25 # undef max
26 # pragma comment(lib, "ws2_32.lib")
27 
28 #else
29 
30 # include <unistd.h>
31 
32 # ifdef __linux__
33 # include <sys/epoll.h>
34 # endif
35 
36 # ifdef __APPLE__
37 # include "TargetConditionals.h"
38 // Use kqueue on mac
39 # include <sys/event.h>
40 # include <sys/time.h>
41 # include <sys/types.h>
42 # endif
43 
44 // Common POSIX headers for Linux and Mac OS X
45 # include <arpa/inet.h>
46 # include <fcntl.h>
47 # include <netdb.h>
48 # include <netinet/in.h>
49 # include <netinet/tcp.h>
50 # include <sys/socket.h>
51 
52 #endif
53 
54 #ifndef _Out_cap_
55 # define _Out_cap_(size)
56 #endif
57 
58 #if defined(HAVE_CONSOLE_LOG) && !defined(LOG_DEBUG)
59 // Log to console if there's no standard log facility defined
60 # include <cstdio>
61 # ifndef LOG_DEBUG
62 # define LOG_DEBUG(fmt_, ...) printf(" " fmt_ "\n", ##__VA_ARGS__)
63 # define LOG_TRACE(fmt_, ...) printf(" " fmt_ "\n", ##__VA_ARGS__)
64 # define LOG_INFO(fmt_, ...) printf(" " fmt_ "\n", ##__VA_ARGS__)
65 # define LOG_WARN(fmt_, ...) printf(" " fmt_ "\n", ##__VA_ARGS__)
66 # define LOG_ERROR(fmt_, ...) printf(" " fmt_ "\n", ##__VA_ARGS__)
67 # endif
68 #endif
69 
70 #ifndef LOG_DEBUG
71 // Don't log anything if there's no standard log facility defined
72 # define LOG_DEBUG(fmt_, ...)
73 # define LOG_TRACE(fmt_, ...)
74 # define LOG_INFO(fmt_, ...)
75 # define LOG_WARN(fmt_, ...)
76 # define LOG_ERROR(fmt_, ...)
77 #endif
78 
79 namespace common
80 {
81 
85 struct Thread
86 {
87  std::thread m_thread;
88 
89  std::atomic<bool> m_terminate{false};
90 
95  Thread() {}
96 
100  void startThread()
101  {
102  m_terminate = false;
103  m_thread = std::thread([&]() { this->onThread(); });
104  }
105 
109  void joinThread()
110  {
111  m_terminate = true;
112  if (m_thread.joinable())
113  {
114  m_thread.join();
115  }
116  }
117 
122  bool shouldTerminate() const { return m_terminate; }
123 
127  virtual void onThread() = 0;
128 
133  virtual ~Thread() noexcept {}
134 };
135 
136 } // namespace common
137 namespace SocketTools
138 {
139 
140 #ifdef _WIN32
141 // WinSocks need extra (de)initialization, solved by a global object here,
142 // whose constructor/destructor will be called before and after main().
143 struct WsaInitializer
144 {
145  WsaInitializer()
146  {
147  WSADATA wsaData;
148  WSAStartup(MAKEWORD(2, 2), &wsaData);
149  }
150 
151  ~WsaInitializer() { WSACleanup(); }
152 };
153 
154 static WsaInitializer g_wsaInitializer;
155 
156 #endif
157 
162 {
163  static u_long const Loopback = 0x7F000001;
164 
165  sockaddr m_data;
166 
171  SocketAddr() { memset(&m_data, 0, sizeof(m_data)); }
172 
173  SocketAddr(u_long addr, int port)
174  {
175  sockaddr_in &inet4 = reinterpret_cast<sockaddr_in &>(m_data);
176  inet4.sin_family = AF_INET;
177  inet4.sin_port = htons(static_cast<unsigned short>(port));
178  inet4.sin_addr.s_addr = htonl(addr);
179  }
180 
181  SocketAddr(char const *addr)
182  {
183 #ifdef _WIN32
184  INT addrlen = sizeof(m_data);
185  WCHAR buf[200];
186  for (int i = 0; i < sizeof(buf) && addr[i]; i++)
187  {
188  buf[i] = addr[i];
189  }
190  buf[199] = L'\0';
191  ::WSAStringToAddressW(buf, AF_INET, nullptr, &m_data, &addrlen);
192 #else
193  sockaddr_in &inet4 = reinterpret_cast<sockaddr_in &>(m_data);
194  inet4.sin_family = AF_INET;
195  char const *colon = strchr(addr, ':');
196  if (colon)
197  {
198  inet4.sin_port = htons(atoi(colon + 1));
199  char buf[16];
200  memcpy(buf, addr, (std::min<ptrdiff_t>)(15, colon - addr));
201  buf[15] = '\0';
202  ::inet_pton(AF_INET, buf, &inet4.sin_addr);
203  }
204  else
205  {
206  inet4.sin_port = 0;
207  ::inet_pton(AF_INET, addr, &inet4.sin_addr);
208  }
209 #endif
210  }
211 
212  SocketAddr(SocketAddr const &other) = default;
213 
214  SocketAddr &operator=(SocketAddr const &other) = default;
215 
216  operator sockaddr *() { return &m_data; }
217 
218  operator const sockaddr *() const { return &m_data; }
219 
220  int port() const
221  {
222  switch (m_data.sa_family)
223  {
224  case AF_INET: {
225  sockaddr_in const &inet4 = reinterpret_cast<sockaddr_in const &>(m_data);
226  return ntohs(inet4.sin_port);
227  }
228 
229  default:
230  return -1;
231  }
232  }
233 
234  std::string toString() const
235  {
236  std::ostringstream os;
237 
238  switch (m_data.sa_family)
239  {
240  case AF_INET: {
241  sockaddr_in const &inet4 = reinterpret_cast<sockaddr_in const &>(m_data);
242  u_long addr = ntohl(inet4.sin_addr.s_addr);
243  os << (addr >> 24) << '.' << ((addr >> 16) & 255) << '.' << ((addr >> 8) & 255) << '.'
244  << (addr & 255);
245  os << ':' << ntohs(inet4.sin_port);
246  break;
247  }
248 
249  default:
250  os << "[?AF?" << m_data.sa_family << ']';
251  }
252  return os.str();
253  }
254 };
255 
259 struct Socket
260 {
261 #ifdef _WIN32
262  typedef SOCKET Type;
263  static Type const Invalid = INVALID_SOCKET;
264 #else
265  typedef int Type;
266  static Type const Invalid = -1;
267 #endif
268 
270 
271  Socket(Type sock = Invalid) : m_sock(sock) {}
272 
273  Socket(int af, int type, int proto) : m_sock(::socket(af, type, proto)) {}
274 
275  ~Socket() {}
276 
277  operator Socket::Type() const { return m_sock; }
278 
279  bool operator==(Socket const &other) const { return (m_sock == other.m_sock); }
280 
281  bool operator!=(Socket const &other) const { return (m_sock != other.m_sock); }
282 
283  bool operator<(Socket const &other) const { return (m_sock < other.m_sock); }
284 
285  bool invalid() const { return (m_sock == Invalid); }
286 
288  {
289  assert(m_sock != Invalid);
290 #ifdef _WIN32
291  u_long value = 1;
292  ::ioctlsocket(m_sock, FIONBIO, &value);
293 #else
294  int flags = ::fcntl(m_sock, F_GETFL, 0);
295  ::fcntl(m_sock, F_SETFL, flags | O_NONBLOCK);
296 #endif
297  }
298 
300  {
301  assert(m_sock != Invalid);
302 #ifdef _WIN32
303  BOOL value = TRUE;
304 #else
305  int value = 1;
306 #endif
307  return (::setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&value),
308  sizeof(value)) == 0);
309  }
310 
311  bool setNoDelay()
312  {
313  assert(m_sock != Invalid);
314 #ifdef _WIN32
315  BOOL value = TRUE;
316 #else
317  int value = 1;
318 #endif
319  return (::setsockopt(m_sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<char *>(&value),
320  sizeof(value)) == 0);
321  }
322 
323  bool connect(SocketAddr const &addr)
324  {
325  assert(m_sock != Invalid);
326  return (::connect(m_sock, addr, sizeof(addr)) == 0);
327  }
328 
329  void close()
330  {
331  assert(m_sock != Invalid);
332 #ifdef _WIN32
333  ::closesocket(m_sock);
334 #else
335  ::close(m_sock);
336 #endif
337  m_sock = Invalid;
338  }
339 
340  int recv(_Out_cap_(size) void *buffer, unsigned size)
341  {
342  assert(m_sock != Invalid);
343  int flags = 0;
344  return static_cast<int>(::recv(m_sock, reinterpret_cast<char *>(buffer), size, flags));
345  }
346 
347  int send(void const *buffer, unsigned size)
348  {
349  assert(m_sock != Invalid);
350  return static_cast<int>(::send(m_sock, reinterpret_cast<char const *>(buffer), size, 0));
351  }
352 
353  bool bind(SocketAddr const &addr)
354  {
355  assert(m_sock != Invalid);
356  return (::bind(m_sock, addr, sizeof(addr)) == 0);
357  }
358 
359  bool getsockname(SocketAddr &addr) const
360  {
361  assert(m_sock != Invalid);
362 #ifdef _WIN32
363  int addrlen = sizeof(addr);
364 #else
365  socklen_t addrlen = sizeof(addr);
366 #endif
367  return (::getsockname(m_sock, addr, &addrlen) == 0);
368  }
369 
370  bool listen(int backlog)
371  {
372  assert(m_sock != Invalid);
373  return (::listen(m_sock, backlog) == 0);
374  }
375 
376  bool accept(Socket &csock, SocketAddr &caddr)
377  {
378  assert(m_sock != Invalid);
379 #ifdef _WIN32
380  int addrlen = sizeof(caddr);
381 #else
382  socklen_t addrlen = sizeof(caddr);
383 #endif
384  csock = ::accept(m_sock, caddr, &addrlen);
385  return !csock.invalid();
386  }
387 
388  bool shutdown(int how)
389  {
390  assert(m_sock != Invalid);
391  return (::shutdown(m_sock, how) == 0);
392  }
393 
394  int error() const
395  {
396 #ifdef _WIN32
397  return ::WSAGetLastError();
398 #else
399  return errno;
400 #endif
401  }
402 
403  enum
404  {
405 #ifdef _WIN32
406  ErrorWouldBlock = WSAEWOULDBLOCK
407 #else
408  ErrorWouldBlock = EWOULDBLOCK
409 #endif
410  };
411 
412  enum
413  {
414 #ifdef _WIN32
415  ShutdownReceive = SD_RECEIVE,
416  ShutdownSend = SD_SEND,
417  ShutdownBoth = SD_BOTH
418 #else
419  ShutdownReceive = SHUT_RD,
420  ShutdownSend = SHUT_WR,
421  ShutdownBoth = SHUT_RDWR
422 #endif
423  };
424 };
425 
430 {
432  int flags;
433 
434  SocketData() : socket(), flags(0) {}
435 
436  bool operator==(Socket s) { return (socket == s); }
437 };
438 
442 struct Reactor : protected common::Thread
443 {
448  {
449  public:
450  SocketCallback() = default;
451  virtual ~SocketCallback() = default;
452  virtual void onSocketReadable(Socket sock) = 0;
453  virtual void onSocketWritable(Socket sock) = 0;
454  virtual void onSocketAcceptable(Socket sock) = 0;
455  virtual void onSocketClosed(Socket sock) = 0;
456  };
457 
461  enum State
462  {
463  Readable = 1,
464  Writable = 2,
466  Closed = 8
467  };
468 
470 
471  std::vector<SocketData> m_sockets;
472 
473 #ifdef _WIN32
474  /* use WinSock events on Windows */
475  std::vector<WSAEVENT> m_events{};
476 #endif
477 
478 #ifdef __linux__
479  /* use epoll on Linux */
480  int m_epollFd;
481 #endif
482 
483 #ifdef TARGET_OS_MAC
484  /* use kqueue on Mac */
485 # define KQUEUE_SIZE 32
486  int kq{0};
487  struct kevent m_events[KQUEUE_SIZE];
488 #endif
489 
490 public:
491  Reactor(SocketCallback &callback) : m_callback(callback)
492  {
493 #ifdef __linux__
494 # ifdef ANDROID
495  m_epollFd = ::epoll_create(0);
496 # else
497  m_epollFd = ::epoll_create1(0);
498 # endif
499 #endif
500 
501 #ifdef TARGET_OS_MAC
502  bzero(&m_events[0], sizeof(m_events));
503  kq = kqueue();
504 #endif
505  }
506 
507  ~Reactor() override
508  {
509 #ifdef __linux__
510  ::close(m_epollFd);
511 #endif
512 #ifdef TARGET_OS_MAC
513  ::close(kq);
514 #endif
515  }
516 
522  void addSocket(const Socket &socket, int flags)
523  {
524  if (flags == 0)
525  {
526  removeSocket(socket);
527  }
528  else
529  {
530  auto it = std::find(m_sockets.begin(), m_sockets.end(), socket);
531  if (it == m_sockets.end())
532  {
533  LOG_TRACE("Reactor: Adding socket 0x%x with flags 0x%x", static_cast<int>(socket), flags);
534 #ifdef _WIN32
535  m_events.push_back(::WSACreateEvent());
536 #endif
537 #ifdef __linux__
538  epoll_event event = {};
539  event.data.fd = socket;
540  event.events = 0;
541  ::epoll_ctl(m_epollFd, EPOLL_CTL_ADD, socket, &event);
542 #endif
543 #ifdef TARGET_OS_MAC
544  struct kevent event;
545  bzero(&event, sizeof(event));
546  event.ident = socket.m_sock;
547  EV_SET(&event, event.ident, EVFILT_READ, EV_ADD, 0, 0, NULL);
548  kevent(kq, &event, 1, NULL, 0, NULL);
549  EV_SET(&event, event.ident, EVFILT_WRITE, EV_ADD, 0, 0, NULL);
550  kevent(kq, &event, 1, NULL, 0, NULL);
551 #endif
552  m_sockets.push_back(SocketData());
553  m_sockets.back().socket = socket;
554  m_sockets.back().flags = 0;
555  it = m_sockets.end() - 1;
556  }
557  else
558  {
559  LOG_TRACE("Reactor: Updating socket 0x%x with flags 0x%x", static_cast<int>(socket), flags);
560  }
561 
562  if (it->flags != flags)
563  {
564  it->flags = flags;
565 #ifdef _WIN32
566  long lNetworkEvents = 0;
567  if (it->flags & Readable)
568  {
569  lNetworkEvents |= FD_READ;
570  }
571  if (it->flags & Writable)
572  {
573  lNetworkEvents |= FD_WRITE;
574  }
575  if (it->flags & Acceptable)
576  {
577  lNetworkEvents |= FD_ACCEPT;
578  }
579  if (it->flags & Closed)
580  {
581  lNetworkEvents |= FD_CLOSE;
582  }
583  auto eventIt = m_events.begin() + std::distance(m_sockets.begin(), it);
584  ::WSAEventSelect(socket, *eventIt, lNetworkEvents);
585 #endif
586 #ifdef __linux__
587  int events = 0;
588  if (it->flags & Readable)
589  {
590  events |= EPOLLIN;
591  }
592  if (it->flags & Writable)
593  {
594  events |= EPOLLOUT;
595  }
596  if (it->flags & Acceptable)
597  {
598  events |= EPOLLIN;
599  }
600  // if (it->flags & Closed) - always handled (EPOLLERR | EPOLLHUP)
601  epoll_event event = {};
602  event.data.fd = socket;
603  event.events = events;
604  ::epoll_ctl(m_epollFd, EPOLL_CTL_MOD, socket, &event);
605 #endif
606 #ifdef TARGET_OS_MAC
607  // TODO: [MG] - Mac OS X socket doesn't currently support updating flags
608 #endif
609  }
610  }
611  }
612 
617  void removeSocket(const Socket &socket)
618  {
619  LOG_TRACE("Reactor: Removing socket 0x%x", static_cast<int>(socket));
620  auto it = std::find(m_sockets.begin(), m_sockets.end(), socket);
621  if (it != m_sockets.end())
622  {
623 #ifdef _WIN32
624  auto eventIt = m_events.begin() + std::distance(m_sockets.begin(), it);
625  ::WSAEventSelect(it->socket, *eventIt, 0);
626  ::WSACloseEvent(*eventIt);
627  m_events.erase(eventIt);
628 #endif
629 #ifdef __linux__
630  ::epoll_ctl(m_epollFd, EPOLL_CTL_DEL, socket, nullptr);
631 #endif
632 #ifdef TARGET_OS_MAC
633  struct kevent event;
634  bzero(&event, sizeof(event));
635  event.ident = socket;
636  EV_SET(&event, socket, EVFILT_READ, EV_DELETE, 0, 0, NULL);
637  if (-1 == kevent(kq, &event, 1, NULL, 0, NULL))
638  {
640  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
641  }
642  EV_SET(&event, socket, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
643  if (-1 == kevent(kq, &event, 1, NULL, 0, NULL))
644  {
646  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
647  }
648 #endif
649  m_sockets.erase(it);
650  }
651  }
652 
656  void start()
657  {
658  LOG_INFO("Reactor: Starting...");
659  startThread();
660  }
661 
665  void stop()
666  {
667  LOG_INFO("Reactor: Stopping...");
668  joinThread();
669 #ifdef _WIN32
670  for (auto &hEvent : m_events)
671  {
672  ::WSACloseEvent(hEvent);
673  }
674 #else /* Linux and Mac */
675  for (auto &sd : m_sockets)
676  {
677 # ifdef __linux__
678  ::epoll_ctl(m_epollFd, EPOLL_CTL_DEL, sd.socket, nullptr);
679 # endif
680 # ifdef TARGET_OS_MAC
681  struct kevent event;
682  bzero(&event, sizeof(event));
683  event.ident = sd.socket;
684  EV_SET(&event, sd.socket, EVFILT_READ, EV_DELETE, 0, 0, NULL);
685  if (-1 == kevent(kq, &event, 1, NULL, 0, NULL))
686  {
687  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
688  }
689  EV_SET(&event, sd.socket, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
690  if (-1 == kevent(kq, &event, 1, NULL, 0, NULL))
691  {
692  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
693  }
694 # endif
695  }
696 #endif
697  m_sockets.clear();
698  }
699 
703  virtual void onThread() override
704  {
705  LOG_INFO("Reactor: Thread started");
706  while (!shouldTerminate())
707  {
708 #ifdef _WIN32
709  DWORD dwResult = ::WSAWaitForMultipleEvents(static_cast<DWORD>(m_events.size()),
710  m_events.data(), FALSE, 500, FALSE);
711  if (dwResult == WSA_WAIT_TIMEOUT)
712  {
713  continue;
714  }
715 
716  assert(dwResult <= WSA_WAIT_EVENT_0 + m_events.size());
717  int index = dwResult - WSA_WAIT_EVENT_0;
718  Socket socket = m_sockets[index].socket;
719  int flags = m_sockets[index].flags;
720 
721  WSANETWORKEVENTS ne;
722  ::WSAEnumNetworkEvents(socket, m_events[index], &ne);
723  LOG_TRACE(
724  "Reactor: Handling socket 0x%x (index %d) with active flags 0x%x "
725  "(armed 0x%x)",
726  static_cast<int>(socket), index, ne.lNetworkEvents, flags);
727 
728  if ((flags & Readable) && (ne.lNetworkEvents & FD_READ))
729  {
731  }
732  if ((flags & Writable) && (ne.lNetworkEvents & FD_WRITE))
733  {
735  }
736  if ((flags & Acceptable) && (ne.lNetworkEvents & FD_ACCEPT))
737  {
739  }
740  if ((flags & Closed) && (ne.lNetworkEvents & FD_CLOSE))
741  {
742  m_callback.onSocketClosed(socket);
743  }
744 #endif
745 
746 #ifdef __linux__
747  epoll_event events[4];
748  int result = ::epoll_wait(m_epollFd, events, sizeof(events) / sizeof(events[0]), 500);
749  if (result == 0 || (result == -1 && errno == EINTR))
750  {
751  continue;
752  }
753 
754  assert(result >= 1 && static_cast<size_t>(result) <= sizeof(events) / sizeof(events[0]));
755  for (int i = 0; i < result; i++)
756  {
757  auto it = std::find(m_sockets.begin(), m_sockets.end(), events[i].data.fd);
758  assert(it != m_sockets.end());
759  Socket socket = it->socket;
760  int flags = it->flags;
761 
762  LOG_TRACE("Reactor: Handling socket 0x%x active flags 0x%x (armed 0x%x)",
763  static_cast<int>(socket), events[i].events, flags);
764 
765  if ((flags & Readable) && (events[i].events & EPOLLIN))
766  {
768  }
769  if ((flags & Writable) && (events[i].events & EPOLLOUT))
770  {
772  }
773  if ((flags & Acceptable) && (events[i].events & EPOLLIN))
774  {
776  }
777  if ((flags & Closed) && (events[i].events & (EPOLLHUP | EPOLLERR)))
778  {
779  m_callback.onSocketClosed(socket);
780  }
781  }
782 #endif
783 
784 #if defined(TARGET_OS_MAC)
785  unsigned waitms = 500; // never block for more than 500ms
786  struct timespec timeout;
787  timeout.tv_sec = waitms / 1000;
788  timeout.tv_nsec = (waitms % 1000) * 1000 * 1000;
789 
790  int nev = kevent(kq, NULL, 0, m_events, KQUEUE_SIZE, &timeout);
791  for (int i = 0; i < nev; i++)
792  {
793  struct kevent &event = m_events[i];
794  int fd = (int)event.ident;
795  auto it = std::find(m_sockets.begin(), m_sockets.end(), fd);
796  assert(it != m_sockets.end());
797  Socket socket = it->socket;
798  int flags = it->flags;
799 
800  LOG_TRACE("Handling socket 0x%x active flags 0x%x (armed 0x%x)", static_cast<int>(socket),
801  event.flags, event.fflags);
802 
803  if (event.filter == EVFILT_READ)
804  {
805  if (flags & Acceptable)
806  {
808  }
809  if (flags & Readable)
810  {
812  }
813  continue;
814  }
815 
816  if (event.filter == EVFILT_WRITE)
817  {
818  if (flags & Writable)
819  {
821  }
822  continue;
823  }
824 
825  if ((event.flags & EV_EOF) || (event.flags & EV_ERROR))
826  {
827  LOG_TRACE("event.filter=%s", "EVFILT_WRITE");
828  m_callback.onSocketClosed(socket);
829  it->flags = Closed;
830  struct kevent kevt;
831  EV_SET(&kevt, event.ident, EVFILT_READ, EV_DELETE, 0, 0, NULL);
832  if (-1 == kevent(kq, &kevt, 1, NULL, 0, NULL))
833  {
834  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
835  }
836  EV_SET(&kevt, event.ident, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
837  if (-1 == kevent(kq, &kevt, 1, NULL, 0, NULL))
838  {
839  LOG_ERROR("cannot delete fd=0x%x from kqueue!", event.ident);
840  }
841  continue;
842  }
843  LOG_ERROR("Reactor: unhandled kevent!");
844  }
845 #endif
846  }
847  LOG_TRACE("Reactor: Thread done");
848  }
849 };
850 
851 } // namespace SocketTools
SocketTools::Socket::listen
bool listen(int backlog)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:370
SocketTools::SocketAddr::SocketAddr
SocketAddr(char const *addr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:181
SocketTools::Socket::Socket
Socket(Type sock=Invalid)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:271
SocketTools::Reactor::SocketCallback::~SocketCallback
virtual ~SocketCallback()=default
SocketTools::Socket::invalid
bool invalid() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:285
common::Thread::joinThread
void joinThread()
Join Thread
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:109
FALSE
#define FALSE
Definition: sources/libs/nvll_batch_jpeg_encode/oss/jmorecfg.h:247
pydeepstreamdoc::node::NodeDoc::find
constexpr const char * find
Definition: service-maker/sources/python/src/bindings/docstrings/nodedoc.h:38
SocketTools
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:137
SocketTools::Reactor::Closed
@ Closed
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:466
LOG_ERROR
#define LOG_ERROR(fmt_,...)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:76
SocketTools::Socket::setNonBlocking
void setNonBlocking()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:287
SocketTools::Socket::Socket
Socket(int af, int type, int proto)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:273
common::Thread::startThread
void startThread()
Start Thread
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:100
SocketTools::Socket::ErrorWouldBlock
@ ErrorWouldBlock
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:408
SocketTools::Socket::close
void close()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:329
SocketTools::SocketAddr::SocketAddr
SocketAddr()
SocketAddr constructor
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:171
SocketTools::SocketAddr::port
int port() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:220
common::Thread::m_thread
std::thread m_thread
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:87
SocketTools::Reactor
Socket Reactor
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:442
SocketTools::Reactor::SocketCallback::onSocketAcceptable
virtual void onSocketAcceptable(Socket sock)=0
SocketTools::SocketData
Socket Data
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:429
SocketTools::SocketAddr::Loopback
static const u_long Loopback
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:163
LOG_TRACE
#define LOG_TRACE(fmt_,...)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:73
SocketTools::SocketAddr
Encapsulation of sockaddr(_in)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:161
SocketTools::Reactor::onThread
virtual void onThread() override
Thread Loop for async events processing
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:703
SocketTools::Socket::~Socket
~Socket()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:275
SocketTools::SocketData::flags
int flags
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:432
SocketTools::Socket::m_sock
Type m_sock
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:269
SocketTools::Socket::Invalid
static const Type Invalid
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:266
common::Thread::m_terminate
std::atomic< bool > m_terminate
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:89
TRUE
#define TRUE
Definition: sources/libs/nvll_batch_jpeg_encode/oss/jmorecfg.h:250
common::Thread::Thread
Thread()
Thread Constructor
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:95
SocketTools::Reactor::~Reactor
~Reactor() override
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:507
SocketTools::Socket::setNoDelay
bool setNoDelay()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:311
SocketTools::Socket::recv
int recv(_Out_cap_(size) void *buffer, unsigned size)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:340
SocketTools::Reactor::m_callback
SocketCallback & m_callback
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:469
SocketTools::Socket
Encapsulation of a socket (non-exclusive ownership)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:259
SocketTools::Reactor::SocketCallback::onSocketWritable
virtual void onSocketWritable(Socket sock)=0
_Out_cap_
#define _Out_cap_(size)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:55
SocketTools::SocketAddr::toString
std::string toString() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:234
common::Thread::shouldTerminate
bool shouldTerminate() const
Indicates if this thread should terminate
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:122
SocketTools::Reactor::m_sockets
std::vector< SocketData > m_sockets
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:471
SocketTools::Reactor::SocketCallback::onSocketClosed
virtual void onSocketClosed(Socket sock)=0
SocketTools::SocketData::socket
Socket socket
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:431
SocketTools::Reactor::removeSocket
void removeSocket(const Socket &socket)
Remove Socket
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:617
pydeepstreamdoc::tensor::TensorDoc::size
constexpr const char * size
Definition: service-maker/sources/python/src/bindings/docstrings/tensordoc.h:46
SocketTools::Socket::operator==
bool operator==(Socket const &other) const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:279
SocketTools::Reactor::Acceptable
@ Acceptable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:465
SocketTools::SocketAddr::SocketAddr
SocketAddr(u_long addr, int port)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:173
SocketTools::Socket::ShutdownBoth
@ ShutdownBoth
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:421
SocketTools::SocketAddr::m_data
sockaddr m_data
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:165
SocketTools::SocketData::SocketData
SocketData()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:434
SocketTools::Reactor::Writable
@ Writable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:464
SocketTools::Reactor::Readable
@ Readable
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:463
SocketTools::Reactor::SocketCallback::onSocketReadable
virtual void onSocketReadable(Socket sock)=0
SocketTools::Socket::shutdown
bool shutdown(int how)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:388
common::Thread::onThread
virtual void onThread()=0
Must be implemented by children
SocketTools::Socket::Type
int Type
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:265
SocketTools::Socket::ShutdownReceive
@ ShutdownReceive
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:419
SocketTools::SocketData::operator==
bool operator==(Socket s)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:436
SocketTools::Reactor::SocketCallback::SocketCallback
SocketCallback()=default
SocketTools::Reactor::Reactor
Reactor(SocketCallback &callback)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:491
SocketTools::Socket::send
int send(void const *buffer, unsigned size)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:347
SocketTools::Reactor::stop
void stop()
Stop server
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:665
SocketTools::Socket::bind
bool bind(SocketAddr const &addr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:353
SocketTools::Socket::ShutdownSend
@ ShutdownSend
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:420
SocketTools::Socket::error
int error() const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:394
SocketTools::Socket::accept
bool accept(Socket &csock, SocketAddr &caddr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:376
common::Thread
A simple thread, derived class overloads onThread() method.
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:85
SocketTools::Reactor::SocketCallback
Socket State callback
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:447
SocketTools::Socket::operator<
bool operator<(Socket const &other) const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:283
SocketTools::Socket::getsockname
bool getsockname(SocketAddr &addr) const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:359
SocketTools::Socket::setReuseAddr
bool setReuseAddr()
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:299
SocketTools::Socket::operator!=
bool operator!=(Socket const &other) const
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:281
common::Thread::~Thread
virtual ~Thread() noexcept
Thread destructor
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:133
SocketTools::SocketAddr::operator=
SocketAddr & operator=(SocketAddr const &other)=default
SocketTools::Socket::connect
bool connect(SocketAddr const &addr)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:323
LOG_INFO
#define LOG_INFO(fmt_,...)
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:74
SocketTools::Reactor::State
State
Socket State
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:461
common
Definition: includes/opentelemetry/common/attribute_value.h:14
SocketTools::Reactor::addSocket
void addSocket(const Socket &socket, int flags)
Add Socket
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:522
SocketTools::Reactor::start
void start()
Start server
Definition: includes/opentelemetry/ext/http/server/socket_tools.h:656