mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-10 23:08:07 +00:00
API v0.1
This commit is contained in:
parent
9671f0a22b
commit
2358056606
1
AUTHORS
1
AUTHORS
@ -1,2 +1,3 @@
|
||||
Original CPU mining software: Jeff Garzik <jgarzik@pobox.com>
|
||||
GPU mining and rewrite: Con Kolivas <kernel@kolivas.org> 15qSxP1SQcUX3o4nhkfdbgyoWEFMomJ4rZ
|
||||
API+: Kano <kanoi@kano-kun.net> 1Jjk2LmktEQKnv8r2cZ9MvLiZwZ9gxabKm
|
||||
|
@ -27,7 +27,7 @@ cgminer_SOURCES = elist.h miner.h compat.h bench_block.h \
|
||||
sha256_altivec_4way.c \
|
||||
adl.c adl.h adl_functions.h \
|
||||
phatk110817.cl poclbm110817.cl \
|
||||
sha2.c sha2.h
|
||||
sha2.c sha2.h api.c
|
||||
|
||||
cgminer_LDFLAGS = $(PTHREAD_FLAGS)
|
||||
cgminer_LDADD = $(DLOPEN_FLAGS) @LIBCURL_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@ @OPENCL_LIBS@ @NCURSES_LIBS@ @PDCURSES_LIBS@ @WS2_LIBS@ lib/libgnu.a ccan/libccan.a
|
||||
|
93
api.c
93
api.c
@ -34,29 +34,38 @@
|
||||
// #include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
// Big enough for largest API request
|
||||
// though a PC with 100s of CPUs may exceed the size ...
|
||||
// Current code assumes it can socket send this size also
|
||||
#define MYBUFSIZ 16384
|
||||
|
||||
// Socket is on 127.0.0.1
|
||||
#define QUEUE 10
|
||||
|
||||
static char *buffer = NULL;
|
||||
|
||||
static const char *UNAVAILABLE = " - API will not be available";
|
||||
|
||||
static const char *BLANK = "";
|
||||
|
||||
static const char *VERSION = "0.1";
|
||||
static const char *APIVERSION = "0.1";
|
||||
static const char *DEAD = "DEAD";
|
||||
static const char *SICK = "SICK";
|
||||
static const char *DISABLED = "DISABLED";
|
||||
static const char * = "";
|
||||
zzz -> other pool status
|
||||
static const char *ALIVE = "ALIVE";
|
||||
|
||||
static const char *YES = "Y";
|
||||
static const char *NO = "N";
|
||||
|
||||
static int bye = 0;
|
||||
|
||||
char *apiversion(char *params)
|
||||
{
|
||||
return VERSION;
|
||||
return (char *)APIVERSION;
|
||||
}
|
||||
|
||||
void gpustatus(int thr_id)
|
||||
@ -68,7 +77,7 @@ void gpustatus(int thr_id)
|
||||
int gf, gp;
|
||||
|
||||
if (thr_id >= 0 && thr_id < gpu_threads) {
|
||||
int gpu = dev_from_id(thr_id);
|
||||
int gpu = thr_info[thr_id].cgpu->cpu_gpu;
|
||||
struct cgpu_info *cgpu = &gpus[gpu];
|
||||
|
||||
cgpu->utility = cgpu->accepted / ( total_secs ? total_secs : 1 ) * 60;
|
||||
@ -84,21 +93,21 @@ void gpustatus(int thr_id)
|
||||
gt = gf = gp = 0;
|
||||
|
||||
if (cgpu->status == LIFE_DEAD)
|
||||
status = DEAD;
|
||||
status = (char *)DEAD;
|
||||
else if (cgpu->status == LIFE_SICK)
|
||||
status = SICK;
|
||||
status = (char *)SICK;
|
||||
else if (!gpu_devices[gpu])
|
||||
status = DISABLED;
|
||||
status = (char *)DISABLED;
|
||||
else {
|
||||
sprintf(status_buf, "%.1f", cgpu->rolling);
|
||||
status = status_buf;
|
||||
}
|
||||
|
||||
sprintf(buf, "G%d=%.2f,%d,%d,%s,%.2f,%d,%d,%d,%.2f,%d|",
|
||||
sprintf(buf, "GPU=%d,GT=%.2f,FR=%d,FP=%d,STA=%s,MHS=%.2f,A=%d,R=%d,HW=%d,U=%.2f,I=%d|",
|
||||
gpu, gt, gf, gp, status,
|
||||
cgpu->total_mhashes / total_secs,
|
||||
cgpu->accepted, cgpu->rejected, cgpu->hw_errors,
|
||||
cgpu->utility, gpus[gpu].intensity);
|
||||
cgpu->utility, gpus->intensity);
|
||||
|
||||
strcat(buffer, buf);
|
||||
}
|
||||
@ -109,16 +118,16 @@ void cpustatus(int thr_id)
|
||||
char buf[BUFSIZ];
|
||||
|
||||
if (thr_id >= gpu_threads) {
|
||||
int cpu = dev_from_id(thr_id);
|
||||
int cpu = thr_info[thr_id].cgpu->cpu_gpu;
|
||||
struct cgpu_info *cgpu = &cpus[cpu];
|
||||
|
||||
cgpu->utility = cgpu->accepted / ( total_secs ? total_secs : 1 ) * 60;
|
||||
|
||||
sprintf(buf, "C%d=%.2f,%.2f,%d,%d,%d,%.2f,%d|",
|
||||
sprintf(buf, "CPU=%d,STA=%.2f,MHS=%.2f,A=%d,R=%d,U=%.2f|",
|
||||
cpu, cgpu->rolling,
|
||||
cgpu->total_mhashes / total_secs,
|
||||
cgpu->accepted, cgpu->rejected, cgpu->hw_errors,
|
||||
cgpu->utility, gpus[gpu].intensity);
|
||||
cgpu->accepted, cgpu->rejected,
|
||||
cgpu->utility);
|
||||
|
||||
strcat(buffer, buf);
|
||||
}
|
||||
@ -142,7 +151,7 @@ char *devstatus(char *params)
|
||||
char *poolstatus(char *params)
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
char *status;
|
||||
char *status, *lp;
|
||||
int i;
|
||||
|
||||
*buffer = '\0';
|
||||
@ -151,12 +160,22 @@ char *poolstatus(char *params)
|
||||
struct pool *pool = pools[i];
|
||||
|
||||
if (!pool->enabled)
|
||||
status = DISABLED;
|
||||
status = (char *)DISABLED;
|
||||
else
|
||||
status = OK;
|
||||
{
|
||||
if (pool->idle)
|
||||
status = (char *)DEAD;
|
||||
else
|
||||
status = (char *)ALIVE;
|
||||
}
|
||||
|
||||
sprintf(buf, "P%d=%s,%s,%d,%d,%d,%d,%d,%d,%d|",
|
||||
i, pool->rpc_url, status,
|
||||
if (pool->hdr_path)
|
||||
lp = (char *)YES;
|
||||
else
|
||||
lp = (char *)NO;
|
||||
|
||||
sprintf(buf, "POOL=%d,URL=%s,STA=%s,PRI=%d,LP=%s,Q=%d,A=%d,R=%d,DW=%d,ST=%d,GF=%d,RF=%d|",
|
||||
i, pool->rpc_url, status, pool->prio, lp,
|
||||
pool->getwork_requested,
|
||||
pool->accepted, pool->rejected,
|
||||
pool->discarded_work,
|
||||
@ -171,31 +190,33 @@ char *poolstatus(char *params)
|
||||
}
|
||||
|
||||
struct CMDS {
|
||||
const char *cmd;
|
||||
char (*func)();
|
||||
char *name;
|
||||
char *(*func)(char *);
|
||||
} cmds[] = {
|
||||
{ "apiversion", apiversion },
|
||||
{ "dev", devstatus },
|
||||
{ "pool", poolstatus }
|
||||
{ "pool", poolstatus },
|
||||
};
|
||||
|
||||
#define MAXCMD sizeof(cmds)/sizeof(struct CMDS)
|
||||
#define CMDMAX 3
|
||||
|
||||
void send_result(int c, char *result)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (result == NULL)
|
||||
result = BLANK;
|
||||
result = (char *)BLANK;
|
||||
|
||||
// ignore failure - it's closed immediately anyway
|
||||
n = write(c, result, strlen(result)+1);
|
||||
}
|
||||
|
||||
static void api()
|
||||
void api()
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
const char *addr;
|
||||
int c, sock, n, bound;
|
||||
char tmpaddr[32];
|
||||
char *binderror;
|
||||
time_t bindstart;
|
||||
short int port = 4028;
|
||||
@ -205,13 +226,14 @@ static void api()
|
||||
long long counter;
|
||||
char *result;
|
||||
char *params;
|
||||
int i;
|
||||
|
||||
addr = "127.0.0.1";
|
||||
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
applog(LOG_ERR, "API1 initialisation failed (%s)%s", strerror(errno), UNAVAILABLE);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&serv, 0, sizeof(serv));
|
||||
@ -219,7 +241,7 @@ static void api()
|
||||
serv.sin_family = AF_INET;
|
||||
if (inet_pton(AF_INET, addr, &(serv.sin_addr)) == 0) {
|
||||
applog(LOG_ERR, "API2 initialisation failed (%s)%s", strerror(errno), UNAVAILABLE);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
serv.sin_port = htons(port);
|
||||
|
||||
@ -232,8 +254,8 @@ static void api()
|
||||
if ((time(NULL) - bindstart) > 61)
|
||||
break;
|
||||
else {
|
||||
applog(LOG_ERR, "API bind to port %d failed - trying again in 10sec", port);
|
||||
sleep(10);
|
||||
applog(LOG_ERR, "API bind to port %d failed - trying again in 15sec", port);
|
||||
sleep(15);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -242,13 +264,13 @@ static void api()
|
||||
|
||||
if (bound == 0) {
|
||||
applog(LOG_ERR, "API bind to port %d failed (%s)%s", port, binderror, UNAVAILABLE);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (listen(sock, QUEUE) < 0) {
|
||||
applog(LOG_ERR, "API3 initialisation failed (%s)%s", strerror(errno), UNAVAILABLE);
|
||||
close(sock);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
buffer = malloc(MYBUFSIZ+1);
|
||||
@ -262,24 +284,25 @@ static void api()
|
||||
applog(LOG_ERR, "API failed (%s)%s", strerror(errno), UNAVAILABLE);
|
||||
close(sock);
|
||||
free(buffer);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
inet_ntop(AF_INET, &(cli.sin_addr), &(tmpaddr[0]), sizeof(tmpaddr)-1);
|
||||
if (strcmp(tmpaddr, addr) != 0)
|
||||
close(c);
|
||||
else {
|
||||
n = read(c, &buf[0], BUFS);
|
||||
n = read(c, &buf[0], BUFSIZ-1);
|
||||
if (n < 0)
|
||||
close(c);
|
||||
else {
|
||||
buf[n] = '\0';
|
||||
params = strchr(buf, '|');
|
||||
if (params != NULL)
|
||||
*(params++) = '\0';
|
||||
|
||||
for (i = 0; i < CMDMAX; i++) {
|
||||
if (strcmp(buf, cmds[i].name) == 0) {
|
||||
result = cmds[i].func(params);
|
||||
result = (cmds[i].func)(params);
|
||||
send_result(c, result);
|
||||
close(c);
|
||||
break;
|
||||
@ -291,6 +314,4 @@ static void api()
|
||||
|
||||
close(sock);
|
||||
free(buffer);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1,22 +1,35 @@
|
||||
How to setup a cgminer using xubuntu 11.04 live on a USB courtesy of Kano
|
||||
How to setup a cgminer using xubuntu 11.04 live on a USB
|
||||
|
||||
The master version of this document is here:
|
||||
https://github.com/kanoi/linux-usb-cgminer
|
||||
|
||||
The actual file is:
|
||||
https://github.com/kanoi/linux-usb-cgminer/blob/master/linux-usb-cgminer
|
||||
|
||||
The copy in cgminer (check to make sure it isn't older) is:
|
||||
https://github.com/ckolivas/cgminer/blob/master/linux-usb-cgminer
|
||||
|
||||
The original old verion on bitcointalk is:
|
||||
https://bitcointalk.org/index.php?topic=28402.msg426741#msg426741
|
||||
|
||||
Software
|
||||
========
|
||||
Short hardware comment:
|
||||
Your mining computer doesn't need any HDD or CD/DVD/BD as long as it has at
|
||||
least 2GB of RAM, can boot USB, has some network connection to the internet and
|
||||
of course a reasonable mining ATI graphics card
|
||||
least 2GB of RAM, can boot USB, has some network connection to the internet
|
||||
and of course a reasonable mining ATI graphics card
|
||||
... Or you can boot a windows PC with the USB to only do mining ... and ignore
|
||||
the system HDD ... wasting energy Smiley
|
||||
the system HDD ... wasting energy running the HDD :)
|
||||
|
||||
To create the USB, you need of course a 4GB USB and temporarily need a PC with a
|
||||
CD (or DVD/BD) writer, a USB port and of course an internet connection to the PC
|
||||
To create the USB, you need of course a 4GB USB and temporarily need a PC
|
||||
with a CD (or DVD/BD) writer, a USB port and of course an internet
|
||||
connection to the PC
|
||||
|
||||
1) Download the xubuntu 11.04 desktop live CD iso for amd64
|
||||
( look here for mirrors: http://www.xubuntu.org/getubuntu )
|
||||
|
||||
2) Burn it to CD then boot that temporarily on any PC with a CD/DVD/BD and a USB
|
||||
port (this and the next 2 step won't effect that PC)
|
||||
2) Burn it to CD then boot that temporarily on any PC with a CD/DVD/BD and
|
||||
a USB port (this and the next 2 step won't effect that PC)
|
||||
|
||||
3) Plug in your 4GB USB device and it should appear on the desktop - you can
|
||||
leave it's contents as long as there is at least 2.8GB free
|
||||
@ -24,8 +37,8 @@ CD (or DVD/BD) writer, a USB port and of course an internet connection to the PC
|
||||
4) Now run "Startup Disk Creator" in "Applications->System"
|
||||
(the system menu is the little rat in the top left corner)
|
||||
|
||||
(if you have no mouse you can get the menu with <ctr><esc> and navigate the menu
|
||||
with the arrow keys and <return> key)
|
||||
(if you have no mouse you can get the menu with <ctr><esc> and navigate
|
||||
the menu with the arrow keys and <return> key)
|
||||
|
||||
From here select the boot CD as the "Source" and the USB as the "Disk to use"
|
||||
lastly move the slider to 2GB for reserved extra space
|
||||
@ -46,21 +59,21 @@ After about 10-15 minutes you have a base xubuntu 11.04 boot USB
|
||||
7) sudo apt-get install openssh-server screen
|
||||
|
||||
if you have a problem here then it's probably coz the internet isn't
|
||||
available ... sort that out by reading elsewhere about routers etc
|
||||
available ... sort that out by reading elsewhere about routers etc
|
||||
|
||||
8) sudo apt-get install fglrx fglrx-amdcccle fglrx-dev
|
||||
sudo sync
|
||||
sudo shutdown -r now
|
||||
|
||||
N.B. always do a "sudo sync" and wait for it to finish every time before
|
||||
shutting down the PC to ensure all data is written to the USB
|
||||
shutting down the PC to ensure all data is written to the USB
|
||||
|
||||
9) sudo aticonfig --lsa
|
||||
this lists your ATI cards so you can see them
|
||||
sudo aticonfig --adapter=all --odgt
|
||||
this checks it can access all the cards ...
|
||||
|
||||
10) aticonfig --adapter=all --initial
|
||||
10) sudo aticonfig --adapter=all --initial
|
||||
this gets an error - no idea why but the xorg.conf is OK
|
||||
sudo sync
|
||||
sudo shutdown -r now
|
||||
@ -91,13 +104,17 @@ N.B. always do a "sudo sync" and wait for it to finish every time before
|
||||
13) cgminer:
|
||||
sudo apt-get install curl
|
||||
|
||||
get the binary linux cgminer (see the bitcoin forum cgminer thread
|
||||
for where to get it)
|
||||
get the binary linux cgminer
|
||||
(see the bitcoin forum cgminer thread for where to get it)
|
||||
https://bitcointalk.org/index.php?topic=28402.0
|
||||
|
||||
./cgminer -n
|
||||
this shows you the GPU's it found on your PC
|
||||
See further below if you get an error regarding libtinfo.so.5
|
||||
|
||||
14) An OC option:
|
||||
This is no longer needed since cgminer 2.* includes OC, however:
|
||||
|
||||
sudo apt-get install libwxbase2.8-0 libwxgtk2.8-0
|
||||
|
||||
http://sourceforge.net/projects/amdovdrvctrl/
|
||||
@ -106,21 +123,22 @@ N.B. always do a "sudo sync" and wait for it to finish every time before
|
||||
|
||||
15) set the screen saver to ONLY blank ...
|
||||
|
||||
Move the mouse to the bottom of the screen and you see a set of icons
|
||||
like on an Apple PC
|
||||
Move the mouse to the bottom of the screen and you see a set of icons like
|
||||
on an Apple PC
|
||||
Click on Settings, then in the Settings window "Screensaver"
|
||||
Set "Mode:" to "Blank Screen Only"
|
||||
|
||||
Edit: originally left this somewhat useful addition out:
|
||||
16) apt-get install ntpd
|
||||
An accurate clock is always a good idea Smiley
|
||||
An accurate clock is always a good idea :)
|
||||
|
||||
Edit2: another item that seems I missed
|
||||
17) if you wish to ssh into the box you must set a password
|
||||
to do this you simply have to be logged into it at the screen and type
|
||||
|
||||
sudo passwd ubuntu
|
||||
|
||||
it will prompt you (twice) to enter a password for the ubuntu account
|
||||
|
||||
|
||||
Initial setup complete.
|
||||
|
||||
========
|
||||
@ -129,17 +147,23 @@ If you want to SSH into the machine and run cgminer:
|
||||
From a terminal on the miner display each time after you boot:
|
||||
xhost +
|
||||
|
||||
Then after ssh into the machine:
|
||||
'xhost +' isn't needed if you ssh into the machine with the same
|
||||
username that the GUI boots into (which is 'ubuntu' in this case)
|
||||
|
||||
Then after you ssh into the machine:
|
||||
export DISPLAY=:0
|
||||
before running cgminer
|
||||
|
||||
Also note, that you should force the screen to blank when mining if the ATI card
|
||||
is displaying the screen (using the screen saver application menu)
|
||||
Also note, that you should force the screen to blank when mining if
|
||||
the ATI card is displaying the screen (using the screen saver
|
||||
application menu)
|
||||
In my case it takes away 50Mh/s when the screen isn't blanked
|
||||
It will auto blank - but make sure the blank is of course just blank
|
||||
as mentioned above at 15)
|
||||
|
||||
|
||||
This is of course just the basics ... but it should get you a computer up and
|
||||
running and able to run cgminer
|
||||
This is of course just the basics ... but it should get you a computer
|
||||
up and running and able to run cgminer
|
||||
|
||||
========
|
||||
|
||||
@ -147,10 +171,15 @@ You should keep an eye on USB disk space
|
||||
The system logger writes log files in the /var/log/ directory
|
||||
The two main ones that grow large are 'kern.log' and 'syslog'
|
||||
If you want to keep them, save them away to some other computer
|
||||
When space is low, just delete them.
|
||||
When space is low, just delete them e.g.
|
||||
|
||||
sudo rm -i /var/log/syslog
|
||||
sudo rm -i /var/log/kern.log
|
||||
|
||||
The 'df' command will show you the current space e.g.:
|
||||
|
||||
sudo df
|
||||
|
||||
Filesystem 1K-blocks Used Available Use% Mounted on
|
||||
aufs 2099420 892024 1100748 45% /
|
||||
none 1015720 628 1015092 1% /dev
|
||||
@ -164,3 +193,15 @@ none 1023772 0 1023772 0% /var/lock
|
||||
|
||||
This shows the 2GB space allocated when you setup the USB as '/' (aufs)
|
||||
In this example, it's currently 45% full with almost 1.1GB of free space
|
||||
|
||||
========
|
||||
|
||||
The latest version (2.0.8) of cgminer is built with 11.10 (not 11.04)
|
||||
If you get the following error when running the prebuilt version in 11.04:
|
||||
|
||||
./cgminer: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
|
||||
|
||||
The fix is to simply link the old curses library to the new name e.g.:
|
||||
|
||||
cd /lib64/
|
||||
sudo ln -s libncurses.so.5 libtinfo.so.5
|
||||
|
33
main.c
33
main.c
@ -219,11 +219,11 @@ static int nDevs;
|
||||
static int opt_g_threads = 2;
|
||||
static int opt_device;
|
||||
static int total_devices;
|
||||
static bool gpu_devices[MAX_GPUDEVICES];
|
||||
static int gpu_threads;
|
||||
bool gpu_devices[MAX_GPUDEVICES];
|
||||
int gpu_threads;
|
||||
static bool forced_n_threads;
|
||||
static int opt_n_threads;
|
||||
static int mining_threads;
|
||||
int mining_threads;
|
||||
static int num_processors;
|
||||
bool use_curses = true;
|
||||
static bool opt_submit_stale;
|
||||
@ -248,6 +248,7 @@ static int watchdog_thr_id;
|
||||
static int input_thr_id;
|
||||
static int gpur_thr_id;
|
||||
static int cpur_thr_id;
|
||||
static int api_thr_id;
|
||||
static int total_threads;
|
||||
|
||||
struct work_restart *work_restart = NULL;
|
||||
@ -273,15 +274,13 @@ static unsigned int found_blocks;
|
||||
static unsigned int local_work;
|
||||
static unsigned int total_go, total_ro;
|
||||
|
||||
#define MAX_POOLS (32)
|
||||
|
||||
static struct pool *pools[MAX_POOLS];
|
||||
struct pool *pools[MAX_POOLS];
|
||||
static struct pool *currentpool = NULL;
|
||||
|
||||
static float opt_donation = 0.0;
|
||||
static struct pool donationpool;
|
||||
|
||||
static int total_pools;
|
||||
int total_pools;
|
||||
static enum pool_strategy pool_strategy = POOL_FAILOVER;
|
||||
static int opt_rotate_period;
|
||||
static int total_urls, total_users, total_passes, total_userpasses;
|
||||
@ -1938,11 +1937,11 @@ static int requests_staged(void)
|
||||
}
|
||||
|
||||
static WINDOW *mainwin, *statuswin, *logwin;
|
||||
static double total_secs = 0.1;
|
||||
double total_secs = 0.1;
|
||||
static char statusline[256];
|
||||
static int cpucursor, gpucursor, logstart, logcursor;
|
||||
struct cgpu_info gpus[MAX_GPUDEVICES]; /* Maximum number apparently possible */
|
||||
static struct cgpu_info *cpus;
|
||||
struct cgpu_info *cpus;
|
||||
|
||||
static inline void unlock_curses(void)
|
||||
{
|
||||
@ -3747,6 +3746,15 @@ static void *workio_thread(void *userdata)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *api_thread(void *userdata)
|
||||
{
|
||||
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
||||
|
||||
api();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void thread_reportin(struct thr_info *thr)
|
||||
{
|
||||
gettimeofday(&thr->last, NULL);
|
||||
@ -6088,6 +6096,13 @@ retry_pools:
|
||||
if (thr_info_create(thr, NULL, reinit_gpu, thr))
|
||||
quit(1, "reinit_gpu thread create failed");
|
||||
|
||||
/* Create API socket thread */
|
||||
api_thr_id = mining_threads + 7;
|
||||
thr = &thr_info[api_thr_id];
|
||||
if (thr_info_create(thr, NULL, api_thread, thr))
|
||||
quit(1, "API thread create failed");
|
||||
pthread_detach(thr->pth);
|
||||
|
||||
sleep(opt_log_interval);
|
||||
if (opt_donation > 0.0)
|
||||
applog(LOG_WARNING, "Donation is enabled at %.1f%% thank you :-)", opt_donation);
|
||||
|
10
miner.h
10
miner.h
@ -394,8 +394,11 @@ struct work_restart {
|
||||
char padding[128 - sizeof(unsigned long)];
|
||||
};
|
||||
|
||||
extern void api();
|
||||
|
||||
|
||||
#define MAX_GPUDEVICES 16
|
||||
#define MAX_POOLS (32)
|
||||
|
||||
extern int hw_errors;
|
||||
extern bool use_syslog;
|
||||
@ -403,6 +406,13 @@ extern struct thr_info *thr_info;
|
||||
extern int longpoll_thr_id;
|
||||
extern struct work_restart *work_restart;
|
||||
extern struct cgpu_info gpus[MAX_GPUDEVICES];
|
||||
extern int gpu_threads;
|
||||
extern double total_secs;
|
||||
extern bool gpu_devices[MAX_GPUDEVICES];
|
||||
extern int mining_threads;
|
||||
extern struct cgpu_info *cpus;
|
||||
extern int total_pools;
|
||||
extern struct pool *pools[MAX_POOLS];
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
typedef struct {
|
||||
|
Loading…
Reference in New Issue
Block a user