| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace factor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | object_start_map::object_start_map(cell size_, cell start_) : | 
					
						
							|  |  |  | 	size(size_), start(start_) | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 	object_start_offsets = new card[addr_to_card(size_)]; | 
					
						
							|  |  |  | 	object_start_offsets_end = object_start_offsets + addr_to_card(size_); | 
					
						
							| 
									
										
										
										
											2009-10-25 00:51:14 -04:00
										 |  |  | 	clear_object_start_offsets(); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | object_start_map::~object_start_map() | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-09 04:20:50 -04:00
										 |  |  | 	delete[] object_start_offsets; | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | cell object_start_map::first_object_in_card(cell card_index) | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 	return object_start_offsets[card_index]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | cell object_start_map::find_object_containing_card(cell card_index) | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 	if(card_index == 0) | 
					
						
							|  |  |  | 		return start; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		card_index--; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		while(first_object_in_card(card_index) == card_starts_inside_object) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | #ifdef FACTOR_DEBUG
 | 
					
						
							|  |  |  | 			/* First card should start with an object */ | 
					
						
							|  |  |  | 			assert(card_index > 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 			card_index--; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return start + (card_index << card_bits) + first_object_in_card(card_index); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | /* we need to remember the first object allocated in the card */ | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | void object_start_map::record_object_start_offset(object *obj) | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 	cell idx = addr_to_card((cell)obj - start); | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | 	card obj_start = ((cell)obj & addr_card_mask); | 
					
						
							|  |  |  | 	object_start_offsets[idx] = std::min(object_start_offsets[idx],obj_start); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 14:47:04 -04:00
										 |  |  | void object_start_map::clear_object_start_offsets() | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 	memset(object_start_offsets,card_starts_inside_object,addr_to_card(size)); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | void object_start_map::update_card_for_sweep(cell index, u16 mask) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	cell offset = object_start_offsets[index]; | 
					
						
							|  |  |  | 	if(offset != card_starts_inside_object) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-12-02 01:48:41 -05:00
										 |  |  | 		mask >>= (offset / data_alignment); | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(mask == 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			/* The rest of the block after the old object start is free */ | 
					
						
							|  |  |  | 			object_start_offsets[index] = card_starts_inside_object; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			/* Move the object start forward if necessary */ | 
					
						
							| 
									
										
										
										
											2010-01-16 09:43:22 -05:00
										 |  |  | 			object_start_offsets[index] = (card)(offset + (rightmost_set_bit(mask) * data_alignment)); | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void object_start_map::update_for_sweep(mark_bits<object> *state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	for(cell index = 0; index < state->bits_size; index++) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-11-05 20:29:27 -05:00
										 |  |  | 		cell mask = state->marked[index]; | 
					
						
							|  |  |  | #ifdef FACTOR_64
 | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | 		update_card_for_sweep(index * 4,      mask        & 0xffff); | 
					
						
							|  |  |  | 		update_card_for_sweep(index * 4 + 1, (mask >> 16) & 0xffff); | 
					
						
							|  |  |  | 		update_card_for_sweep(index * 4 + 2, (mask >> 32) & 0xffff); | 
					
						
							|  |  |  | 		update_card_for_sweep(index * 4 + 3, (mask >> 48) & 0xffff); | 
					
						
							| 
									
										
										
										
											2009-11-05 20:29:27 -05:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 		update_card_for_sweep(index * 2,      mask        & 0xffff); | 
					
						
							|  |  |  | 		update_card_for_sweep(index * 2 + 1, (mask >> 16) & 0xffff); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } |