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