@@ -73,8 +73,8 @@ struct nng_http_server {
73
73
nni_list handlers ;
74
74
nni_list conns ;
75
75
nni_mtx mtx ;
76
- nni_cv cv ;
77
76
bool closed ;
77
+ bool fini ; // if nni_http_server_fini was called
78
78
nni_aio * accaio ;
79
79
nng_stream_listener * listener ;
80
80
int port ; // native order
@@ -301,8 +301,8 @@ http_sc_reap(void *arg)
301
301
if (nni_list_node_active (& sc -> node )) {
302
302
nni_list_remove (& s -> conns , sc );
303
303
}
304
- if (nni_list_empty (& s -> conns )) {
305
- nni_cv_wake ( & s -> cv );
304
+ if (nni_list_empty (& s -> conns ) && ( s -> fini ) ) {
305
+ nni_reap ( & http_server_reap_list , s );
306
306
}
307
307
nni_mtx_unlock (& s -> mtx );
308
308
@@ -909,13 +909,7 @@ http_server_fini(nni_http_server *s)
909
909
nni_aio_stop (s -> accaio );
910
910
911
911
nni_mtx_lock (& s -> mtx );
912
- if (!nni_list_empty (& s -> conns )) {
913
- // Try to reap later, after the connections are done reaping.
914
- // (Note, connections will all have been closed already.)
915
- nni_reap (& http_server_reap_list , s );
916
- nni_mtx_unlock (& s -> mtx );
917
- return ;
918
- }
912
+ NNI_ASSERT (nni_list_empty (& s -> conns ));
919
913
nng_stream_listener_free (s -> listener );
920
914
while ((h = nni_list_first (& s -> handlers )) != NULL ) {
921
915
nni_list_remove (& s -> handlers , h );
@@ -932,7 +926,6 @@ http_server_fini(nni_http_server *s)
932
926
nni_mtx_fini (& s -> errors_mtx );
933
927
934
928
nni_aio_free (s -> accaio );
935
- nni_cv_fini (& s -> cv );
936
929
nni_mtx_fini (& s -> mtx );
937
930
nni_strfree (s -> hostname );
938
931
NNI_FREE_STRUCT (s );
@@ -958,7 +951,6 @@ http_server_init(nni_http_server **serverp, const nni_url *url)
958
951
}
959
952
nni_mtx_init (& s -> mtx );
960
953
nni_mtx_init (& s -> errors_mtx );
961
- nni_cv_init (& s -> cv , & s -> mtx );
962
954
NNI_LIST_INIT (& s -> handlers , nni_http_handler , node );
963
955
NNI_LIST_INIT (& s -> conns , http_sconn , node );
964
956
@@ -1048,10 +1040,8 @@ nni_http_server_start(nni_http_server *s)
1048
1040
}
1049
1041
1050
1042
static void
1051
- http_server_stop (nni_http_server * s )
1043
+ http_server_close (nni_http_server * s )
1052
1044
{
1053
- http_sconn * sc ;
1054
-
1055
1045
if (s -> closed ) {
1056
1046
return ;
1057
1047
}
@@ -1063,29 +1053,48 @@ http_server_stop(nni_http_server *s)
1063
1053
if (s -> listener ) {
1064
1054
nng_stream_listener_close (s -> listener );
1065
1055
}
1056
+ }
1057
+
1058
+ static void
1059
+ http_server_stop (nni_http_server * s )
1060
+ {
1061
+ http_sconn * sc ;
1062
+
1063
+ http_server_close (s );
1066
1064
1067
1065
// Stopping the server is a hard stop -- it aborts any work
1068
1066
// being done by clients. (No graceful shutdown).
1069
1067
NNI_LIST_FOREACH (& s -> conns , sc ) {
1070
1068
http_sc_close_locked (sc );
1071
1069
}
1072
-
1073
- while (!nni_list_empty (& s -> conns )) {
1074
- nni_cv_wait (& s -> cv );
1075
- }
1076
1070
}
1077
1071
1078
1072
void
1079
1073
nni_http_server_stop (nni_http_server * s )
1080
1074
{
1081
1075
nni_mtx_lock (& s -> mtx );
1082
- s -> starts -- ;
1076
+ if (s -> starts != 0 ) {
1077
+ s -> starts -- ;
1078
+ }
1083
1079
if (s -> starts == 0 ) {
1084
1080
http_server_stop (s );
1085
1081
}
1086
1082
nni_mtx_unlock (& s -> mtx );
1087
1083
}
1088
1084
1085
+ void
1086
+ nni_http_server_close (nni_http_server * s )
1087
+ {
1088
+ nni_mtx_lock (& s -> mtx );
1089
+ if (s -> starts != 0 ) {
1090
+ s -> starts -- ;
1091
+ }
1092
+ if (s -> starts == 0 ) {
1093
+ http_server_close (s );
1094
+ }
1095
+ nni_mtx_unlock (& s -> mtx );
1096
+ }
1097
+
1089
1098
static int
1090
1099
http_server_set_err (nni_http_server * s , uint16_t code , void * body , size_t len )
1091
1100
{
@@ -1910,12 +1919,18 @@ nni_http_server_fini(nni_http_server *s)
1910
1919
{
1911
1920
nni_mtx_lock (& http_servers_lk );
1912
1921
s -> refcnt -- ;
1913
- if (s -> refcnt == 0 ) {
1914
- nni_mtx_lock (& s -> mtx );
1915
- http_server_stop (s );
1916
- nni_mtx_unlock (& s -> mtx );
1917
- nni_list_remove (& http_servers , s );
1918
- nni_reap (& http_server_reap_list , s );
1922
+ if (s -> refcnt != 0 ) {
1923
+ nni_mtx_unlock (& http_servers_lk );
1924
+ return ;
1919
1925
}
1926
+ nni_list_remove (& http_servers , s );
1920
1927
nni_mtx_unlock (& http_servers_lk );
1928
+
1929
+ nni_mtx_lock (& s -> mtx );
1930
+ http_server_stop (s );
1931
+ s -> fini = true;
1932
+ if (nni_list_empty (& s -> conns )) {
1933
+ nni_reap (& http_server_reap_list , s );
1934
+ }
1935
+ nni_mtx_unlock (& s -> mtx );
1921
1936
}
0 commit comments