mirror of
https://github.com/skot/ESP-Miner.git
synced 2025-03-18 05:42:16 +01:00
83 lines
1.9 KiB
C
83 lines
1.9 KiB
C
#include "work_queue.h"
|
|
#include "esp_log.h"
|
|
|
|
void queue_init(work_queue *queue)
|
|
{
|
|
queue->head = 0;
|
|
queue->tail = 0;
|
|
queue->count = 0;
|
|
pthread_mutex_init(&queue->lock, NULL);
|
|
pthread_cond_init(&queue->not_empty, NULL);
|
|
pthread_cond_init(&queue->not_full, NULL);
|
|
}
|
|
|
|
void queue_enqueue(work_queue *queue, void *new_work)
|
|
{
|
|
pthread_mutex_lock(&queue->lock);
|
|
|
|
while (queue->count == QUEUE_SIZE)
|
|
{
|
|
pthread_cond_wait(&queue->not_full, &queue->lock);
|
|
}
|
|
|
|
queue->buffer[queue->tail] = new_work;
|
|
queue->tail = (queue->tail + 1) % QUEUE_SIZE;
|
|
queue->count++;
|
|
|
|
pthread_cond_signal(&queue->not_empty);
|
|
pthread_mutex_unlock(&queue->lock);
|
|
}
|
|
|
|
void *queue_dequeue(work_queue *queue)
|
|
{
|
|
pthread_mutex_lock(&queue->lock);
|
|
|
|
while (queue->count == 0)
|
|
{
|
|
pthread_cond_wait(&queue->not_empty, &queue->lock);
|
|
}
|
|
|
|
void *next_work = queue->buffer[queue->head];
|
|
queue->head = (queue->head + 1) % QUEUE_SIZE;
|
|
queue->count--;
|
|
|
|
pthread_cond_signal(&queue->not_full);
|
|
pthread_mutex_unlock(&queue->lock);
|
|
|
|
return next_work;
|
|
}
|
|
|
|
void queue_clear(work_queue *queue)
|
|
{
|
|
pthread_mutex_lock(&queue->lock);
|
|
|
|
while (queue->count > 0)
|
|
{
|
|
mining_notify *next_work = queue->buffer[queue->head];
|
|
STRATUM_V1_free_mining_notify(next_work);
|
|
queue->head = (queue->head + 1) % QUEUE_SIZE;
|
|
queue->count--;
|
|
}
|
|
|
|
pthread_cond_signal(&queue->not_full);
|
|
pthread_mutex_unlock(&queue->lock);
|
|
}
|
|
|
|
void ASIC_jobs_queue_clear(work_queue *queue)
|
|
{
|
|
pthread_mutex_lock(&queue->lock);
|
|
|
|
while (queue->count > 0)
|
|
{
|
|
bm_job *next_work = queue->buffer[queue->head];
|
|
free(next_work->jobid);
|
|
free(next_work->extranonce2);
|
|
free(next_work);
|
|
queue->head = (queue->head + 1) % QUEUE_SIZE;
|
|
queue->count--;
|
|
}
|
|
|
|
pthread_cond_signal(&queue->not_full);
|
|
pthread_mutex_unlock(&queue->lock);
|
|
}
|