mirror of https://github.com/axmolengine/axmol.git
Sync yasio
This commit is contained in:
parent
e273d77c96
commit
1cf59a76fb
|
@ -706,13 +706,14 @@ YASIO_LUA_API int luaopen_yasio(lua_State* L)
|
||||||
#endif /* YASIO__HAS_CXX17 */
|
#endif /* YASIO__HAS_CXX17 */
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
YASIO_LUA_API void lyasio_set_print_fn(void* inst, void (*pfn)(const char*))
|
YASIO_LUA_API void luaregister_yasio(lua_State* L)
|
||||||
{
|
{
|
||||||
if (inst)
|
lua_getglobal(L, "package");
|
||||||
{
|
lua_getfield(L, -1, "preload");
|
||||||
auto service = (io_service*)inst;
|
|
||||||
print_fn_t custom_print = pfn;
|
lua_pushcfunction(L, luaopen_yasio);
|
||||||
service->set_option(YOPT_S_PRINT_FN, &custom_print);
|
lua_setfield(L, -2, "yasio");
|
||||||
}
|
|
||||||
|
lua_pop(L, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,8 +45,11 @@ SOFTWARE.
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(NS_SLUA)
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
|
#endif
|
||||||
YASIO_LUA_API int luaopen_yasio(lua_State* L);
|
YASIO_LUA_API int luaopen_yasio(lua_State* L);
|
||||||
|
YASIO_LUA_API void luaregister_yasio(lua_State* L); // register yasio to package.preload
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -115,6 +115,21 @@ SOFTWARE.
|
||||||
# define YASIO__64BITS 0
|
# define YASIO__64BITS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Try detect compiler exceptions
|
||||||
|
#if !defined(__cpp_exceptions)
|
||||||
|
# define YASIO__NO_EXCEPTIONS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(YASIO__NO_EXCEPTIONS)
|
||||||
|
# define YASIO__THROW(x, retval) throw(x)
|
||||||
|
# define YASIO__THROW0(x) throw(x)
|
||||||
|
# define YASIO__THROWV(x, val) throw(x), (val)
|
||||||
|
#else
|
||||||
|
# define YASIO__THROW(x, retval) return (retval)
|
||||||
|
# define YASIO__THROW0(x) return
|
||||||
|
# define YASIO__THROWV(x, val) (val)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Compatibility with non-clang compilers...
|
// Compatibility with non-clang compilers...
|
||||||
#ifndef __has_attribute
|
#ifndef __has_attribute
|
||||||
# define __has_attribute(x) 0
|
# define __has_attribute(x) 0
|
||||||
|
|
|
@ -57,7 +57,7 @@ SOFTWARE.
|
||||||
# define yasio__smtx_unlock_shared(rwlock) pthread_rwlock_unlock(rwlock)
|
# define yasio__smtx_unlock_shared(rwlock) pthread_rwlock_unlock(rwlock)
|
||||||
# define yasio__smtx_unlock_exclusive(rwlock) pthread_rwlock_unlock(rwlock)
|
# define yasio__smtx_unlock_exclusive(rwlock) pthread_rwlock_unlock(rwlock)
|
||||||
# endif
|
# endif
|
||||||
# define yaso__throw_error(e) throw std::system_error(std::make_error_code(e), "")
|
# define yaso__throw_error(e) YASIO__THROW0(std::system_error(std::make_error_code(e), ""))
|
||||||
# include <mutex>
|
# include <mutex>
|
||||||
|
|
||||||
// CLASS TEMPLATE shared_lock
|
// CLASS TEMPLATE shared_lock
|
||||||
|
|
|
@ -777,8 +777,7 @@ inline typename basic_string_view<_CharT, _Traits>::const_reference
|
||||||
basic_string_view<_CharT, _Traits>::at(size_t pos) const
|
basic_string_view<_CharT, _Traits>::at(size_t pos) const
|
||||||
{
|
{
|
||||||
return pos < m_size ? m_str[pos]
|
return pos < m_size ? m_str[pos]
|
||||||
: throw std::out_of_range("Input out of range in basic_string_view::at"),
|
: YASIO__THROWV(std::out_of_range("Input out of range in basic_string_view::at"), 0);
|
||||||
m_str[pos];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename _CharT, typename _Traits>
|
template <typename _CharT, typename _Traits>
|
||||||
|
@ -848,7 +847,7 @@ inline typename basic_string_view<_CharT, _Traits>::size_type
|
||||||
basic_string_view<_CharT, _Traits>::copy(char_type* dest, size_type count, size_type pos) const
|
basic_string_view<_CharT, _Traits>::copy(char_type* dest, size_type count, size_type pos) const
|
||||||
{
|
{
|
||||||
if (pos >= m_size)
|
if (pos >= m_size)
|
||||||
throw std::out_of_range("Index out of range in basic_string_view::copy");
|
YASIO__THROW(std::out_of_range("Index out of range in basic_string_view::copy"), 0);
|
||||||
|
|
||||||
const size_type rcount = (std::min)(m_size - pos, count + 1);
|
const size_type rcount = (std::min)(m_size - pos, count + 1);
|
||||||
std::copy(m_str + pos, m_str + pos + rcount, dest);
|
std::copy(m_str + pos, m_str + pos + rcount, dest);
|
||||||
|
@ -863,7 +862,7 @@ basic_string_view<_CharT, _Traits>::substr(size_t pos, size_t len) const
|
||||||
|
|
||||||
return pos < m_size
|
return pos < m_size
|
||||||
? basic_string_view<_CharT, _Traits>(m_str + pos, len > max_length ? max_length : len)
|
? basic_string_view<_CharT, _Traits>(m_str + pos, len > max_length ? max_length : len)
|
||||||
: throw std::out_of_range("Index out of range in basic_string_view::substr");
|
: YASIO__THROWV(std::out_of_range("Index out of range in basic_string_view::substr"), (basic_string_view<_CharT, _Traits>{}));
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
|
@ -108,11 +108,6 @@ SOFTWARE.
|
||||||
*/
|
*/
|
||||||
// #define YASIO_MINIFY_EVENT 1
|
// #define YASIO_MINIFY_EVENT 1
|
||||||
|
|
||||||
/*
|
|
||||||
** Uncomment or add compiler flag -DYASIO_NO_EXCEPTIONS to disable exceptions
|
|
||||||
*/
|
|
||||||
// #define YASIO_NO_EXCEPTIONS 1
|
|
||||||
|
|
||||||
#if defined(YASIO_HEADER_ONLY)
|
#if defined(YASIO_HEADER_ONLY)
|
||||||
# define YASIO__DECL inline
|
# define YASIO__DECL inline
|
||||||
#else
|
#else
|
||||||
|
@ -139,12 +134,6 @@ SOFTWARE.
|
||||||
# define YASIO_LOGV YASIO_LOG
|
# define YASIO_LOGV YASIO_LOG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(YASIO_NO_EXCEPTIONS)
|
|
||||||
# define YASIO__THROW(x, retval) throw(x)
|
|
||||||
#else
|
|
||||||
# define YASIO__THROW(x, retval) return (retval)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define YASIO_ARRAYSIZE(A) (sizeof(A) / sizeof((A)[0]))
|
#define YASIO_ARRAYSIZE(A) (sizeof(A) / sizeof((A)[0]))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -24,15 +24,17 @@ SOFTWARE.
|
||||||
#ifndef YASIO__UE4_HPP
|
#ifndef YASIO__UE4_HPP
|
||||||
#define YASIO__UE4_HPP
|
#define YASIO__UE4_HPP
|
||||||
|
|
||||||
THIRD_PARTY_INCLUDES_START
|
|
||||||
#pragma push_macro("check")
|
|
||||||
#undef check
|
|
||||||
#define YASIO_HEADER_ONLY 1
|
|
||||||
/*
|
/*
|
||||||
UE4 builtin namespace 'UI' conflicit with openssl typedef strcut st_UI UI;
|
UE4 builtin namespace 'UI' conflicit with openssl typedef strcut st_UI UI;
|
||||||
ossl_typ.h(143): error C2365: 'UI': redefinition; previous definition was 'namespace'
|
ossl_typ.h(143): error C2365: 'UI': redefinition; previous definition was 'namespace'
|
||||||
*/
|
*/
|
||||||
// #define YASIO_HAVE_SSL 1
|
#define UI UI_ST
|
||||||
|
|
||||||
|
THIRD_PARTY_INCLUDES_START
|
||||||
|
#pragma push_macro("check")
|
||||||
|
#undef check
|
||||||
|
#define YASIO_HEADER_ONLY 1
|
||||||
|
#define YASIO_HAVE_SSL 1
|
||||||
#include "yasio/yasio.hpp"
|
#include "yasio/yasio.hpp"
|
||||||
#include "yasio/obstream.hpp"
|
#include "yasio/obstream.hpp"
|
||||||
#include "yasio/ibstream.hpp"
|
#include "yasio/ibstream.hpp"
|
||||||
|
@ -41,4 +43,6 @@ using namespace yasio::inet;
|
||||||
#pragma pop_macro("check")
|
#pragma pop_macro("check")
|
||||||
THIRD_PARTY_INCLUDES_END
|
THIRD_PARTY_INCLUDES_END
|
||||||
|
|
||||||
|
#undef UI
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -465,9 +465,7 @@ bool io_transport::do_write(highp_time_t& wait_duration)
|
||||||
auto& v = *wrap;
|
auto& v = *wrap;
|
||||||
if (call_write(v.get(), error) < 0)
|
if (call_write(v.get(), error) < 0)
|
||||||
{
|
{
|
||||||
set_last_errno(error);
|
this->set_last_errno(error, yasio::net::io_base::error_stage::WRITE);
|
||||||
YASIO_KLOGE("[index: %d] the connection #%u will lost due to write failed, ec=%d, detail:%s", this->cindex(), this->id_, error,
|
|
||||||
io_service::strerror(error));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -533,8 +531,8 @@ int io_transport::call_write(io_send_op* op, int& error)
|
||||||
n = 0;
|
n = 0;
|
||||||
else if (yasio__testbits(ctx_->properties_, YCM_UDP))
|
else if (yasio__testbits(ctx_->properties_, YCM_UDP))
|
||||||
{ // UDP: don't cause handle_close, simply drop the op
|
{ // UDP: don't cause handle_close, simply drop the op
|
||||||
this->complete_op(op, error);
|
this->complete_op(op, error);
|
||||||
n = 0;
|
n = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
|
@ -676,8 +674,8 @@ void io_transport_udp::set_primitives()
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
auto error = xxsocket::get_last_errno();
|
auto error = xxsocket::get_last_errno();
|
||||||
if (YASIO__SEND_FAIL(error))
|
if (YASIO__SEND_FAIL(error))
|
||||||
YASIO_KLOGI("[index: %d] write udp socket failed, ec=%d, detail:%s", this->cindex(), error, io_service::strerror(error));
|
YASIO_KLOGI("[index: %d] write udp socket failed, ec=%d, detail:%s", this->cindex(), error, io_service::strerror(error));
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
};
|
};
|
||||||
|
@ -1126,7 +1124,8 @@ void io_service::handle_close(transport_handle_t thandle)
|
||||||
auto ec = thandle->error_;
|
auto ec = thandle->error_;
|
||||||
|
|
||||||
// @Because we can't retrive peer endpoint when connect reset by peer, so use id to trace.
|
// @Because we can't retrive peer endpoint when connect reset by peer, so use id to trace.
|
||||||
YASIO_KLOGD("[index: %d] the connection #%u(%p) is lost, ec=%d, detail:%s", ctx->index_, thandle->id_, thandle, ec, io_service::strerror(ec));
|
YASIO_KLOGD("[index: %d] the connection #%u(%p) is lost, ec=%d, where=%d, detail:%s", ctx->index_, thandle->id_, thandle, ec, (int)thandle->error_stage_,
|
||||||
|
io_service::strerror(ec));
|
||||||
|
|
||||||
// @Notify connection lost
|
// @Notify connection lost
|
||||||
this->handle_event(event_ptr(new io_event(ctx->index_, YEK_CONNECTION_LOST, ec, thandle)));
|
this->handle_event(event_ptr(new io_event(ctx->index_, YEK_CONNECTION_LOST, ec, thandle)));
|
||||||
|
@ -1631,7 +1630,7 @@ void io_service::do_nonblocking_accept_completion(io_channel* ctx, fd_set* fds_a
|
||||||
{
|
{
|
||||||
error = xxsocket::get_last_errno();
|
error = xxsocket::get_last_errno();
|
||||||
if (YASIO__RECV_FAIL(error))
|
if (YASIO__RECV_FAIL(error))
|
||||||
YASIO_KLOGE("[index: %d] recvfrom failed, ec=%d, detail:%s", ctx->index_, error, this->strerror(error));
|
YASIO_KLOGE("[index: %d] recvfrom failed, ec=%d, detail:%s", ctx->index_, error, this->strerror(error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1701,8 +1700,8 @@ void io_service::notify_connect_succeed(transport_handle_t t)
|
||||||
auto& s = t->socket_;
|
auto& s = t->socket_;
|
||||||
YASIO_KLOGV("[index: %d] sndbuf=%d, rcvbuf=%d", ctx->index_, s->get_optval<int>(SOL_SOCKET, SO_SNDBUF), s->get_optval<int>(SOL_SOCKET, SO_RCVBUF));
|
YASIO_KLOGV("[index: %d] sndbuf=%d, rcvbuf=%d", ctx->index_, s->get_optval<int>(SOL_SOCKET, SO_SNDBUF), s->get_optval<int>(SOL_SOCKET, SO_RCVBUF));
|
||||||
|
|
||||||
YASIO_KLOGD("[index: %d] the connection #%u(%p) [%s] --> [%s] is established.", ctx->index_, t->id_, t,
|
YASIO_KLOGD("[index: %d] the connection #%u(%p) [%s] --> [%s] is established.", ctx->index_, t->id_, t, t->local_endpoint().to_string().c_str(),
|
||||||
t->local_endpoint().to_string().c_str(), t->remote_endpoint().to_string().c_str());
|
t->remote_endpoint().to_string().c_str());
|
||||||
this->handle_event(event_ptr(new io_event(ctx->index_, YEK_CONNECT_RESPONSE, 0, t)));
|
this->handle_event(event_ptr(new io_event(ctx->index_, YEK_CONNECT_RESPONSE, 0, t)));
|
||||||
}
|
}
|
||||||
transport_handle_t io_service::allocate_transport(io_channel* ctx, std::shared_ptr<xxsocket> socket)
|
transport_handle_t io_service::allocate_transport(io_channel* ctx, std::shared_ptr<xxsocket> socket)
|
||||||
|
@ -1785,11 +1784,11 @@ bool io_service::do_read(transport_handle_t transport, fd_set* fds_array)
|
||||||
YASIO_MAX_PDU_BUFFER_SIZE)); // #perfomance, avoid memory reallocte.
|
YASIO_MAX_PDU_BUFFER_SIZE)); // #perfomance, avoid memory reallocte.
|
||||||
unpack(transport, transport->expected_size_, n, bytes_to_strip);
|
unpack(transport, transport->expected_size_, n, bytes_to_strip);
|
||||||
}
|
}
|
||||||
else if (length == 0) // header insufficient, wait readfd ready at next event step.
|
else if (length == 0) // header insufficient, wait readfd ready at next event frame.
|
||||||
transport->wpos_ += n;
|
transport->wpos_ += n;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
transport->set_last_errno(yasio::errc::invalid_packet);
|
transport->set_last_errno(yasio::errc::invalid_packet, yasio::net::io_base::error_stage::READ);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1800,9 +1799,7 @@ bool io_service::do_read(transport_handle_t transport, fd_set* fds_array)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // n < 0, regard as connection should close
|
{ // n < 0, regard as connection should close
|
||||||
transport->set_last_errno(error);
|
transport->set_last_errno(error, yasio::net::io_base::error_stage::READ);
|
||||||
YASIO_KLOGE("[index: %d] the connection #%u will lost due to read failed, ec=%d, detail:%s", transport->cindex(), transport->id_, error,
|
|
||||||
io_service::strerror(error));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -378,21 +378,35 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
struct io_base {
|
struct io_base {
|
||||||
enum class state : u_short
|
enum class state : uint8_t
|
||||||
{
|
{
|
||||||
CLOSED,
|
CLOSED,
|
||||||
OPENING,
|
OPENING,
|
||||||
OPEN,
|
OPEN,
|
||||||
};
|
};
|
||||||
|
enum class error_stage : uint8_t
|
||||||
|
{
|
||||||
|
NONE,
|
||||||
|
READ,
|
||||||
|
WRITE,
|
||||||
|
};
|
||||||
io_base() : error_(0), state_(state::CLOSED), opmask_(0) {}
|
io_base() : error_(0), state_(state::CLOSED), opmask_(0) {}
|
||||||
virtual ~io_base() {}
|
virtual ~io_base() {}
|
||||||
void set_last_errno(int error) { error_ = error; }
|
void set_last_errno(int error, error_stage stage = error_stage::NONE)
|
||||||
|
{
|
||||||
|
error_ = error;
|
||||||
|
error_stage_ = stage;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<xxsocket> socket_;
|
std::shared_ptr<xxsocket> socket_;
|
||||||
int error_; // socket error(>= -1), application error(< -1)
|
int error_; // socket error(>= -1), application error(< -1)
|
||||||
|
// 0: none, 1: read, 2: write
|
||||||
|
error_stage error_stage_ = error_stage::NONE;
|
||||||
|
|
||||||
|
// mark whether pollout event registerred.
|
||||||
|
bool pollout_registerred_ = false;
|
||||||
std::atomic<state> state_;
|
std::atomic<state> state_;
|
||||||
u_short opmask_;
|
uint8_t opmask_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(YASIO_HAVE_SSL)
|
#if defined(YASIO_HAVE_SSL)
|
||||||
|
@ -640,8 +654,6 @@ protected:
|
||||||
|
|
||||||
privacy::concurrent_queue<send_op_ptr> send_queue_;
|
privacy::concurrent_queue<send_op_ptr> send_queue_;
|
||||||
|
|
||||||
// mark whether pollout event registerred.
|
|
||||||
bool pollout_registerred_ = false;
|
|
||||||
#if !defined(YASIO_MINIFY_EVENT)
|
#if !defined(YASIO_MINIFY_EVENT)
|
||||||
private:
|
private:
|
||||||
// The user data
|
// The user data
|
||||||
|
@ -1080,7 +1092,7 @@ private:
|
||||||
highp_time_t dns_queries_timeout_ = 5LL * std::micro::den;
|
highp_time_t dns_queries_timeout_ = 5LL * std::micro::den;
|
||||||
int dns_queries_tries_ = 5;
|
int dns_queries_tries_ = 5;
|
||||||
|
|
||||||
bool dns_dirty_ = true; // only for c-ares
|
bool dns_dirty_ = true; // only for c-ares
|
||||||
|
|
||||||
bool deferred_event_ = true;
|
bool deferred_event_ = true;
|
||||||
|
|
||||||
|
@ -1092,7 +1104,7 @@ private:
|
||||||
int probs = 10;
|
int probs = 10;
|
||||||
} tcp_keepalive_;
|
} tcp_keepalive_;
|
||||||
|
|
||||||
bool no_new_thread_ = false;
|
bool no_new_thread_ = false;
|
||||||
|
|
||||||
// The resolve function
|
// The resolve function
|
||||||
resolv_fn_t resolv_;
|
resolv_fn_t resolv_;
|
||||||
|
|
Loading…
Reference in New Issue