[eth] Add temporarily code for tracking shutter behavior.
[mirror/winof/.git] / hw / mlx4 / kernel / inc / shutter.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id: shutter.h 1611 2006-08-20 14:48:55Z sleybo $\r
30  */\r
31 \r
32 \r
33 #pragma once\r
34 \r
35 \r
36 // Define the max numbers of operations that can be simultaniously done\r
37 #define MAX_OPERATIONS  0x10000000\r
38 \r
39 typedef struct _shutter_t {\r
40         long cnt;\r
41         KEVENT event;\r
42 \r
43 }       shutter_t;\r
44 \r
45 static inline void shutter_init(shutter_t* p_shutter)\r
46 {\r
47         p_shutter->cnt = 0;\r
48         KeInitializeEvent( &p_shutter->event, SynchronizationEvent, FALSE );\r
49 }\r
50 \r
51 \r
52 static inline void shutter_sub(shutter_t * p_shutter,long Val)\r
53 {\r
54     long res = 0;\r
55     ASSERT(Val < 0);\r
56         res = InterlockedExchangeAdd( &p_shutter->cnt,Val );\r
57         if ((res+Val) == -MAX_OPERATIONS)\r
58                 KeSetEvent( &p_shutter->event, 0, FALSE );\r
59 }\r
60 \r
61 // if RC == true, one can proceed\r
62 static inline BOOLEAN shutter_add(shutter_t * p_shutter,long Val)\r
63 {\r
64     long res = 0;\r
65     ASSERT(Val > 0);\r
66         res = InterlockedExchangeAdd(&p_shutter->cnt,Val); \r
67         ASSERT(res <= MAX_OPERATIONS);\r
68         if (res < 0 )\r
69         {        \r
70                 shutter_sub(p_shutter, -Val);\r
71                 return FALSE;\r
72         }\r
73         return TRUE;\r
74 }\r
75 \r
76 static inline void shutter_loose(shutter_t * p_shutter)\r
77 {\r
78         long res = InterlockedDecrement( &p_shutter->cnt );\r
79         if (res == -MAX_OPERATIONS)\r
80                 KeSetEvent( &p_shutter->event, 0, FALSE );\r
81 }\r
82 \r
83 // if RC > 0, one can proceed\r
84 static inline int shutter_use(shutter_t * p_shutter)\r
85 {\r
86         long res = InterlockedIncrement( &p_shutter->cnt ); \r
87         ASSERT(res <= MAX_OPERATIONS);\r
88         if (res <= 0 ) \r
89                 shutter_loose( p_shutter ); // The object is in shutdown\r
90         return res;\r
91 }\r
92 \r
93 \r
94 static inline void shutter_shut(shutter_t * p_shutter)\r
95 {\r
96     long res = 0;\r
97     //\r
98     //  ASSERT not calling shu twice.\r
99     //\r
100     ASSERT(p_shutter->cnt - MAX_OPERATIONS >=  (-MAX_OPERATIONS));\r
101     \r
102         // Mark the counter as locked\r
103         res = InterlockedExchangeAdd(&p_shutter->cnt, -MAX_OPERATIONS);\r
104         ASSERT(res >= 0);\r
105         if (res) \r
106                 // We are now waiting for the object to reach -MAX_OPERATIONS\r
107                 KeWaitForSingleObject( &p_shutter->event, Executive, KernelMode, FALSE, NULL );\r
108 \r
109     ASSERT(p_shutter->cnt == -MAX_OPERATIONS);\r
110 }\r
111 \r
112 static inline void shutter_alive(shutter_t * p_shutter)\r
113 {\r
114     long res = 0;\r
115     long old_cnt = 0;\r
116     old_cnt = p_shutter->cnt;\r
117     ASSERT(p_shutter->cnt == -MAX_OPERATIONS);\r
118         // Mark the counter as locked\r
119         res = InterlockedExchangeAdd(&p_shutter->cnt, MAX_OPERATIONS);\r
120         ASSERT(res < 0);\r
121 }\r
122 \r
123 \r