1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef CORE_SOCKIMPL_H
#define CORE_SOCKIMPL_H
// This file contains stuff shared within the core between sockets, endpoints,
// and pipes. This must not be exposed to other subsystems -- these internals
// are subject to change at any time.
typedef struct nni_dialer_stats {
nni_stat_item s_root;
nni_stat_item s_id;
nni_stat_item s_sock;
nni_stat_item s_url;
nni_stat_item s_npipes;
nni_stat_item s_connok;
nni_stat_item s_refused;
nni_stat_item s_canceled;
nni_stat_item s_timedout;
nni_stat_item s_othererr;
nni_stat_item s_protorej;
nni_stat_item s_apprej;
char s_scope[24]; // scope name for stats
} nni_dialer_stats;
struct nni_dialer {
nni_tran_dialer_ops d_ops; // transport ops
nni_tran * d_tran; // transport pointer
void * d_data; // transport private
uint32_t d_id; // endpoint id
nni_list_node d_node; // per socket list
nni_sock * d_sock;
nni_url * d_url;
nni_pipe * d_pipe; // active pipe (for redialer)
int d_refcnt;
bool d_closed; // full shutdown
bool d_closing;
nni_atomic_flag d_started;
nni_mtx d_mtx;
nni_list d_pipes;
nni_aio * d_user_aio;
nni_aio * d_con_aio;
nni_aio * d_tmo_aio; // backoff timer
nni_duration d_maxrtime; // maximum time for reconnect
nni_duration d_currtime; // current time for reconnect
nni_duration d_inirtime; // initial time for reconnect
nni_time d_conntime; // time of last good connect
nni_reap_item d_reap;
nni_dialer_stats d_stats;
};
typedef struct nni_listener_stats {
nni_stat_item s_root;
nni_stat_item s_id;
nni_stat_item s_sock;
nni_stat_item s_url;
nni_stat_item s_npipes;
nni_stat_item s_accept;
nni_stat_item s_aborted; // aborted remotely
nni_stat_item s_timedout;
nni_stat_item s_canceled;
nni_stat_item s_othererr;
nni_stat_item s_protorej;
nni_stat_item s_apprej;
char s_scope[24]; // scope name for stats
} nni_listener_stats;
struct nni_listener {
nni_tran_listener_ops l_ops; // transport ops
nni_tran * l_tran; // transport pointer
void * l_data; // transport private
uint32_t l_id; // endpoint id
nni_list_node l_node; // per socket list
nni_sock * l_sock;
nni_url * l_url;
int l_refcnt;
bool l_closed; // full shutdown
bool l_closing; // close started (shutdown)
nni_atomic_flag l_started;
nni_list l_pipes;
nni_aio * l_acc_aio;
nni_aio * l_tmo_aio;
nni_reap_item l_reap;
nni_listener_stats l_stats;
};
typedef struct nni_pipe_stats {
nni_stat_item s_root;
nni_stat_item s_id;
nni_stat_item s_ep_id;
nni_stat_item s_sock_id;
char s_scope[16]; // scope name for stats ("pipe" is short)
} nni_pipe_stats;
struct nni_pipe {
uint32_t p_id;
nni_tran_pipe_ops p_tran_ops;
nni_proto_pipe_ops p_proto_ops;
void * p_tran_data;
void * p_proto_data;
nni_list_node p_sock_node;
nni_list_node p_ep_node;
nni_sock * p_sock;
nni_dialer * p_dialer;
nni_listener * p_listener;
bool p_closed;
nni_atomic_flag p_stop;
bool p_cbs;
int p_refcnt;
nni_mtx p_mtx;
nni_cv p_cv;
nni_reap_item p_reap;
nni_pipe_stats p_stats;
};
extern int nni_sock_add_dialer(nni_sock *, nni_dialer *);
extern int nni_sock_add_listener(nni_sock *, nni_listener *);
extern void nni_dialer_add_pipe(nni_dialer *, void *);
extern void nni_dialer_shutdown(nni_dialer *);
extern void nni_dialer_reap(nni_dialer *);
extern void nni_dialer_destroy(nni_dialer *);
extern void nni_dialer_timer_start(nni_dialer *);
extern void nni_dialer_close_rele(nni_dialer *);
extern void nni_listener_add_pipe(nni_listener *, void *);
extern void nni_listener_shutdown(nni_listener *);
extern void nni_listener_reap(nni_listener *);
extern void nni_listener_destroy(nni_listener *);
extern void nni_listener_close_rele(nni_listener *);
extern void nni_pipe_remove(nni_pipe *);
extern void nni_pipe_run_cb(nni_pipe *, nng_pipe_ev);
extern int nni_pipe_create_dialer(nni_pipe **, nni_dialer *, void *);
extern int nni_pipe_create_listener(nni_pipe **, nni_listener *, void *);
extern void nni_pipe_start(nni_pipe *);
#endif // CORE_SOCKIMPL_H
|