diff --git a/src/api/Api.cpp b/src/api/Api.cpp index 729ebccd..98d441c1 100644 --- a/src/api/Api.cpp +++ b/src/api/Api.cpp @@ -4,7 +4,7 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig + * Copyright 2016-2018 XMRig * * * This program is free software: you can redistribute it and/or modify @@ -29,12 +29,10 @@ ApiState *Api::m_state = nullptr; -uv_mutex_t Api::m_mutex; bool Api::start() { - uv_mutex_init(&m_mutex); m_state = new ApiState(); return true; @@ -53,11 +51,7 @@ char *Api::get(const char *url, int *status) return nullptr; } - uv_mutex_lock(&m_mutex); - char *buf = m_state->get(url, status); - uv_mutex_unlock(&m_mutex); - - return buf; + return m_state->get(url, status); } @@ -67,9 +61,7 @@ void Api::tick(const Hashrate *hashrate) return; } - uv_mutex_lock(&m_mutex); m_state->tick(hashrate); - uv_mutex_unlock(&m_mutex); } @@ -79,7 +71,5 @@ void Api::tick(const NetworkState &network) return; } - uv_mutex_lock(&m_mutex); m_state->tick(network); - uv_mutex_unlock(&m_mutex); } diff --git a/src/api/Api.h b/src/api/Api.h index 72c65c3c..1f91b382 100644 --- a/src/api/Api.h +++ b/src/api/Api.h @@ -4,7 +4,7 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig + * Copyright 2016-2018 XMRig * * * This program is free software: you can redistribute it and/or modify @@ -45,7 +45,6 @@ public: private: static ApiState *m_state; - static uv_mutex_t m_mutex; }; #endif /* __API_H__ */ diff --git a/src/api/Httpd.cpp b/src/api/Httpd.cpp index 996bc007..be696542 100644 --- a/src/api/Httpd.cpp +++ b/src/api/Httpd.cpp @@ -4,7 +4,7 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig + * Copyright 2016-2018 XMRig * * * This program is free software: you can redistribute it and/or modify @@ -36,6 +36,18 @@ Httpd::Httpd(int port, const char *accessToken) : m_port(port), m_daemon(nullptr) { + uv_idle_init(uv_default_loop(), &m_idle); + m_idle.data = this; +} + + +Httpd::~Httpd() +{ + uv_idle_stop(&m_idle); + + if (m_daemon) { + MHD_stop_daemon(m_daemon); + } } @@ -45,12 +57,18 @@ bool Httpd::start() return false; } - m_daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, m_port, nullptr, nullptr, &Httpd::handler, this, MHD_OPTION_END); + unsigned int flags = 0; + if (MHD_is_feature_supported(MHD_FEATURE_EPOLL)) { + flags |= MHD_USE_EPOLL_LINUX_ONLY; + } + + m_daemon = MHD_start_daemon(flags, m_port, nullptr, nullptr, &Httpd::handler, this, MHD_OPTION_END); if (!m_daemon) { LOG_ERR("HTTP Daemon failed to start."); return false; } + uv_idle_start(&m_idle, Httpd::onIdle); return true; } @@ -114,3 +132,9 @@ int Httpd::handler(void *cls, struct MHD_Connection *connection, const char *url MHD_Response *rsp = MHD_create_response_from_buffer(strlen(buf), (void*) buf, MHD_RESPMEM_MUST_FREE); return done(connection, status, rsp); } + + +void Httpd::onIdle(uv_idle_t *handle) +{ + MHD_run(static_cast(handle->data)->m_daemon); +} diff --git a/src/api/Httpd.h b/src/api/Httpd.h index 7a4dd932..6563364d 100644 --- a/src/api/Httpd.h +++ b/src/api/Httpd.h @@ -4,7 +4,7 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig + * Copyright 2016-2018 XMRig * * * This program is free software: you can redistribute it and/or modify @@ -37,6 +37,7 @@ class Httpd { public: Httpd(int port, const char *accessToken); + ~Httpd(); bool start(); private: @@ -44,10 +45,12 @@ private: static int done(MHD_Connection *connection, int status, MHD_Response *rsp); static int handler(void *cls, MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls); + static void onIdle(uv_idle_t *handle); const char *m_accessToken; const int m_port; MHD_Daemon *m_daemon; + uv_idle_t m_idle; }; #endif /* __HTTPD_H__ */