1/* 2 * Copyright 2008, Michael Lotz, mmlr@mlotz.ch 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <debug.h> 8 9#include <signal.h> 10 11#include <kscheduler.h> 12#include <smp.h> 13 14 15static sem_id sRequestSem = -1; 16 17 18static int32 19invalidate_loop(void *data) 20{ 21 while (true) { 22 if (acquire_sem(sRequestSem) != B_OK) 23 break; 24 25 uint32 message[3]; 26 message[0] = sizeof(message); // size 27 message[1] = 'KDLE'; // message code 28 message[2] = 0; // flags 29 30 // where "d:0:baron' stands for desktop x of user y which both 31 // currently are hardcoded and where '_PTL' is the port link code 32 write_port(find_port("d:0:baron"), '_PTL', &message, sizeof(message)); 33 } 34 35 return 0; 36} 37 38 39static void 40exit_debugger() 41{ 42 release_sem_etc(sRequestSem, 1, B_DO_NOT_RESCHEDULE); 43} 44 45 46static status_t 47std_ops(int32 op, ...) 48{ 49 if (op == B_MODULE_INIT) { 50 sRequestSem = create_sem(0, "invalidate_loop_request"); 51 if (sRequestSem < B_OK) 52 return sRequestSem; 53 54 thread_id thread = spawn_kernel_thread(&invalidate_loop, 55 "invalidate_loop", B_NORMAL_PRIORITY, NULL); 56 if (thread < B_OK) 57 return thread; 58 59 resume_thread(thread); 60 return B_OK; 61 } else if (op == B_MODULE_UNINIT) { 62 // deleting the sem will also cause the thread to exit 63 delete_sem(sRequestSem); 64 sRequestSem = -1; 65 return B_OK; 66 } 67 68 return B_BAD_VALUE; 69} 70 71 72static struct debugger_module_info sModuleInfo = { 73 { 74 "debugger/invalidate_on_exit/v1", 75 B_KEEP_LOADED, 76 &std_ops 77 }, 78 79 NULL, 80 exit_debugger, 81 NULL, 82 NULL 83}; 84 85module_info *modules[] = { 86 (module_info *)&sModuleInfo, 87 NULL 88}; 89