LCOV - code coverage report
Current view: top level - src/parallel - SharedSetData.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 16 85 18.8 %
Date: 2020-12-16 07:07:30 Functions: 4 13 30.8 %
Branches: 11 148 7.4 %

           Branch data     Line data    Source code
       1                 :            : /** \file   SharedSetData.cpp
       2                 :            :  *  \author Jason Kraftcheck
       3                 :            :  *  \date   2011-06-23
       4                 :            :  */
       5                 :            : 
       6                 :            : #include "moab/Interface.hpp"
       7                 :            : #include "SharedSetData.hpp"
       8                 :            : #include <assert.h>
       9                 :            : #include <stdio.h>
      10                 :            : #include <stdlib.h>
      11                 :            : 
      12                 :            : namespace moab
      13                 :            : {
      14                 :            : 
      15 [ +  - ][ +  - ]:         90 : SharedSetData::SharedSetData( Interface& moab, int pcID, unsigned rank ) : mb( moab ), sharedSetTag( 0 )
      16                 :            : {
      17                 :            :     SharedSetTagData zero;
      18                 :            : 
      19                 :            :     // Zero out any padding bytes in SharedSetTagData (used for memory alignment)
      20                 :            :     // Otherwise, memcmp could lead to unexpected false negatives for comparison
      21                 :         45 :     memset( &zero, 0, sizeof( SharedSetTagData ) );
      22                 :            : 
      23                 :         45 :     zero.ownerRank    = rank;
      24                 :         45 :     zero.ownerHandle  = 0;
      25                 :         45 :     zero.sharingProcs = NULL;
      26                 :            :     // band-aid: make sure the tag is unique, to not interfere with different pcID
      27                 :            :     // maybe a better solution is needed
      28                 :            :     // pcID can be at most 64, it ranges from 0 to 63; problems appear at migrate mesh
      29         [ +  - ]:         45 :     std::ostringstream sharedTagUniqueName;
      30 [ +  - ][ +  - ]:         45 :     sharedTagUniqueName << "__sharedSetTag" << pcID;
      31                 :            :     ErrorCode rval = mb.tag_get_handle( sharedTagUniqueName.str().c_str(), sizeof( SharedSetTagData ), MB_TYPE_OPAQUE,
      32 [ +  - ][ +  - ]:         45 :                                         sharedSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &zero );
      33         [ -  + ]:         45 :     assert( MB_SUCCESS == rval );
      34         [ -  + ]:         45 :     if( MB_SUCCESS != rval )
      35                 :            :     {
      36         [ #  # ]:          0 :         fprintf( stderr, "Aborted from the constructor of SharedSetData.\n" );
      37                 :          0 :         abort();
      38                 :         45 :     }
      39                 :         45 : }
      40                 :            : 
      41                 :         84 : SharedSetData::~SharedSetData()
      42                 :            : {
      43                 :         42 :     mb.tag_delete( sharedSetTag );
      44                 :         42 : }
      45                 :            : 
      46                 :          0 : ErrorCode SharedSetData::get_owning_procs( std::vector< unsigned >& ranks_out ) const
      47                 :            : {
      48                 :          0 :     ranks_out.clear();
      49                 :          0 :     ranks_out.reserve( handleMap.size() );
      50 [ #  # ][ #  # ]:          0 :     for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
                 [ #  # ]
      51 [ #  # ][ #  # ]:          0 :         ranks_out.push_back( i->first );
      52                 :          0 :     return MB_SUCCESS;
      53                 :            : }
      54                 :            : 
      55                 :          0 : ErrorCode SharedSetData::get_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks_out ) const
      56                 :            : {
      57                 :            :     ErrorCode rval;
      58                 :            :     SharedSetTagData data;
      59         [ #  # ]:          0 :     rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
      60         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
      61                 :            : 
      62                 :          0 :     ranks_out.clear();
      63 [ #  # ][ #  # ]:          0 :     if( data.sharingProcs ) ranks_out = *data.sharingProcs;
      64                 :          0 :     return MB_SUCCESS;
      65                 :            : }
      66                 :            : 
      67                 :          0 : ErrorCode SharedSetData::get_shared_sets( Range& sets_out ) const
      68                 :            : {
      69                 :            :     //  sets_out.clear();
      70                 :            :     //  return mb.get_entities_by_type_and_tag( 0, MBENTITYSET, &sharedSetTag, 1, 0, sets_out );
      71                 :            : 
      72                 :          0 :     sets_out.clear();
      73 [ #  # ][ #  # ]:          0 :     for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
                 [ #  # ]
      74 [ #  # ][ #  # ]:          0 :         append_local_handles( i->second, sets_out );
      75                 :          0 :     return MB_SUCCESS;
      76                 :            : }
      77                 :            : 
      78                 :          0 : ErrorCode SharedSetData::get_shared_sets( unsigned rank, Range& sets_out ) const
      79                 :            : {
      80         [ #  # ]:          0 :     sets_out.clear();
      81                 :            :     //  if (rank == myRank) {
      82                 :            :     //    return mb.get_entities_by_type_and_tag( 0, MBENTITYSET,
      83                 :            :     //  }
      84                 :            :     //  else {
      85         [ #  # ]:          0 :     RHMap::const_iterator i = handleMap.find( rank );
      86 [ #  # ][ #  # ]:          0 :     if( i != handleMap.end() ) append_local_handles( i->second, sets_out );
         [ #  # ][ #  # ]
      87                 :          0 :     return MB_SUCCESS;
      88                 :            :     //  }
      89                 :            : }
      90                 :            : 
      91                 :          0 : ErrorCode SharedSetData::get_owner( EntityHandle entity_set, unsigned& rank_out, EntityHandle& remote_handle_out ) const
      92                 :            : {
      93                 :            :     ErrorCode rval;
      94                 :            :     SharedSetTagData data;
      95         [ #  # ]:          0 :     rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
      96         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
      97                 :            : 
      98         [ #  # ]:          0 :     if( !data.ownerHandle )
      99                 :            :     {                                  // not shared
     100         [ #  # ]:          0 :         assert( !data.sharingProcs );  // really not shared
     101                 :          0 :         data.ownerHandle = entity_set;
     102                 :            :     }
     103                 :            : 
     104                 :          0 :     rank_out          = data.ownerRank;
     105                 :          0 :     remote_handle_out = data.ownerHandle;
     106                 :          0 :     return MB_SUCCESS;
     107                 :            : }
     108                 :            : 
     109                 :          0 : ErrorCode SharedSetData::get_local_handle( unsigned owner_rank, EntityHandle remote_handle,
     110                 :            :                                            EntityHandle& local_handle ) const
     111                 :            : {
     112         [ #  # ]:          0 :     RHMap::const_iterator i = handleMap.find( owner_rank );
     113 [ #  # ][ #  # ]:          0 :     assert( i != handleMap.end() );
     114 [ #  # ][ #  # ]:          0 :     if( i == handleMap.end() )
     115                 :            :     {
     116                 :          0 :         local_handle = ~(EntityHandle)0;
     117                 :          0 :         return MB_FAILURE;
     118                 :            :     }
     119                 :            : 
     120 [ #  # ][ #  # ]:          0 :     if( !i->second.find( remote_handle, local_handle ) )
                 [ #  # ]
     121                 :            :     {
     122                 :          0 :         assert( false );
     123                 :            :         local_handle = ~(EntityHandle)0;
     124                 :            :         return MB_FAILURE;
     125                 :            :     }
     126                 :            : 
     127                 :          0 :     return MB_SUCCESS;
     128                 :            : }
     129                 :            : 
     130                 :          0 : ErrorCode SharedSetData::set_owner( EntityHandle set, unsigned owner_rank, EntityHandle owner_handle )
     131                 :            : {
     132                 :            :     ErrorCode rval;
     133                 :            :     SharedSetTagData data;
     134         [ #  # ]:          0 :     rval = mb.tag_get_data( sharedSetTag, &set, 1, &data );
     135         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
     136                 :            : 
     137         [ #  # ]:          0 :     if( data.ownerHandle )
     138                 :            :     {
     139         [ #  # ]:          0 :         RHMap::iterator i = handleMap.find( data.ownerRank );
     140 [ #  # ][ #  # ]:          0 :         if( i != handleMap.end() ) { i->second.erase( data.ownerHandle, 1 ); }
         [ #  # ][ #  # ]
     141                 :            :     }
     142                 :            : 
     143                 :          0 :     data.ownerRank   = owner_rank;
     144                 :          0 :     data.ownerHandle = owner_handle;
     145         [ #  # ]:          0 :     rval             = mb.tag_set_data( sharedSetTag, &set, 1, &data );
     146         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
     147                 :            : 
     148 [ #  # ][ #  # ]:          0 :     if( !handleMap[owner_rank].insert( owner_handle, set, 1 ).second )
                 [ #  # ]
     149                 :            :     {
     150                 :          0 :         assert( false );
     151                 :            :         return MB_FAILURE;
     152                 :            :     }
     153                 :            : 
     154                 :          0 :     return MB_SUCCESS;
     155                 :            : }
     156                 :            : 
     157                 :          0 : ErrorCode SharedSetData::set_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks )
     158                 :            : {
     159         [ #  # ]:          0 :     std::sort( ranks.begin(), ranks.end() );
     160         [ #  # ]:          0 :     RProcMap::iterator it = procListMap.insert( ranks ).first;
     161                 :            : 
     162                 :            :     ErrorCode rval;
     163                 :            :     SharedSetTagData data;
     164         [ #  # ]:          0 :     rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
     165         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
     166                 :            : 
     167         [ #  # ]:          0 :     data.sharingProcs = &*it;
     168         [ #  # ]:          0 :     rval              = mb.tag_set_data( sharedSetTag, &entity_set, 1, &data );
     169         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
     170                 :            : 
     171                 :          0 :     return MB_SUCCESS;
     172                 :            : }
     173                 :            : 
     174                 :          0 : void SharedSetData::append_local_handles( const ProcHandleMapType& map, Range& range )
     175                 :            : {
     176         [ #  # ]:          0 :     Range::iterator hint = range.begin();
     177 [ #  # ][ #  # ]:          0 :     for( ProcHandleMapType::const_iterator i = map.begin(); i != map.end(); ++i )
         [ #  # ][ #  # ]
                 [ #  # ]
     178 [ #  # ][ #  # ]:          0 :         hint = range.insert( hint, i->value, i->value + i->count - 1 );
         [ #  # ][ #  # ]
     179                 :          0 : }
     180                 :            : 
     181 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11