Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tools/test/callout_free/callout_free.c
39536 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2019 Eric van Gyzen
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*/
27
28
/*
29
* Free a pending callout. This was useful for testing the
30
* "show callout_last" ddb command.
31
*/
32
33
#include <sys/param.h>
34
#include <sys/conf.h>
35
#include <sys/kernel.h>
36
#include <sys/lock.h>
37
#include <sys/module.h>
38
#include <sys/mutex.h>
39
#include <sys/systm.h>
40
41
static struct callout callout_free;
42
static struct mtx callout_free_mutex;
43
static int callout_free_arg;
44
45
static void
46
callout_free_func(void *arg)
47
{
48
printf("squirrel!\n");
49
mtx_destroy(&callout_free_mutex);
50
memset(&callout_free, 'C', sizeof(callout_free));
51
}
52
53
static int
54
callout_free_load(module_t mod, int cmd, void *arg)
55
{
56
int error;
57
58
switch (cmd) {
59
case MOD_LOAD:
60
mtx_init(&callout_free_mutex, "callout_free", NULL, MTX_DEF);
61
/*
62
* Do not pass CALLOUT_RETURNUNLOCKED so the callout
63
* subsystem will unlock the "destroyed" mutex.
64
*/
65
callout_init_mtx(&callout_free, &callout_free_mutex, 0);
66
printf("callout_free_func = %p\n", callout_free_func);
67
printf("callout_free_arg = %p\n", &callout_free_arg);
68
callout_reset(&callout_free, hz/10, callout_free_func,
69
&callout_free_arg);
70
error = 0;
71
break;
72
73
case MOD_UNLOAD:
74
error = 0;
75
break;
76
77
default:
78
error = EOPNOTSUPP;
79
break;
80
}
81
82
return (error);
83
}
84
85
DEV_MODULE(callout_free, callout_free_load, NULL);
86
87