Changeset d318a18 for src/Common


Ignore:
Timestamp:
Jul 18, 2018, 5:18:29 PM (7 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env
Children:
eff03a94
Parents:
5c14030
Message:

Fix assorted memory bugs with persistent-array environment

Location:
src/Common
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Common/GC.cc

    r5c14030 rd318a18  
    4141
    4242const GC& GC::operator<< (const GC_Object* obj) const {
    43         if( obj )
    44         {
     43        if( obj ) {
    4544                if( obj->mark != this->mark ) {
    4645                        obj->mark = this->mark;
     
    4948        }
    5049        return *this;
     50}
     51
     52bool GC::notrace_mark(const GC_Object* obj) const {
     53        if ( obj && obj->mark != this->mark ) {
     54                obj->mark = this->mark;
     55                return true;
     56        }
     57        return false;
    5158}
    5259
  • src/Common/GC.h

    r5c14030 rd318a18  
    3838        /// Traces a traceable object
    3939        const GC& operator<< (const GC_Object*) const;
     40
     41        /// No-trace mark; returns true if the object exists and was not already marked
     42        bool notrace_mark(const GC_Object*) const;
    4043
    4144        /// Adds a new object to garbage collection
  • src/Common/PersistentDisjointSet.h

    r5c14030 rd318a18  
    281281        const Base& rerooted() const {
    282282                reroot();
     283                assertf(mode == BASE, "reroot results in base");
    283284                return as<Base>();
    284285        }
     
    332333        }
    333334
    334         /// Adds fresh class including only one item; returns updated map
     335        /// Adds fresh class including only one item; returns updated map (or self if no change)
    335336        template<typename E>
    336337        Self* add(E&& i) {
    337338                reroot();
    338                
    339                 // transfer map to new node
    340                 Self* ret = new Self{ BASE, take_as<Base>() };
     339
     340                // add new element to node
     341                Base base_map = take_as<Base>();
     342                bool added = base_map.emplace( i, Node{ i } ).second;
     343
     344                // fail early on node already present
     345                if ( ! added ) {
     346                        as<Base>() = std::move(base_map);
     347                        return this;
     348                }
     349
     350                // make new return node and reset self as REM node
     351                Self* ret = new Self{ BASE, std::move(base_map) };
    341352                reset_as_base();
    342 
    343                 // set self to REM node
    344353                init<Add>( ret, i );
    345354                mode = REM;
    346                
    347                 // add element in returned map
    348                 Base& base_map = ret->as<Base>();
    349                 bool added = base_map.emplace( i, Node{ std::forward<E>(i) } ).second;
    350                 assertf(added, "added element already present in map");
    351355
    352356                return ret;
     
    460464                const Base& self = rerooted();
    461465
    462                 Elm crnt = i;
    463                 do {
     466                // exit early if class not present
     467                auto it = self.find( i );
     468                if ( it == self.end() ) return;
     469
     470                // apply f to each member of class
     471                f( i );
     472                for ( Elm crnt = it->second.next; crnt != i; crnt = it->second.next ) {
    464473                        f( crnt );
    465                         auto it = self.find( crnt );
     474                        it = self.find( crnt );
    466475                        assertf( it != self.end(), "current node must exist in base" );
    467                         crnt = it->second.next;
    468                 } while ( crnt != i );
     476                }
    469477        }
    470478
  • src/Common/PersistentMap.h

    r5c14030 rd318a18  
    141141                                        gc.maybe_trace( entry.first, entry.second );
    142142                                }
    143                                 return;
    144                         }
     143                        } break;
    145144                        case REM: {
    146145                                const Rem& self = as<Rem>();
    147146                                gc << self.base;
    148147                                gc.maybe_trace( self.key );
    149                                 return;
    150                         }
     148                        } break;
    151149                        case INS: case UPD: {
    152150                                const Ins& self = as<Ins>();
    153151                                gc << self.base;
    154152                                gc.maybe_trace( self.key, self.val );
    155                                 return;
    156                         }
     153                        } break;
    157154                        default: assertf(false, "invalid mode");
    158155                }
     
    198195
    199196                                base_map.erase( it );
    200                                 break;
    201                         }
     197                        } break;
    202198                        case INS: {
    203199                                Ins& self = mut_this->as<Ins>();
     
    207203
    208204                                base_map.emplace( std::move(self.key), std::move(self.val) );
    209                                 break;
    210                         }
     205                        } break;
    211206                        case UPD: {
    212207                                Ins& self = mut_this->as<Ins>();
     
    218213
    219214                                it->second = std::move(self.val);
    220                                 break;
    221                         }
     215                        } break;
    222216                        default: assertf(false, "invalid mode");
    223217                }
Note: See TracChangeset for help on using the changeset viewer.