Whamcloud - gitweb
b5dd49cb42df6aa9e1c6041a0591ad9cea7fd40d
[fs/lustre-release.git] / libcfs / libcfs / darwin / darwin-debug.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2012, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 # define DEBUG_SUBSYSTEM S_LNET
38
39 #include <libcfs/libcfs.h>
40 #include "tracefile.h"
41
42 void libcfs_debug_dumpstack(cfs_task_t *tsk)
43 {
44         return;
45 }
46
47 void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *msgdata)
48 {
49 }
50
51 void lbug_with_loc(struct libcfs_debug_msg_data *msgdata)
52 {
53         libcfs_catastrophe = 1;
54         CEMERG("LBUG: pid: %u thread: %#x\n",
55                (unsigned)cfs_curproc_pid(), (unsigned)current_thread());
56         libcfs_debug_dumplog();
57         libcfs_run_lbug_upcall(msgdata);
58         while (1)
59                 cfs_schedule();
60
61         /* panic("lbug_with_loc(%s, %s, %d)", file, func, line) */
62 }
63
64 #if ENTRY_NESTING_SUPPORT
65
66 static inline struct cfs_debug_data *__current_cdd(void)
67 {
68         struct cfs_debug_data *cdd;
69
70         cdd = (struct cfs_debug_data *)current_uthread()->uu_nlminfo;
71         if (cdd != NULL &&
72             cdd->magic1 == CDD_MAGIC1 && cdd->magic2 == CDD_MAGIC2 &&
73             cdd->nesting_level < 1000)
74                 return cdd;
75         else
76                 return NULL;
77 }
78
79 static inline void __current_cdd_set(struct cfs_debug_data *cdd)
80 {
81         current_uthread()->uu_nlminfo = (void *)cdd;
82 }
83
84 void __entry_nesting(struct cfs_debug_data *child)
85 {
86         struct cfs_debug_data *parent;
87
88         parent = __current_cdd();
89         if (parent != NULL) {
90                 child->parent        = parent;
91                 child->nesting_level = parent->nesting_level + 1;
92         }
93         __current_cdd_set(child);
94 }
95
96 void __exit_nesting(struct cfs_debug_data *child)
97 {
98         __current_cdd_set(child->parent);
99 }
100
101 unsigned int __current_nesting_level(void)
102 {
103         struct cfs_debug_data *cdd;
104
105         cdd = __current_cdd();
106         if (cdd != NULL)
107                 return cdd->nesting_level;
108         else
109                 return 0;
110 }
111 /* ENTRY_NESTING_SUPPORT */
112 #endif