Changeset 5624

Show
Ignore:
Timestamp:
10/29/09 16:56:59 (4 weeks ago)
Author:
goodell
Message:

Fix MPI_File errhandler leak.

Prior to this commit we only released references to the previously set file
errhandler in MPI_File_set_errhandler if the newly set errhandler was *not*
builtin. This resulted in an errhandler object leak if a user-defined
errhandler was set and then a predefined errhandler was set afterwards.

Reviewed by robl@.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • mpich2/trunk/src/mpi/errhan/file_set_errhandler.c

    r3021 r5624  
    104104 
    105105    /* ... body of routine ...  */ 
    106     if (HANDLE_GET_KIND(errhandler) != HANDLE_KIND_BUILTIN) { 
    107         MPIR_ROMIO_Get_file_errhand( file, &old_errhandler ); 
    108         if (!old_errhandler) { 
    109             MPID_Errhandler_get_ptr( MPI_ERRORS_RETURN, old_errhandler_ptr ); 
    110         } 
    111         else { 
    112             MPID_Errhandler_get_ptr( old_errhandler, old_errhandler_ptr ); 
    113         } 
    114  
    115         if (old_errhandler_ptr) { 
    116             MPIR_Errhandler_release_ref(old_errhandler_ptr,&in_use); 
    117             if (!in_use) { 
    118                 MPID_Errhandler_free( old_errhandler_ptr ); 
    119             } 
    120         } 
     106    MPIR_ROMIO_Get_file_errhand( file, &old_errhandler ); 
     107    if (!old_errhandler) { 
     108        /* MPI_File objects default to the errhandler set on MPI_FILE_NULL 
     109         * at file open time, or MPI_ERRORS_RETURN if no errhandler is set 
     110         * on MPI_FILE_NULL. (MPI-2.2, sec 13.7) */ 
     111        MPID_Errhandler_get_ptr( MPI_ERRORS_RETURN, old_errhandler_ptr ); 
     112    } 
     113    else { 
     114        MPID_Errhandler_get_ptr( old_errhandler, old_errhandler_ptr ); 
     115    } 
     116 
     117    if (old_errhandler_ptr) { 
     118        MPIR_Errhandler_release_ref(old_errhandler_ptr,&in_use); 
     119        if (!in_use) { 
     120            MPID_Errhandler_free( old_errhandler_ptr ); 
     121        } 
    121122    } 
    122123 
     
    130131#endif 
    131132#endif 
    132      
     133 
    133134    /* ... end of body of routine ... */ 
    134135