summaryrefslogtreecommitdiffstats
path: root/xmrstak/net/jpsock.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'xmrstak/net/jpsock.hpp')
-rw-r--r--xmrstak/net/jpsock.hpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/xmrstak/net/jpsock.hpp b/xmrstak/net/jpsock.hpp
new file mode 100644
index 0000000..4baaade
--- /dev/null
+++ b/xmrstak/net/jpsock.hpp
@@ -0,0 +1,98 @@
+#pragma once
+#include <mutex>
+#include <atomic>
+#include <condition_variable>
+#include <thread>
+#include <string>
+
+#include "msgstruct.h"
+
+/* Our pool can have two kinds of errors:
+ - Parsing or connection error
+ Those are fatal errors (we drop the connection if we encounter them).
+ After they are constructed from const char* strings from various places.
+ (can be from read-only mem), we passs them in an exectutor message
+ once the recv thread expires.
+ - Call error
+ This error happens when the "server says no". Usually because the job was
+ outdated, or we somehow got the hash wrong. It isn't fatal.
+ We parse it in-situ in the network buffer, after that we copy it to a
+ std::string. Executor will move the buffer via an r-value ref.
+*/
+class base_socket;
+
+class jpsock
+{
+public:
+ jpsock(size_t id, bool tls);
+ ~jpsock();
+
+ bool connect(const char* sAddr, std::string& sConnectError);
+ void disconnect();
+
+ bool cmd_login(const char* sLogin, const char* sPassword);
+ bool cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult);
+
+ static bool hex2bin(const char* in, unsigned int len, unsigned char* out);
+ static void bin2hex(const unsigned char* in, unsigned int len, char* out);
+
+ inline bool is_running() { return bRunning; }
+ inline bool is_logged_in() { return bLoggedIn; }
+
+ std::string&& get_call_error();
+ bool have_sock_error() { return bHaveSocketError; }
+
+ inline static uint64_t t32_to_t64(uint32_t t) { return 0xFFFFFFFFFFFFFFFFULL / (0xFFFFFFFFULL / ((uint64_t)t)); }
+ inline static uint64_t t64_to_diff(uint64_t t) { return 0xFFFFFFFFFFFFFFFFULL / t; }
+ inline static uint64_t diff_to_t64(uint64_t d) { return 0xFFFFFFFFFFFFFFFFULL / d; }
+
+ inline uint64_t get_current_diff() { return iJobDiff; }
+
+ bool get_current_job(pool_job& job);
+
+ size_t pool_id;
+
+ bool set_socket_error(const char* a);
+ bool set_socket_error(const char* a, const char* b);
+ bool set_socket_error(const char* a, size_t len);
+ bool set_socket_error_strerr(const char* a);
+ bool set_socket_error_strerr(const char* a, int res);
+
+private:
+ std::atomic<bool> bRunning;
+ std::atomic<bool> bLoggedIn;
+
+ uint8_t* bJsonRecvMem;
+ uint8_t* bJsonParseMem;
+ uint8_t* bJsonCallMem;
+
+ static constexpr size_t iJsonMemSize = 4096;
+ static constexpr size_t iSockBufferSize = 4096;
+
+ struct call_rsp;
+ struct opaque_private;
+ struct opq_json_val;
+
+ void jpsock_thread();
+ bool jpsock_thd_main();
+ bool process_line(char* line, size_t len);
+ bool process_pool_job(const opq_json_val* params);
+ bool cmd_ret_wait(const char* sPacket, opq_json_val& poResult);
+
+ char sMinerId[64];
+ std::atomic<uint64_t> iJobDiff;
+
+ std::string sSocketError;
+ std::atomic<bool> bHaveSocketError;
+
+ std::mutex call_mutex;
+ std::condition_variable call_cond;
+ std::thread* oRecvThd;
+
+ std::mutex job_mutex;
+ pool_job oCurrentJob;
+
+ opaque_private* prv;
+ base_socket* sck;
+};
+
OpenPOWER on IntegriCloud