From 94fec641a7a8c3cf726d32525bd88808e53adeeb Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Wed, 20 Feb 2008 00:40:07 +0000 Subject: [PATCH] Implemented a small kernel debugger add-on that triggers a redraw of the entire screen when exiting the kernel debugger. It sets up a thread that sends a message to the (currently hardcoded) desktop message looper. The desktop then does mark the whole screen dirty which causes a full redraw. Since interrupts need to be enabled I went with an asynchronous thread and releasing a request sem in the add-ons' exit hook. Added the add-on to the image as it shouldn't hurt to have it for now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24025 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/HaikuImage | 3 +- .../debugger/invalidate_on_exit/Jamfile | 7 ++ .../invalidate_on_exit/invalidate_on_exit.cpp | 80 +++++++++++++++++++ src/servers/app/Desktop.cpp | 11 +++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile create mode 100644 src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 191fb99ffb..e9a9e90a58 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -145,7 +145,8 @@ AddFilesToHaikuImage beos system add-ons kernel busses scsi AddFilesToHaikuImage beos system add-ons kernel busses usb : uhci ehci ; AddFilesToHaikuImage beos system add-ons kernel console : vga_text ; -AddFilesToHaikuImage beos system add-ons kernel debugger : hangman ; +AddFilesToHaikuImage beos system add-ons kernel debugger + : hangman invalidate_on_exit ; AddFilesToHaikuImage beos system add-ons kernel file_systems : $(BEOS_ADD_ONS_FILE_SYSTEMS) ; AddFilesToHaikuImage beos system add-ons kernel generic diff --git a/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile b/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile new file mode 100644 index 0000000000..f85c86dde6 --- /dev/null +++ b/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile @@ -0,0 +1,7 @@ +SubDir HAIKU_TOP src add-ons kernel debugger invalidate_on_exit ; + +UsePrivateHeaders kernel ; + +KernelAddon invalidate_on_exit : + invalidate_on_exit.cpp + ; diff --git a/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp b/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp new file mode 100644 index 0000000000..53782af9a9 --- /dev/null +++ b/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp @@ -0,0 +1,80 @@ +/* + * Copyright 2008, Michael Lotz, mmlr@mlotz.ch + * Distributed under the terms of the MIT License. + */ +#include +#include + + +static sem_id sRequestSem = -1; + + +static int32 +invalidate_loop(void *data) +{ + while (true) { + if (acquire_sem(sRequestSem) != B_OK) + break; + + uint32 message[3]; + message[0] = sizeof(message); // size + message[1] = 'KDLE'; // message code + message[2] = 0; // flags + + // where "d:0:baron' stands for desktop x of user y which both + // currently are hardcoded and where '_PTL' is the port link code + write_port(find_port("d:0:baron"), '_PTL', &message, sizeof(message)); + } + + return 0; +} + + +static void +exit_debugger() +{ + release_sem_etc(sRequestSem, 1, B_DO_NOT_RESCHEDULE); +} + + +static status_t +std_ops(int32 op, ...) +{ + if (op == B_MODULE_INIT) { + sRequestSem = create_sem(0, "invalidate_loop_request"); + if (sRequestSem < B_OK) + return sRequestSem; + + thread_id thread = spawn_kernel_thread(&invalidate_loop, + "invalidate_loop", B_NORMAL_PRIORITY, NULL); + if (thread < B_OK) + return thread; + + send_signal_etc(thread, SIGCONT, B_DO_NOT_RESCHEDULE); + return B_OK; + } else if (op == B_MODULE_UNINIT) { + // deleting the sem will also cause the thread to exit + delete_sem(sRequestSem); + sRequestSem = -1; + return B_OK; + } + + return B_BAD_VALUE; +} + + +static struct debugger_module_info sModuleInfo = { + { + "debugger/invalidate_on_exit/v1", + B_KEEP_LOADED, + &std_ops + }, + + NULL, + exit_debugger +}; + +module_info *modules[] = { + (module_info *)&sModuleInfo, + NULL +}; diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index d244303721..1c4941e6eb 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -633,6 +633,17 @@ Desktop::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) break; } + // ToDo: Remove this again. It is a message sent by the + // invalidate_on_exit kernel debugger add-on to trigger a redraw + // after exiting a kernel debugger session. + case 'KDLE': + { + BRegion dirty; + dirty.Include(fVirtualScreen.Frame()); + MarkDirty(dirty); + break; + } + default: printf("Desktop %d:%s received unexpected code %ld\n", 0, "baron", code);