Multithread debugger and emulator with message queues
diff --git a/main.c b/main.c
index 3b1da46..779096c 100644
--- a/main.c
+++ b/main.c
@@ -6,23 +6,26 @@
#include <bits/getopt_core.h>
#include <ctype.h>
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
-
-extern sdl_screen_t *g_scr;
-
-#ifndef NO_PTHREAD
#include <pthread.h>
+#include <mqueue.h>
+#include <sys/stat.h>
void cleanup_screen_thread(pthread_t thread)
{
- g_screen_thread_halt = true;
puts("Cleaning up screen...");
- pthread_join(thread, NULL);
+ pthread_cancel(thread);
}
-#endif
+
+void cleanup_debug_prompt_thread(pthread_t thread)
+{
+ puts("Cleaning up debug prompt...");
+ pthread_cancel(thread);
+}
int main(int argc, char **argv)
{
@@ -97,11 +100,28 @@
}
cpu_t cpu;
+ mqd_t mq_to_cpu;
+
+ struct mq_attr attrs;
+ attrs.mq_maxmsg = 10;
+ attrs.mq_msgsize = MQ_BUF_LEN;
if (should_read)
{
cpu = new_cpu();
fread(cpu.mem + 0x600, 0xFFFF - 0x600, 1, input);
+
+ int unlink = mq_unlink(MQ_NAME);
+ if (unlink < 0 && errno != ENOENT)
+ {
+ printf("Warning: mq_unlink() error: %d %s\n", errno, strerror(errno));
+ }
+
+ mq_to_cpu = mq_open(MQ_NAME, O_RDWR | O_CREAT | O_NONBLOCK, S_IWUSR|S_IRUSR, &attrs);
+ printf("error after mq_open (%ld) = %d %s\n", attrs.mq_msgsize, errno, strerror(errno));
+ ASSERT("Open message queue for emulator", mq_to_cpu > 0)
+
+ mq_send(mq_to_cpu, "init", 5, 2);
}
else
{
@@ -111,12 +131,7 @@
if (scrflag)
{
-#ifndef NO_PTHREAD
CATCH(&cleanup_screen_thread, start_screen_thread(cpu.mem + CPU_FB_ADDR));
-#else
- sdl_screen_t scr = new_sdl_screen(8);
- g_scr = &scr;
-#endif
}
if (guiflag && scrflag)
@@ -126,11 +141,12 @@
if (guiflag)
{
- gui(&cpu);
+ start_gui(mq_to_cpu, &cpu);
+ run_mq(&cpu, mq_to_cpu);
}
else if (disflag)
{
- disas_num(&cpu, 12);
+ disas_num(&cpu, 64);
}
else if (runflag)
{
@@ -143,14 +159,13 @@
}
else if (debugflag)
{
- debug(&cpu);
+ CATCH(&cleanup_debug_prompt_thread, start_debug_prompt(mq_to_cpu, &cpu));
+ run_mq(&cpu, mq_to_cpu);
}
-
-#ifdef NO_PTHREAD
- if (scrflag)
- free_sdl_screen(g_scr);
-#endif
if (should_read)
+ {
free_cpu(&cpu);
+ mq_close(mq_to_cpu);
+ }
}