diff --git a/stratum/client.cpp b/stratum/client.cpp index f961c47..6548a51 100644 --- a/stratum/client.cpp +++ b/stratum/client.cpp @@ -429,7 +429,7 @@ void *client_thread(void *p) client->shares_per_minute = YAAMP_SHAREPERSEC; client->last_submit_time = current_timestamp(); - while(1) + while(!g_exiting) { if(client->submit_bad > 1024) { diff --git a/stratum/db.cpp b/stratum/db.cpp index 8f73321..01a34b3 100644 --- a/stratum/db.cpp +++ b/stratum/db.cpp @@ -4,6 +4,11 @@ void db_reconnect(YAAMP_DB *db) { + if (g_exiting) { + db_close(db); + return; + } + mysql_init(&db->mysql); for(int i=0; i<6; i++) { @@ -13,6 +18,7 @@ void db_reconnect(YAAMP_DB *db) stratumlog("%d, %s\n", i, mysql_error(&db->mysql)); sleep(10); + mysql_close(&db->mysql); mysql_init(&db->mysql); } } @@ -27,8 +33,11 @@ YAAMP_DB *db_connect() void db_close(YAAMP_DB *db) { - mysql_close(&db->mysql); - delete db; + if (db) { + mysql_close(&db->mysql); + delete db; + } + db = NULL; } char *db_clean_string(YAAMP_DB *db, char *string) @@ -46,6 +55,7 @@ void db_query(YAAMP_DB *db, const char *format, ...) { va_list arglist; va_start(arglist, format); + if(!db) return; char *buffer = (char *)malloc(YAAMP_SMALLBUFSIZE+strlen(format)); if(!buffer) return; @@ -53,7 +63,7 @@ void db_query(YAAMP_DB *db, const char *format, ...) int len = vsprintf(buffer, format, arglist); va_end(arglist); - while(1) + while(!g_exiting) { int res = mysql_query(&db->mysql, buffer); if(!res) break; @@ -62,6 +72,7 @@ void db_query(YAAMP_DB *db, const char *format, ...) stratumlog("SQL ERROR: %d, %s\n", res, mysql_error(&db->mysql)); if(res != CR_SERVER_GONE_ERROR && res != CR_SERVER_LOST) exit(1); + usleep(100*YAAMP_MS); db_reconnect(db); } @@ -74,6 +85,7 @@ void db_register_stratum(YAAMP_DB *db) { int pid = getpid(); int t = time(NULL); + if(!db) return; db_query(db, "insert into stratums (pid, time, algo) values (%d, %d, '%s') on duplicate key update time=%d", pid, t, g_current_algo->name, t); @@ -81,6 +93,8 @@ void db_register_stratum(YAAMP_DB *db) void db_update_algos(YAAMP_DB *db) { + if(!db) return; + if(g_current_algo->overflow) { debuglog("setting overflow\n"); @@ -127,6 +141,8 @@ void db_update_algos(YAAMP_DB *db) void db_update_coinds(YAAMP_DB *db) { + if(!db) return; + for(CLI li = g_list_coind.first; li; li = li->next) { YAAMP_COIND *coind = (YAAMP_COIND *)li->data; @@ -291,6 +307,8 @@ void db_update_coinds(YAAMP_DB *db) void db_update_remotes(YAAMP_DB *db) { + if(!db) return; + db_query(db, "select id, speed/1000000, host, port, username, password, time, price, renterid from jobs where active and ready and algo='%s' order by time", g_stratum_algo); MYSQL_RES *result = mysql_store_result(&db->mysql); @@ -420,6 +438,8 @@ void db_update_remotes(YAAMP_DB *db) void db_update_renters(YAAMP_DB *db) { + if(!db) return; + db_query(db, "select id, balance, updated from renters"); MYSQL_RES *result = mysql_store_result(&db->mysql); @@ -456,12 +476,10 @@ static void _json_str_safe(YAAMP_DB *db, json_value *json, const char *key, size { json_value *val = json_get_val(json, key); out[0] = '\0'; - if (val && json_is_string(val)) { + if (db && val && json_is_string(val)) { strncpy(out, json_string_value(val), maxlen); out[maxlen-1] = '\0'; db_clean_string(db, out); - } else { - //debuglog("stats: invalid string for field '%s'\n", key); } } #define json_str_safe(stats, k, out) _json_str_safe(db, stats, k, sizeof(out), out) @@ -487,6 +505,8 @@ void db_store_stats(YAAMP_DB *db, YAAMP_CLIENT *client, json_value *stats) double khashes, intensity, throughput; int power, freq, memf; + if (!db) return; + json_str_safe(stats, "algo", salgo); if (strcasecmp(g_current_algo->name, salgo) && client->submit_bad) { // debuglog("stats: wrong algo used %s != %s", salgo, g_current_algo->name); diff --git a/stratum/job.cpp b/stratum/job.cpp index b8a4a47..3653cc0 100644 --- a/stratum/job.cpp +++ b/stratum/job.cpp @@ -233,7 +233,7 @@ pthread_cond_t g_job_cond; void *job_thread(void *p) { CommonLock(&g_job_mutex); - while(1) + while(!g_exiting) { job_update(); pthread_cond_wait(&g_job_cond, &g_job_mutex); diff --git a/stratum/rpc.cpp b/stratum/rpc.cpp index f81dce0..66f857d 100644 --- a/stratum/rpc.cpp +++ b/stratum/rpc.cpp @@ -11,6 +11,7 @@ bool rpc_connected(YAAMP_RPC *rpc) bool rpc_connect(YAAMP_RPC *rpc) { rpc_close(rpc); + if(g_exiting) return false; struct hostent *ent = gethostbyname(rpc->host); if(!ent) return false; @@ -144,7 +145,7 @@ char *rpc_do_call(YAAMP_RPC *rpc, char const *data) int bufpos = 0; char buffer[YAAMP_SMALLBUFSIZE] = { 0 }; - while(1) + while(!g_exiting) { int bytes = recv(rpc->sock, buffer+bufpos, YAAMP_SMALLBUFSIZE-bufpos-1, 0); #ifdef RPC_DEBUGLOG_ diff --git a/stratum/stratum.cpp b/stratum/stratum.cpp index d61dfd9..e9f6950 100644 --- a/stratum/stratum.cpp +++ b/stratum/stratum.cpp @@ -41,6 +41,8 @@ pthread_mutex_t g_job_create_mutex; struct ifaddrs *g_ifaddr; +volatile bool g_exiting = false; + void *stratum_thread(void *p); void *monitor_thread(void *p); @@ -238,10 +240,10 @@ int main(int argc, char **argv) pthread_t thread2; pthread_create(&thread2, NULL, stratum_thread, NULL); - while(1) - { - sleep(20); + sleep(20); + while(!g_exiting) + { db_register_stratum(db); db_update_workers(db); db_update_algos(db); @@ -274,9 +276,16 @@ int main(int argc, char **argv) object_prune(&g_list_worker, worker_delete); object_prune(&g_list_share, share_delete); object_prune(&g_list_submit, submit_delete); + + if (!g_exiting) sleep(20); } + stratumlog("closing database...\n"); db_close(db); + + pthread_join(thread2, NULL); + db_close(g_db); // client threads (called by stratum one) + return 0; } @@ -284,14 +293,15 @@ int main(int argc, char **argv) void *monitor_thread(void *p) { - while(1) + while(!g_exiting) { sleep(120); if(g_last_broadcasted + YAAMP_MAXJOBDELAY < time(NULL)) { + g_exiting = true; stratumlog("%s dead lock, exiting...\n", g_current_algo->name); - exit(1); + // exit(1); } } } @@ -320,7 +330,7 @@ void *stratum_thread(void *p) ///////////////////////////////////////////////////////////////////////// - while(1) + while(!g_exiting) { int sock = accept(listen_sock, NULL, NULL); if(sock <= 0) diff --git a/stratum/stratum.h b/stratum/stratum.h index 5efab17..f828f0f 100644 --- a/stratum/stratum.h +++ b/stratum/stratum.h @@ -90,6 +90,8 @@ extern pthread_mutex_t g_db_mutex; extern pthread_mutex_t g_nonce1_mutex; extern pthread_mutex_t g_job_create_mutex; +extern volatile bool g_exiting; + #include "db.h" #include "object.h" #include "socket.h"