Browse Source

Provide a funcion that looks up queued work by midstate and then removes it from the device hash database.

nfactor-troky
Con Kolivas 11 years ago
parent
commit
572df10207
  1. 25
      cgminer.c
  2. 1
      miner.h

25
cgminer.c

@ -6139,19 +6139,38 @@ struct work *clone_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate
return ret; return ret;
} }
static void __work_completed(struct cgpu_info *cgpu, struct work *work)
{
if (work->queued)
cgpu->queued_count--;
HASH_DEL(cgpu->queued_work, work);
}
/* This function should be used by queued device drivers when they're sure /* This function should be used by queued device drivers when they're sure
* the work struct is no longer in use. */ * the work struct is no longer in use. */
void work_completed(struct cgpu_info *cgpu, struct work *work) void work_completed(struct cgpu_info *cgpu, struct work *work)
{ {
wr_lock(&cgpu->qlock); wr_lock(&cgpu->qlock);
if (work->queued) __work_completed(cgpu, work);
cgpu->queued_count--;
HASH_DEL(cgpu->queued_work, work);
wr_unlock(&cgpu->qlock); wr_unlock(&cgpu->qlock);
free_work(work); free_work(work);
} }
/* Combines find_queued_work_bymidstate and work_completed in one function
* withOUT destroying the work so the driver must free it. */
struct work *take_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen)
{
struct work *work;
rd_lock(&cgpu->qlock);
work = __find_work_bymidstate(cgpu->queued_work, midstate, midstatelen, data, offset, datalen);
if (work)
__work_completed(cgpu, work);
rd_unlock(&cgpu->qlock);
return work;
}
static void flush_queue(struct cgpu_info *cgpu) static void flush_queue(struct cgpu_info *cgpu)
{ {
struct work *work, *tmp; struct work *work, *tmp;

1
miner.h

@ -1341,6 +1341,7 @@ extern struct work *__find_work_bymidstate(struct work *que, char *midstate, siz
extern struct work *find_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen); extern struct work *find_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen);
extern struct work *clone_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen); extern struct work *clone_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen);
extern void work_completed(struct cgpu_info *cgpu, struct work *work); extern void work_completed(struct cgpu_info *cgpu, struct work *work);
extern struct work *take_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen);
extern void hash_queued_work(struct thr_info *mythr); extern void hash_queued_work(struct thr_info *mythr);
extern void _wlog(const char *str); extern void _wlog(const char *str);
extern void _wlogprint(const char *str); extern void _wlogprint(const char *str);

Loading…
Cancel
Save