sub safe_set { my( $ref, $k, $v ) = @_; die 'Bad first arg' unless ref( $ref ) eq 'HASH'; if( exists $ref->{ $k } and ref( $ref->{ $k } ) eq 'SCALAR' and is_shared( $ref->{ $k } ) ) { lock ${ $ref->{$k} }; ${ $ref->{$k} } = $v; } else { lock $ref; $ref->{ $k } = \my $vs :shared = $v; } }