ESP-Miner/main/work_queue.c
2023-08-26 12:28:17 -04:00

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);
}