* Graceful shutdown does not support sync mode anymore.
* Introduce memory fence to synchronize socket's status -- sending and reading, dispatch_strand is not enough, except post_strand,
* but dispatch_strand is more efficient than post_strand in specific circumstances.
* stop_timer will also invalidate cumulative timers.
*
* HIGHLIGHT:
* Make shutdown thread safe.
* Support call back registration, then we can get event notify and customize our socket without inhirt ascs socket and overwrite its virtual functions.
*
* FIX:
* Fix alias for tcp and ssl.
...
...
@@ -824,6 +826,7 @@
* pop_first/all_pending_send_msg and pop_first/all_pending_recv_msg.
* socket::send_msg().
* Fix -- basic_buffer doesn't support fixed arrays (just in the constructor) in GCC and Clang.
* Fix ssl graceful shutdown monitoring.
*
* ENHANCEMENTS:
* heartbeat(ext) optimization.
...
...
@@ -833,6 +836,8 @@
* ascs needs the container's empty() function (used by the queue for message sending and receiving) to be thread safe (here, thread safe does not means
* correctness, but just no memory access violation), almost all implementations of list::empty() in the world are thread safe, but not for list::size().
* if your container's empty() function is not thread safe, please define macro ASCS_CAN_EMPTY_NOT_SAFE, then ascs will make it thread safe for you.
* Maintain the ssl::context in ssl::single_client_base.
#define call_cb_combine(fun) virtual bool fun() {auto re = cb_##fun.first ? cb_##fun.first(this) : true; if (re && cb_##fun.second) re = Socket::fun(); return re;}
#define call_cb_1_return(init, fun, p) {auto re = init; if (cb_##fun.first) re = cb_##fun.first(this, p); if (cb_##fun.second) re = Socket::fun(p); return re;}