* Copyright 2008, Michael Lotz, mmlr@mlotz.ch
* Distributed under the terms of the MIT License.
*/
#include <debug.h>
#include <signal.h>
#include <kscheduler.h>
#include <smp.h>
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);
message[1] = 'KDLE';
message[2] = 0;
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;
resume_thread(thread);
return B_OK;
} else if (op == B_MODULE_UNINIT) {
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,
NULL,
NULL
};
module_info *modules[] = {
(module_info *)&sModuleInfo,
NULL
};