12#ifndef CMSIS_PLUS_POSIX_IO_NET_STACK_H_
13#define CMSIS_PLUS_POSIX_IO_NET_STACK_H_
17#if defined(__cplusplus)
21#if defined(OS_USE_OS_APP_CONFIG_H)
22#include <cmsis-plus/os-app-config.h>
35#pragma GCC diagnostic push
37#pragma clang diagnostic ignored "-Wc++98-compat"
62 socket (
int domain,
int type,
int protocol);
74#pragma GCC diagnostic push
76#elif defined(__GNUC__)
77#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
78#pragma GCC diagnostic ignored "-Wsuggest-final-types"
124 socket (
int domain,
int type,
int protocol);
134 &socket::deferred_links_>;
141 template <typename T>
145 template <typename T, typename L>
168 const char* name_ = nullptr;
202 &net_stack::net_manager_links_>;
203 static net_list net_list__;
209#pragma GCC diagnostic pop
285 template <
typename T>
301 template <
typename... Args>
360 template <
typename T,
typename L>
377 template <
typename... Args>
458#pragma GCC diagnostic push
459#if defined(__clang__)
460#elif defined(__GNUC__)
461#pragma GCC diagnostic ignored "-Wuseless-cast"
462#pragma GCC diagnostic ignored "-Wnull-dereference"
465#pragma GCC diagnostic push
471 deferred_sockets_list_.link (*sock);
477 return deferred_sockets_list_;
480 template <
typename T>
484 using socket_type = T;
488 if (deferred_sockets_list_.empty ())
490 sock =
new socket_type (*
this);
494 sock =
static_cast<socket_type*
> (
495 deferred_sockets_list_.unlink_head ());
498 sock->~socket_type ();
501 new (sock) socket_type (*
this);
504 while (!deferred_sockets_list_.empty ())
506 socket_type* s =
static_cast<socket_type*
> (
507 deferred_sockets_list_.unlink_head ());
516 template <
typename T,
typename L>
520 using socket_type = T;
524 if (deferred_sockets_list_.empty ())
526 sock =
new socket_type (*
this, locker);
530 sock =
static_cast<socket_type*
> (
531 deferred_sockets_list_.unlink_head ());
534 sock->~socket_type ();
537 new (sock) socket_type (*
this, locker);
540 while (!deferred_sockets_list_.empty ())
542 socket_type* s =
static_cast<socket_type*
> (
543 deferred_sockets_list_.unlink_head ());
562 template <
typename T>
563 template <
typename... Args>
567 impl_instance_{ interface,
std::forward<Args> (args)... }
569#if defined(OS_TRACE_POSIX_IO_NET_STACK)
570 trace::printf (
"net_stack_implementable::%s(\"%s\")=@%p\n", __func__,
575 template <
typename T>
578#if defined(OS_TRACE_POSIX_IO_NET_STACK)
579 trace::printf (
"net_stack_implementable::%s() @%p %s\n", __func__,
this,
584 template <
typename T>
593 template <
typename T,
typename L>
594 template <
typename... Args>
600 impl_instance_{ interface, locker,
std::forward<Args> (args)... }
602#if defined(OS_TRACE_POSIX_IO_NET_STACK)
603 trace::printf (
"net_stack_lockable::%s()=%p\n", __func__,
this);
607 template <
typename T,
typename L>
610#if defined(OS_TRACE_POSIX_IO_NET_STACK)
611 trace::printf (
"net_stack_lockable::%s() @%p\n", __func__,
this);
617 template <
typename T,
typename L>
628#pragma GCC diagnostic pop
virtual class socket * do_socket(int domain, int type, int protocol)=0
net_interface & interface(void) const
virtual ~net_stack_implementable()
net_stack_implementable(const char *name, net_interface &interface, Args &&... args)
value_type & impl(void) const
net_stack_lockable(const char *name, net_interface &interface, lockable_type &locker, Args &&... args)
value_type & impl(void) const
virtual ~net_stack_lockable()
net_stack_impl & impl(void) const
T * allocate_socket(void)
net_interface & interface(void) const
void add_deferred_socket(class socket *sock)
const char * name(void) const
deferred_sockets_list_t & deferred_sockets_list(void)
The core of a double linked list, pointers to next, previous.
int printf(const char *format,...)
Write a formatted string to the trace device.
int socket(int domain, int type, int protocol)