[mlx4] Add support for multiple use/loose operations.
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 16 Feb 2009 13:20:01 +0000 (13:20 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 16 Feb 2009 13:20:01 +0000 (13:20 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1970 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

hw/mlx4/kernel/inc/shutter.h

index a483f28..fcecb3d 100644 (file)
@@ -48,14 +48,29 @@ static inline void shutter_init(shutter_t* p_shutter)
        KeInitializeEvent( &p_shutter->event, SynchronizationEvent, FALSE );\r
 }\r
 \r
-// if RC > 0, one can proceed\r
-static inline int shutter_use(shutter_t * p_shutter)\r
+\r
+static inline void shutter_sub(shutter_t * p_shutter,long Val)\r
 {\r
-       long res = InterlockedIncrement( &p_shutter->cnt ); \r
+    long res = 0;\r
+    ASSERT(Val < 0);\r
+       res = InterlockedExchangeAdd( &p_shutter->cnt,Val );\r
+       if ((res+Val) == -MAX_OPERATIONS)\r
+               KeSetEvent( &p_shutter->event, 0, FALSE );\r
+}\r
+\r
+// if RC == true, one can proceed\r
+static inline BOOLEAN shutter_add(shutter_t * p_shutter,long Val)\r
+{\r
+    long res = 0;\r
+    ASSERT(Val > 0);\r
+       res = InterlockedExchangeAdd(&p_shutter->cnt,Val); \r
        ASSERT(res <= MAX_OPERATIONS);\r
-       if (res <= 0 ) \r
-               InterlockedDecrement( &p_shutter->cnt ); // The object is in shutdown\r
-       return res;\r
+       if (res < 0 )\r
+       {        \r
+               shutter_sub(p_shutter, -Val);\r
+               return FALSE;\r
+       }\r
+       return TRUE;\r
 }\r
 \r
 static inline void shutter_loose(shutter_t * p_shutter)\r
@@ -65,9 +80,25 @@ static inline void shutter_loose(shutter_t * p_shutter)
                KeSetEvent( &p_shutter->event, 0, FALSE );\r
 }\r
 \r
+// if RC > 0, one can proceed\r
+static inline int shutter_use(shutter_t * p_shutter)\r
+{\r
+       long res = InterlockedIncrement( &p_shutter->cnt ); \r
+       ASSERT(res <= MAX_OPERATIONS);\r
+       if (res <= 0 ) \r
+               shutter_loose( p_shutter ); // The object is in shutdown\r
+       return res;\r
+}\r
+\r
+\r
 static inline void shutter_shut(shutter_t * p_shutter)\r
 {\r
-       long res;\r
+    long res = 0;\r
+    //\r
+    //  ASSERT not calling shu twice.\r
+    //\r
+    ASSERT(p_shutter->cnt - MAX_OPERATIONS >=  (-MAX_OPERATIONS));\r
+    \r
        // Mark the counter as locked\r
        res = InterlockedExchangeAdd(&p_shutter->cnt, -MAX_OPERATIONS);\r
        ASSERT(res >= 0);\r
@@ -76,3 +107,13 @@ static inline void shutter_shut(shutter_t * p_shutter)
                KeWaitForSingleObject( &p_shutter->event, Executive, KernelMode, FALSE, NULL );\r
 }\r
 \r
+static inline void shutter_alive(shutter_t * p_shutter)\r
+{\r
+    long res = 0;\r
+    ASSERT(p_shutter->cnt == -MAX_OPERATIONS);\r
+       // Mark the counter as locked\r
+       res = InterlockedExchangeAdd(&p_shutter->cnt, MAX_OPERATIONS);\r
+       ASSERT(res < 0);\r
+}\r
+\r
+\r