Проблемы с кольцевым буфером в общей памяти

Пишу программу производители - потребители на С использованием общей памяти POSIX. Столкнулся с проблемой выхода за границы. Помогите найти ошибку в логике. или может стоит сделать как-нибудь лучше? https://github.com/fozboom/UNIX-programming/tree/main/lab4_shared_memory

Вот участок кода для добавления и извлечения элементов из очереди, он ломается

void addMessageToQueue(CircularQueue *queue, Message *message) {
  if (isQueueFull(queue)) {
    printf("Queue is full\n");
    return;
  }
  if (queue->tailPosition >= (char *)queue->messages + SHM_SIZE) {
    printf("Queue is full\n");
    queue->tailPosition = (char *)queue->messages;
  }
  memcpy(queue->tailPosition, message, sizeof(Message));
  queue->tailPosition += sizeof(Message);

  if (queue->tailPosition >= (char *)queue->messages + SHM_SIZE) {
    printf("Queue is full\n");
    queue->tailPosition = (char *)queue->messages;
  }
  memcpy(queue->tailPosition, message->data, message->size);
  queue->tailPosition += message->size;

  queue->currentSize++;
  queue->countAddedMessages++;
}

Message *removeMessageFromQueue(CircularQueue *queue) {
  if (isQueueEmpty(queue)) {
    printf("Queue is empty\n");
    return NULL;
  }

  Message *message = (Message *)queue->headPosition;

  Message *messageCopy = (Message *)malloc(sizeof(Message));
  messageCopy->type = message->type;
  messageCopy->hash = message->hash;
  messageCopy->size = message->size;
  messageCopy->data = (char *)malloc(message->size);
  if (queue->headPosition >= (char *)queue->messages + SHM_SIZE) {
    queue->headPosition = (char *)queue->messages;
  }
  memcpy(messageCopy->data, queue->headPosition + sizeof(Message),
         message->size);

  queue->headPosition += sizeof(Message) + message->size;

  queue->currentSize--;
  queue->countRemovedMessages++;

  return messageCopy;
}

И вот сама очередь сообщений

typedef struct {
  Message *messages;
  char *headPosition;
  char *tailPosition;
  int maxCapacity;
  int countAddedMessages;
  int countRemovedMessages;
  int currentSize;
} CircularQueue;

typedef struct {
  uint8_t type;
  uint16_t hash;
  uint8_t size;
  char *data;
} Message;


Ответы (0 шт):