Browse Source

call a separate get_devices() with locking, as required

nfactor-troky
Kano 12 years ago
parent
commit
bc5755233c
  1. 49
      api.c
  2. 31
      cgminer.c
  3. 7
      driver-ztex.c
  4. 1
      miner.h
  5. 8
      usbutils.c

49
api.c

@ -1194,13 +1194,17 @@ static int pgadevice(int pgaid) @@ -1194,13 +1194,17 @@ static int pgadevice(int pgaid)
if (devices[i]->drv->drv_id == DRIVER_MODMINER)
count++;
#endif
if (count == (pgaid + 1)) {
mutex_unlock(&devices_lock);
return i;
}
if (count == (pgaid + 1))
goto foundit;
}
mutex_unlock(&devices_lock);
return -1;
foundit:
mutex_unlock(&devices_lock);
return i;
}
#endif
@ -1533,14 +1537,9 @@ static void pgastatus(struct io_data *io_data, int pga, bool isjson, bool precom @@ -1533,14 +1537,9 @@ static void pgastatus(struct io_data *io_data, int pga, bool isjson, bool precom
if (dev < 0) // Should never happen
return;
struct cgpu_info *cgpu;
struct cgpu_info *cgpu = get_devices(dev);
double frequency = 0;
float temp;
mutex_lock(&devices_lock);
cgpu = devices[dev];
mutex_unlock(&devices_lock);
temp = cgpu->temp;
float temp = cgpu->temp;
#ifdef USE_ZTEX
if (cgpu->drv->drv_id == DRIVER_ZTEX && cgpu->device_ztex)
@ -1787,9 +1786,7 @@ static void pgaenable(struct io_data *io_data, __maybe_unused SOCKETTYPE c, char @@ -1787,9 +1786,7 @@ static void pgaenable(struct io_data *io_data, __maybe_unused SOCKETTYPE c, char
return;
}
mutex_lock(&devices_lock);
cgpu = devices[dev];
mutex_unlock(&devices_lock);
cgpu = get_devices(dev);
applog(LOG_DEBUG, "API: request to pgaenable pgaid %d device %d %s%u",
id, dev, cgpu->drv->name, cgpu->device_id);
@ -1854,9 +1851,7 @@ static void pgadisable(struct io_data *io_data, __maybe_unused SOCKETTYPE c, cha @@ -1854,9 +1851,7 @@ static void pgadisable(struct io_data *io_data, __maybe_unused SOCKETTYPE c, cha
return;
}
mutex_lock(&devices_lock);
cgpu = devices[dev];
mutex_unlock(&devices_lock);
cgpu = get_devices(dev);
applog(LOG_DEBUG, "API: request to pgadisable pgaid %d device %d %s%u",
id, dev, cgpu->drv->name, cgpu->device_id);
@ -1900,9 +1895,7 @@ static void pgaidentify(struct io_data *io_data, __maybe_unused SOCKETTYPE c, ch @@ -1900,9 +1895,7 @@ static void pgaidentify(struct io_data *io_data, __maybe_unused SOCKETTYPE c, ch
return;
}
mutex_lock(&devices_lock);
cgpu = devices[dev];
mutex_unlock(&devices_lock);
cgpu = get_devices(dev);
drv = cgpu->drv;
if (!drv->identify_device)
@ -2830,9 +2823,7 @@ static void notify(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __maybe @@ -2830,9 +2823,7 @@ static void notify(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __maybe
io_open = io_add(io_data, COMSTR JSON_NOTIFY);
for (i = 0; i < total_devices; i++) {
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
cgpu = get_devices(i);
notifystatus(io_data, i, cgpu, isjson, group);
}
@ -2859,9 +2850,7 @@ static void devdetails(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __m @@ -2859,9 +2850,7 @@ static void devdetails(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __m
io_open = io_add(io_data, COMSTR JSON_DEVDETAILS);
for (i = 0; i < total_devices; i++) {
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
cgpu = get_devices(i);
root = api_add_int(root, "DEVDETAILS", &i, false);
root = api_add_string(root, "Name", cgpu->drv->name, false);
@ -2971,9 +2960,7 @@ static void minerstats(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __m @@ -2971,9 +2960,7 @@ static void minerstats(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __m
i = 0;
for (j = 0; j < total_devices; j++) {
mutex_lock(&devices_lock);
cgpu = devices[j];
mutex_unlock(&devices_lock);
cgpu = get_devices(j);
if (cgpu && cgpu->drv) {
if (cgpu->drv->get_api_stats)
@ -3248,9 +3235,7 @@ static void pgaset(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __maybe @@ -3248,9 +3235,7 @@ static void pgaset(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __maybe
return;
}
mutex_lock(&devices_lock);
cgpu = devices[dev];
mutex_unlock(&devices_lock);
cgpu = get_devices(dev);
drv = cgpu->drv;
char *set = strchr(opt, ',');

31
cgminer.c

@ -390,6 +390,16 @@ static struct cgpu_info *get_thr_cgpu(int thr_id) @@ -390,6 +390,16 @@ static struct cgpu_info *get_thr_cgpu(int thr_id)
return thr->cgpu;
}
struct cgpu_info *get_devices(int id)
{
struct cgpu_info *cgpu;
mutex_lock(&devices_lock);
cgpu = devices[id];
mutex_unlock(&devices_lock);
return cgpu;
}
static void sharelog(const char*disposition, const struct work*work)
{
char *target, *hash, *data;
@ -4043,11 +4053,7 @@ void zero_stats(void) @@ -4043,11 +4053,7 @@ void zero_stats(void)
zero_bestshare();
for (i = 0; i < total_devices; ++i) {
struct cgpu_info *cgpu;
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
struct cgpu_info *cgpu = get_devices(i);
mutex_lock(&hash_lock);
cgpu->total_mhashes = 0;
@ -5967,17 +5973,12 @@ static void *watchdog_thread(void __maybe_unused *userdata) @@ -5967,17 +5973,12 @@ static void *watchdog_thread(void __maybe_unused *userdata)
}
for (i = 0; i < total_devices; ++i) {
struct cgpu_info *cgpu;
struct thr_info *thr;
struct cgpu_info *cgpu = get_devices(i);
struct thr_info *thr = cgpu->thr[0];
enum dev_enable *denable;
char dev_str[8];
int gpu;
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
thr = cgpu->thr[0];
if (cgpu->drv->get_stats)
cgpu->drv->get_stats(cgpu);
@ -6141,10 +6142,8 @@ void print_summary(void) @@ -6141,10 +6142,8 @@ void print_summary(void)
applog(LOG_WARNING, "Summary of per device statistics:\n");
for (i = 0; i < total_devices; ++i) {
struct cgpu_info *cgpu;
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
struct cgpu_info *cgpu = get_devices(i);
log_print_status(cgpu);
}

7
driver-ztex.c

@ -389,10 +389,11 @@ static void ztex_shutdown(struct thr_info *thr) @@ -389,10 +389,11 @@ static void ztex_shutdown(struct thr_info *thr)
static void ztex_disable(struct thr_info *thr)
{
struct cgpu_info *cgpu;
applog(LOG_ERR, "%s: Disabling!", thr->cgpu->device_ztex->repr);
mutex_lock(&devices_lock);
devices[thr->cgpu->device_id]->deven = DEV_DISABLED;
mutex_unlock(&devices_lock);
cgpu = get_devices(thr->cgpu->device_id);
cgpu->deven = DEV_DISABLED;
ztex_shutdown(thr);
}

1
miner.h

@ -1110,6 +1110,7 @@ extern void free_work(struct work *work); @@ -1110,6 +1110,7 @@ extern void free_work(struct work *work);
extern void __copy_work(struct work *work, struct work *base_work);
extern struct work *copy_work(struct work *base_work);
extern struct thr_info *get_thread(int thr_id);
extern struct cgpu_info *get_devices(int id);
enum api_data_type {
API_ESCAPE,

8
usbutils.c

@ -624,9 +624,7 @@ static bool cgminer_usb_lock_bd(struct device_drv *drv, uint8_t bus_number, uint @@ -624,9 +624,7 @@ static bool cgminer_usb_lock_bd(struct device_drv *drv, uint8_t bus_number, uint
case WAIT_ABANDONED:
// Am I using it already?
for (i = 0; i < total_devices; i++) {
mutex_lock(&devices_lock);
cgpu = devices[i];
mutex_unlock(&devices_lock);
cgpu = get_devices(i);
if (cgpu->usbinfo.bus_number == bus_number &&
cgpu->usbinfo.device_address == device_address &&
cgpu->usbinfo.nodev == false) {
@ -867,9 +865,7 @@ static void release_cgpu(struct cgpu_info *cgpu) @@ -867,9 +865,7 @@ static void release_cgpu(struct cgpu_info *cgpu)
// Any devices sharing the same USB device should be marked also
// Currently only MMQ shares a USB device
for (i = 0; i < total_devices; i++) {
mutex_lock(&devices_lock);
lookcgpu = devices[i];
mutex_unlock(&devices_lock);
lookcgpu = get_devices(i);
if (lookcgpu != cgpu && lookcgpu->usbdev == cgusb) {
lookcgpu->usbinfo.nodev = true;
lookcgpu->usbinfo.nodev_count++;

Loading…
Cancel
Save