diff --git a/src/workprover/fastsolver/common.h b/src/workprover/fastsolver/common.h index bdca9232..a4ef1b7d 100644 --- a/src/workprover/fastsolver/common.h +++ b/src/workprover/fastsolver/common.h @@ -1,6 +1,12 @@ #ifndef COMMON_H #define COMMON_H + #ifdef _WIN32 + #define EXPORT __declspec(dllexport) + #else + #define EXPORT __attribute__ ((visibility("default"))) + #endif + extern volatile int run; #define SEED_LENGTH (32 + 8) diff --git a/src/workprover/fastsolver/main.map b/src/workprover/fastsolver/main.map deleted file mode 100644 index 175c370d..00000000 --- a/src/workprover/fastsolver/main.map +++ /dev/null @@ -1,4 +0,0 @@ -{ - global: fastsolver_*; - local: *; -}; diff --git a/src/workprover/fastsolver/makefile b/src/workprover/fastsolver/makefile index e4b08034..17be4224 100644 --- a/src/workprover/fastsolver/makefile +++ b/src/workprover/fastsolver/makefile @@ -1,8 +1,9 @@ -CFLAGS += -std=gnu99 -Wall -Wextra -pedantic -O3 -fPIC -LDFLAGS += -shared -lpthread -lcrypto -Wl,-version-script=main.map +CFLAGS += -std=gnu99 -Wall -Wextra -pedantic -O3 -fPIC -fvisibility=hidden +LDFLAGS += -shared +LDLIBS = -lpthread -lcrypto -libfastsolver.so: main.map common.o pthread.o - $(CC) $(LDFLAGS) -o $@ common.o pthread.o +libfastsolver.so: common.o pthread.o + $(CC) $(LDFLAGS) -o $@ common.o pthread.o $(LDLIBS) common.o: common.h common.c pthread.o: common.h pthread.c diff --git a/src/workprover/fastsolver/options.txt b/src/workprover/fastsolver/options.txt index cd8fe863..69a53889 100644 --- a/src/workprover/fastsolver/options.txt +++ b/src/workprover/fastsolver/options.txt @@ -1 +1 @@ -/Ox /MD common.c winapi.c /link /DLL /OUT:libfastsolver.dll /EXPORT:fastsolver_add /EXPORT:fastsolver_remove /EXPORT:fastsolver_search libcrypto.lib +/Ox /MD common.c winapi.c /link /DLL /OUT:libfastsolver.dll libcrypto.lib diff --git a/src/workprover/fastsolver/pthread.c b/src/workprover/fastsolver/pthread.c index fc62b98a..a9f47eb5 100644 --- a/src/workprover/fastsolver/pthread.c +++ b/src/workprover/fastsolver/pthread.c @@ -104,7 +104,7 @@ static int initialize(void) { error_lock: return 0; } -size_t fastsolver_add(void) { +EXPORT size_t fastsolver_add(void) { #ifdef SCHED_IDLE int policy = SCHED_IDLE; #else @@ -135,7 +135,7 @@ size_t fastsolver_add(void) { return threads_count; } -size_t fastsolver_remove(size_t count) { +EXPORT size_t fastsolver_remove(size_t count) { size_t i; pthread_mutex_lock(&lock); @@ -154,7 +154,7 @@ size_t fastsolver_remove(size_t count) { return threads_count; } -int fastsolver_search( +EXPORT int fastsolver_search( char *local_nonce, unsigned long long *local_iterations_count, const char *local_initial_hash, diff --git a/src/workprover/fastsolver/winapi.c b/src/workprover/fastsolver/winapi.c index b620aeb8..1f8fe045 100644 --- a/src/workprover/fastsolver/winapi.c +++ b/src/workprover/fastsolver/winapi.c @@ -1,160 +1,160 @@ -#include - -#include - -#include "common.h" - -static int initialized; - -#define MAXIMUM_THREADS_COUNT 4096 - -static size_t threads_count; -static HANDLE threads[MAXIMUM_THREADS_COUNT]; - -static CRITICAL_SECTION lock; -static CONDITION_VARIABLE start = CONDITION_VARIABLE_INIT; -static CONDITION_VARIABLE done = CONDITION_VARIABLE_INIT; - -static size_t running_threads_count; - -static int found; -static char best_nonce[8]; -static unsigned long long total_iterations_count; - -DWORD WINAPI thread_function(LPVOID argument) { - size_t thread_number = (HANDLE *) argument - threads; - - while (1) { - char nonce[8]; - unsigned long long iterations_count = 0; - int result; - - EnterCriticalSection(&lock); - - while (!run && threads_count > thread_number) { - SleepConditionVariableCS(&start, &lock, INFINITE); - } - - if (threads_count <= thread_number) { - LeaveCriticalSection(&lock); - - return 0; - } - - ++running_threads_count; - - LeaveCriticalSection(&lock); - - result = work(nonce, &iterations_count, thread_number); - - EnterCriticalSection(&lock); - - if (result == 1) { - found = 1; - memcpy(best_nonce, nonce, 8); - } - - total_iterations_count += iterations_count; - - run = 0; - --running_threads_count; - - WakeConditionVariable(&done); - LeaveCriticalSection(&lock); - } -} - -static int initialize(void) { - if (initialized == 1) { - return 1; - } - - InitializeCriticalSection(&lock); - - initialized = 1; - - return 1; -} - -size_t fastsolver_add(void) { - if (initialize() == 0) { - return threads_count; - } - - EnterCriticalSection(&lock); - - threads[threads_count] = CreateThread(NULL, 0, thread_function, &threads[threads_count], 0, NULL); - - if (threads[threads_count] == NULL) { - LeaveCriticalSection(&lock); - - return threads_count; - } - - SetThreadPriority(threads[threads_count], THREAD_PRIORITY_IDLE); - - ++threads_count; - - LeaveCriticalSection(&lock); - - return threads_count; -} - -size_t fastsolver_remove(size_t count) { - size_t i; - - EnterCriticalSection(&lock); - - threads_count -= count; - - WakeAllConditionVariable(&start); - LeaveCriticalSection(&lock); - - WaitForMultipleObjects(count, threads + threads_count, TRUE, INFINITE); - - for (i = 0; i < count; ++i) { - CloseHandle(threads[threads_count + i]); - } - - return threads_count; -} - -int fastsolver_search( - char *local_nonce, - unsigned long long *local_iterations_count, - const char *local_initial_hash, - unsigned long long local_target, - const char *local_seed, - unsigned long long timeout -) { - initial_hash = local_initial_hash; - target = local_target; - seed = local_seed; - - found = 0; - total_iterations_count = 0; - - EnterCriticalSection(&lock); - - run = 1; - - WakeAllConditionVariable(&start); - - SleepConditionVariableCS(&done, &lock, timeout / 1000); - - run = 0; - - while (running_threads_count != 0) { - SleepConditionVariableCS(&done, &lock, INFINITE); - } - - LeaveCriticalSection(&lock); - - if (found) { - memcpy(local_nonce, best_nonce, 8); - } - - *local_iterations_count = total_iterations_count; - - return found; -} +#include + +#include + +#include "common.h" + +static int initialized; + +#define MAXIMUM_THREADS_COUNT 4096 + +static size_t threads_count; +static HANDLE threads[MAXIMUM_THREADS_COUNT]; + +static CRITICAL_SECTION lock; +static CONDITION_VARIABLE start = CONDITION_VARIABLE_INIT; +static CONDITION_VARIABLE done = CONDITION_VARIABLE_INIT; + +static size_t running_threads_count; + +static int found; +static char best_nonce[8]; +static unsigned long long total_iterations_count; + +DWORD WINAPI thread_function(LPVOID argument) { + size_t thread_number = (HANDLE *) argument - threads; + + while (1) { + char nonce[8]; + unsigned long long iterations_count = 0; + int result; + + EnterCriticalSection(&lock); + + while (!run && threads_count > thread_number) { + SleepConditionVariableCS(&start, &lock, INFINITE); + } + + if (threads_count <= thread_number) { + LeaveCriticalSection(&lock); + + return 0; + } + + ++running_threads_count; + + LeaveCriticalSection(&lock); + + result = work(nonce, &iterations_count, thread_number); + + EnterCriticalSection(&lock); + + if (result == 1) { + found = 1; + memcpy(best_nonce, nonce, 8); + } + + total_iterations_count += iterations_count; + + run = 0; + --running_threads_count; + + WakeConditionVariable(&done); + LeaveCriticalSection(&lock); + } +} + +static int initialize(void) { + if (initialized == 1) { + return 1; + } + + InitializeCriticalSection(&lock); + + initialized = 1; + + return 1; +} + +EXPORT size_t fastsolver_add(void) { + if (initialize() == 0) { + return threads_count; + } + + EnterCriticalSection(&lock); + + threads[threads_count] = CreateThread(NULL, 0, thread_function, &threads[threads_count], 0, NULL); + + if (threads[threads_count] == NULL) { + LeaveCriticalSection(&lock); + + return threads_count; + } + + SetThreadPriority(threads[threads_count], THREAD_PRIORITY_IDLE); + + ++threads_count; + + LeaveCriticalSection(&lock); + + return threads_count; +} + +EXPORT size_t fastsolver_remove(size_t count) { + size_t i; + + EnterCriticalSection(&lock); + + threads_count -= count; + + WakeAllConditionVariable(&start); + LeaveCriticalSection(&lock); + + WaitForMultipleObjects(count, threads + threads_count, TRUE, INFINITE); + + for (i = 0; i < count; ++i) { + CloseHandle(threads[threads_count + i]); + } + + return threads_count; +} + +EXPORT int fastsolver_search( + char *local_nonce, + unsigned long long *local_iterations_count, + const char *local_initial_hash, + unsigned long long local_target, + const char *local_seed, + unsigned long long timeout +) { + initial_hash = local_initial_hash; + target = local_target; + seed = local_seed; + + found = 0; + total_iterations_count = 0; + + EnterCriticalSection(&lock); + + run = 1; + + WakeAllConditionVariable(&start); + + SleepConditionVariableCS(&done, &lock, timeout / 1000); + + run = 0; + + while (running_threads_count != 0) { + SleepConditionVariableCS(&done, &lock, INFINITE); + } + + LeaveCriticalSection(&lock); + + if (found) { + memcpy(local_nonce, best_nonce, 8); + } + + *local_iterations_count = total_iterations_count; + + return found; +}