queue: clear queue when stratum says to abandon old work

This commit is contained in:
johnny9 2023-05-07 12:34:02 -04:00
parent f80805f53a
commit 40cb7fac61
3 changed files with 24 additions and 4 deletions

View File

@ -146,6 +146,9 @@ static void admin_task(void *pvParameters)
stratum_method method = parse_stratum_method(line);
if (method == MINING_NOTIFY) {
if (should_abandon_work(line)) {
queue_clear(&g_queue);
}
queue_enqueue(&g_queue, line);
} else {
free(line);

View File

@ -1,6 +1,6 @@
#include "work_queue.h"
void queue_init(work_queue *queue) {
void queue_init(work_queue * queue) {
queue->head = 0;
queue->tail = 0;
queue->count = 0;
@ -9,7 +9,7 @@ void queue_init(work_queue *queue) {
pthread_cond_init(&queue->not_full, NULL);
}
void queue_enqueue(work_queue *queue, char * new_work) {
void queue_enqueue(work_queue * queue, char * new_work) {
pthread_mutex_lock(&queue->lock);
while (queue->count == QUEUE_SIZE) {
@ -24,7 +24,7 @@ void queue_enqueue(work_queue *queue, char * new_work) {
pthread_mutex_unlock(&queue->lock);
}
char * queue_dequeue(work_queue *queue, int *termination_flag) {
char * queue_dequeue(work_queue * queue, int *termination_flag) {
pthread_mutex_lock(&queue->lock);
while (queue->count == 0) {
@ -43,4 +43,20 @@ char * queue_dequeue(work_queue *queue, int *termination_flag) {
pthread_mutex_unlock(&queue->lock);
return next_work;
}
}
void queue_clear(work_queue * queue)
{
pthread_mutex_lock(&queue->lock);
while (queue->count > 0)
{
char * next_work = queue->buffer[queue->head];
free(next_work);
queue->head = (queue->head + 1) % QUEUE_SIZE;
queue->count--;
}
pthread_cond_signal(&queue->not_full);
pthread_mutex_unlock(&queue->lock);
}

View File

@ -19,5 +19,6 @@ typedef struct {
void queue_init(work_queue *queue);
void queue_enqueue(work_queue *queue, char * new_work);
char * queue_dequeue(work_queue *queue, int *termination_flag);
void queue_clear(work_queue *queue);
#endif // WORK_QUEUE_H