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 15 static sem_id sRequestSem = -1; 16 17 18 static int32 19 invalidate_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 39 static void 40 exit_debugger() 41 { 42 release_sem_etc(sRequestSem, 1, B_DO_NOT_RESCHEDULE); 43 } 44 45 46 static status_t 47 std_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 72 static 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 85 module_info *modules[] = { 86 (module_info *)&sModuleInfo, 87 NULL 88 }; 89