1164159Skmacy/*-
2164159Skmacy * Copyright (c) 2006 Kip Macy kmacy@FreeBSD.org
3164270Skmacy * Copyright (c) 2006 Kris Kennaway kris@FreeBSD.org
4164159Skmacy * Copyright (c) 2006 Dag-Erling Smorgrav des@des.no
5164159Skmacy *
6164159Skmacy * Redistribution and use in source and binary forms, with or without
7164159Skmacy * modification, are permitted provided that the following conditions
8164159Skmacy * are met:
9164159Skmacy * 1. Redistributions of source code must retain the above copyright
10164159Skmacy *    notice, this list of conditions and the following disclaimer.
11164159Skmacy * 2. Redistributions in binary form must reproduce the above copyright
12164159Skmacy *    notice, this list of conditions and the following disclaimer in the
13164159Skmacy *    documentation and/or other materials provided with the distribution.
14164159Skmacy *
15164159Skmacy * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
16164159Skmacy * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17164159Skmacy * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18164159Skmacy * ARE DISCLAIMED.  IN NO EVENT SHAL THE AUTHORS BE LIABLE FOR ANY
19164159Skmacy * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20164159Skmacy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21164159Skmacy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22164159Skmacy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23164159Skmacy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24164159Skmacy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25164159Skmacy * SUCH DAMAGE.
26164159Skmacy *
27164159Skmacy * $FreeBSD$
28164159Skmacy */
29164159Skmacy
30164159Skmacy
31164159Skmacy#ifndef _SYS_LOCK_PROFILE_H_
32164159Skmacy#define _SYS_LOCK_PROFILE_H_
33164159Skmacy
34174629Sjeffstruct lock_profile_object;
35174629SjeffLIST_HEAD(lpohead, lock_profile_object);
36174629Sjeff
37174633Sjeff#ifdef _KERNEL
38164159Skmacy#ifdef LOCK_PROFILING
39174645Skmacy#include <machine/cpufunc.h>
40174629Sjeff#include <sys/lock.h>
41164159Skmacy
42164165Skmacy#ifndef USE_CPU_NANOSECONDS
43164165Skmacyu_int64_t nanoseconds(void);
44164159Skmacy#endif
45164165Skmacy
46189845Sjeffextern volatile int lock_prof_enable;
47164159Skmacy
48174629Sjeffvoid lock_profile_obtain_lock_success(struct lock_object *lo, int contested,
49174629Sjeff    uint64_t waittime, const char *file, int line);
50174629Sjeffvoid lock_profile_release_lock(struct lock_object *lo);
51189845Sjeffvoid lock_profile_thread_exit(struct thread *td);
52164159Skmacy
53189845Sjeff
54174629Sjeffstatic inline void
55174629Sjefflock_profile_obtain_lock_failed(struct lock_object *lo, int *contested,
56174629Sjeff    uint64_t *waittime)
57174629Sjeff{
58174629Sjeff	if (!lock_prof_enable || (lo->lo_flags & LO_NOPROFILE) || *contested)
59174629Sjeff		return;
60174629Sjeff	*waittime = nanoseconds();
61174629Sjeff	*contested = 1;
62164159Skmacy}
63164159Skmacy
64174629Sjeff#else /* !LOCK_PROFILING */
65164159Skmacy
66194578Srdivacky#define	lock_profile_release_lock(lo)					(void)0
67194578Srdivacky#define lock_profile_obtain_lock_failed(lo, contested, waittime)	(void)0
68194578Srdivacky#define lock_profile_obtain_lock_success(lo, contested, waittime, file, line)	(void)0
69194578Srdivacky#define	lock_profile_thread_exit(td)					(void)0
70164159Skmacy
71174629Sjeff#endif  /* !LOCK_PROFILING */
72164159Skmacy
73171372Sattilio#endif /* _KERNEL */
74171372Sattilio
75164159Skmacy#endif /* _SYS_LOCK_PROFILE_H_ */
76