[IBAL] This patch fixes IBAL object destruction. It does the following:
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 2 Jul 2008 18:03:49 +0000 (18:03 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 2 Jul 2008 18:03:49 +0000 (18:03 +0000)
1. Removes forcing synchronous destruction for user-mode exported objects.  This isn't needed, and slows down cleanup of the object hierarchy.

2. Clears the user-mode exported handle from the handle table before invoking the 'destroying' callback of an object, so that all further reference on the object will fail.  Currently, an IOCTL could take a reference on an object after the 'destroying' callback has returned.

Signed-off-by: Fab Tillier <ftillier@microsoft.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1329 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/al_common.c

index 29e1ee1..e656b1a 100644 (file)
@@ -187,7 +187,7 @@ init_al_obj(
 \r
        p_obj->context = context;\r
 \r
-       if( async_destroy && !(p_obj->type & AL_OBJ_SUBTYPE_UM_EXPORT) )\r
+       if( async_destroy )\r
                p_obj->pfn_destroy = async_destroy_obj;\r
        else\r
                p_obj->pfn_destroy = sync_destroy_obj;\r
@@ -586,12 +586,11 @@ destroy_obj(
        cl_spinlock_release( &p_obj->lock );\r
        deref_al_obj( p_obj );\r
 \r
-       /* Notify the object that it is being destroyed. */\r
-       if( p_obj->pfn_destroying )\r
-               p_obj->pfn_destroying( p_obj );\r
-\r
 #ifdef CL_KERNEL\r
-       /* Release this object's handle. */\r
+       /*\r
+        * Release this object's handle.  We must do this before calling the\r
+        * destroy callback so that any IOCTLs referencing this object will fail\r
+        */\r
        if( p_obj->hdl != AL_INVALID_HANDLE )\r
        {\r
                CL_ASSERT( p_obj->h_al );\r
@@ -599,6 +598,10 @@ destroy_obj(
        }\r
 #endif\r
 \r
+       /* Notify the object that it is being destroyed. */\r
+       if( p_obj->pfn_destroying )\r
+               p_obj->pfn_destroying( p_obj );\r
+\r
        if( p_obj->p_parent_obj )\r
                detach_al_obj( p_obj );\r
 \r