Files
VirtualC64-Core/C64/Message.cpp
T
2015-11-18 00:34:41 -06:00

134 lines
2.8 KiB
C++
Executable File

/*
* Message.cpp
* V64
*
* Created by Dirk Hoffmann on 25.12.09.
* Copyright 2009 Hochschule Karlsruhe. All rights reserved.
*
*/
#include "Message.h"
MessageQueue::MessageQueue()
{
r = w = 0;
pthread_mutex_init(&lock, NULL);
}
MessageQueue::~MessageQueue()
{
pthread_mutex_destroy(&lock);
}
void MessageQueue::printMessage(Message *msg)
{
switch (msg->id) {
case MSG_ROM_LOADED:
fprintf(stderr, "MSG_ROM_LOADED");
break;
case MSG_ROM_MISSING:
fprintf(stderr, "MSG_ROM_MISSING");
break;
case MSG_RUN:
fprintf(stderr, "MSG_RUN");
break;
case MSG_HALT:
fprintf(stderr, "MSG_HALT");
break;
case MSG_CPU:
fprintf(stderr, "MSG_CPU");
break;
case MSG_WARP:
fprintf(stderr, "MSG_WARP");
break;
case MSG_LOG:
fprintf(stderr, "MSG_LOG");
break;
case MSG_VC1541_ATTACHED:
fprintf(stderr, "MSG_VC1541_ATTACHED");
break;
case MSG_VC1541_DISK:
fprintf(stderr, "MSG_VC_1541_DISK");
break;
case MSG_VC1541_LED:
fprintf(stderr, "MSG_VC1541_LED");
break;
case MSG_VC1541_DATA:
fprintf(stderr, "MSG_VC1541_DATA");
break;
case MSG_VC1541_MOTOR:
fprintf(stderr, "MSG_VC1541_MOTOR");
break;
case MSG_CARTRIDGE:
fprintf(stderr, "MSG_CARTRIDGE");
break;
case MSG_JOYSTICK_ATTACHED:
fprintf(stderr, "MSG_JOYSTICK_ATTACHED");
break;
case MSG_JOYSTICK_REMOVED:
fprintf(stderr, "MSG_JOYSTICK_REMOVED");
break;
case MSG_PAL:
fprintf(stderr, "MSG_PAL");
break;
case MSG_NTSC:
fprintf(stderr, "MSG_NTSC");
break;
default:
assert(0);
}
}
Message *MessageQueue::getMessage()
{
Message *result;
pthread_mutex_lock(&lock);
// Get data
if (r == w) {
// Queue is empty!
// fprintf(stderr, "MessageQueue::read: Queue is empty!\n");
result = NULL;
} else {
// fprintf(stderr, "getMessage: "); printMessage(&queue[r]); fprintf(stderr,"\n");
result = (r == w) ? NULL : &queue[r];
}
// Move read pointer to next location
if (result) r = (r + 1) % QUEUE_SIZE;
pthread_mutex_unlock(&lock);
return result;
}
void MessageQueue::putMessage(int id, int i, void *p, const char *c)
{
// If queue gets filled up, we don't accept any periodic messages any more...
//if (queueGetsFilledUp() && id == MSG_DRAW) {
// return;
//}
pthread_mutex_lock(&lock);
// Write data
queue[w].id = id;
queue[w].i = i;
queue[w].p = p;
if (c != NULL) strncpy(queue[w].c, c, 128);
// fprintf(stderr, "putMessage: "); printMessage(&queue[w]); fprintf(stderr,"\n");
// Move write pointer to next location
w = (w + 1) % QUEUE_SIZE;
if (w == r) {
fprintf(stderr, "putMessag: Queue overflow!!! Message is lost!!!\n");
// assert(0);
r = (r + 1) % QUEUE_SIZE;
}
pthread_mutex_unlock(&lock);
}