diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9d43b6392..2442a75af 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -69,7 +69,7 @@ if (WIN32)
set(EXTRA_LIBS ws2_32 psapi iphlpapi userenv)
else()
- set(SOURCES_OS src/Cpu_unix.cpp)
+ set(SOURCES_OS src/Cpu_unix.cpp src/Mem_unix.cpp)
set(EXTRA_LIBS pthread)
endif()
diff --git a/src/Mem.cpp b/src/Mem.cpp
index b7bf25117..f95540525 100644
--- a/src/Mem.cpp
+++ b/src/Mem.cpp
@@ -21,8 +21,67 @@
* along with this program. If not, see .
*/
+
+#include
+
+
+#include "crypto/CryptoNight.h"
#include "Mem.h"
+#include "Options.h"
+bool Mem::m_doubleHash = false;
+int Mem::m_algo = 0;
+int Mem::m_flags = 0;
+int Mem::m_threads = 0;
+size_t Mem::m_offset = 0;
uint8_t *Mem::m_memory = nullptr;
-int Mem::m_flags = 0;
+
+
+cryptonight_ctx *Mem::create(int algo, int threadId, bool doubleHash)
+{
+# ifndef XMRIG_NO_AEON
+ if (algo == Options::ALGO_CRYPTONIGHT_LITE) {
+ return createLite(threadId, doubleHash);
+ }
+# endif
+
+ cryptonight_ctx *ctx = reinterpret_cast(&m_memory[MEMORY - sizeof(cryptonight_ctx) * (threadId + 1)]);
+
+ const int ratio = doubleHash ? 2 : 1;
+ ctx->memory = &m_memory[MEMORY * (threadId * ratio + 1)];
+
+ return ctx;
+}
+
+
+
+void *Mem::calloc(size_t num, size_t size)
+{
+ void *mem = &m_memory[m_offset];
+ m_offset += (num * size);
+
+ memset(mem, 0, num * size);
+
+ return mem;
+}
+
+
+#ifndef XMRIG_NO_AEON
+cryptonight_ctx *Mem::createLite(int threadId, bool doubleHash) {
+ cryptonight_ctx *ctx;
+
+ if (!doubleHash) {
+ const size_t offset = MEMORY * (threadId + 1);
+
+ ctx = reinterpret_cast(&m_memory[offset + MEMORY_LITE]);
+ ctx->memory = &m_memory[offset];
+ return ctx;
+ }
+
+ ctx = reinterpret_cast(&m_memory[MEMORY - sizeof(cryptonight_ctx) * (threadId + 1)]);
+ ctx->memory = &m_memory[MEMORY * (threadId + 1)];
+
+ return ctx;
+}
+#endif
diff --git a/src/Mem.h b/src/Mem.h
index d38417354..21a9f0f9a 100644
--- a/src/Mem.h
+++ b/src/Mem.h
@@ -25,7 +25,10 @@
#define __MEM_H__
-#include "crypto/CryptoNight.h"
+#include
+
+
+struct cryptonight_ctx;
class Mem
@@ -38,13 +41,23 @@ public:
};
static bool allocate(int algo, int threads, bool doubleHash);
+ static cryptonight_ctx *create(int algo, int threadId, bool doubleHash);
+ static void *calloc(size_t num, size_t size);
static void release();
static inline int flags() { return m_flags; }
private:
- static uint8_t *m_memory __attribute__((aligned(16)));
+ static bool m_doubleHash;
+ static int m_algo;
static int m_flags;
+ static int m_threads;
+ static size_t m_offset;
+ static uint8_t *m_memory __attribute__((aligned(16)));
+
+# ifndef XMRIG_NO_AEON
+ static cryptonight_ctx *createLite(int threadId, bool doubleHash);
+# endif
};
diff --git a/src/Mem_unix.cpp b/src/Mem_unix.cpp
new file mode 100644
index 000000000..a0690e79c
--- /dev/null
+++ b/src/Mem_unix.cpp
@@ -0,0 +1,26 @@
+/* XMRig
+ * Copyright 2010 Jeff Garzik
+ * Copyright 2012-2014 pooler
+ * Copyright 2014 Lucas Jones
+ * Copyright 2014-2016 Wolf9466
+ * Copyright 2016 Jay D Dee
+ * Copyright 2016-2017 XMRig
+ *
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+
+#include "crypto/CryptoNight.h"
+#include "Mem.h"
diff --git a/src/Mem_win.cpp b/src/Mem_win.cpp
index bab483bbc..42114eafa 100644
--- a/src/Mem_win.cpp
+++ b/src/Mem_win.cpp
@@ -26,10 +26,12 @@
#include
#include
#include
+#include
-#include "Mem.h"
#include "Console.h"
+#include "crypto/CryptoNight.h"
+#include "Mem.h"
#include "Options.h"