| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-12 23:20:43 -04:00
										 |  |  | object_start_map::object_start_map(cell size, cell start) | 
					
						
							|  |  |  |     : size(size), start(start) { | 
					
						
							| 
									
										
										
										
											2015-02-23 11:11:09 -05:00
										 |  |  |   cell card_count = size / card_size; | 
					
						
							|  |  |  |   object_start_offsets = new card[card_count]; | 
					
						
							|  |  |  |   object_start_offsets_end = object_start_offsets + card_count; | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   clear_object_start_offsets(); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  | object_start_map::~object_start_map() { delete[] object_start_offsets; } | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  | cell object_start_map::find_object_containing_card(cell card_index) { | 
					
						
							|  |  |  |   if (card_index == 0) | 
					
						
							|  |  |  |     return start; | 
					
						
							| 
									
										
										
										
											2016-10-08 01:11:47 -04:00
										 |  |  |   card_index--; | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 01:11:47 -04:00
										 |  |  |   while (object_start_offsets[card_index] == card_starts_inside_object) { | 
					
						
							|  |  |  |     // First card should start with an object
 | 
					
						
							|  |  |  |     FACTOR_ASSERT(card_index > 0); | 
					
						
							|  |  |  |     card_index--; | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-10-08 01:11:47 -04:00
										 |  |  |   return start + card_index * card_size + object_start_offsets[card_index]; | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // we need to remember the first object allocated in the card
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  | void object_start_map::record_object_start_offset(object* obj) { | 
					
						
							| 
									
										
										
										
											2013-05-13 00:53:47 -04:00
										 |  |  |   cell idx = addr_to_card((cell)obj - start); | 
					
						
							|  |  |  |   card obj_start = ((cell)obj & addr_card_mask); | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   object_start_offsets[idx] = std::min(object_start_offsets[idx], obj_start); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  | void object_start_map::clear_object_start_offsets() { | 
					
						
							|  |  |  |   memset(object_start_offsets, card_starts_inside_object, addr_to_card(size)); | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 00:28:25 -04:00
										 |  |  | void object_start_map::update_card_for_sweep(cell index, uint16_t mask) { | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   cell offset = object_start_offsets[index]; | 
					
						
							|  |  |  |   if (offset != card_starts_inside_object) { | 
					
						
							|  |  |  |     mask >>= (offset / data_alignment); | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |     if (mask == 0) { | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |       // The rest of the block after the old object start is free
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |       object_start_offsets[index] = card_starts_inside_object; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |       // Move the object start forward if necessary
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |       object_start_offsets[index] = | 
					
						
							|  |  |  |           (card)(offset + (rightmost_set_bit(mask) * data_alignment)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-06 11:58:24 -05:00
										 |  |  | void object_start_map::update_for_sweep(mark_bits* state) { | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   for (cell index = 0; index < state->bits_size; index++) { | 
					
						
							|  |  |  |     cell mask = state->marked[index]; | 
					
						
							| 
									
										
										
										
											2009-11-05 20:29:27 -05:00
										 |  |  | #ifdef FACTOR_64
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04: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
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |     update_card_for_sweep(index * 2, mask & 0xffff); | 
					
						
							|  |  |  |     update_card_for_sweep(index * 2 + 1, (mask >> 16) & 0xffff); | 
					
						
							| 
									
										
										
										
											2009-11-05 20:29:27 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:16:45 -04:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-11-01 21:15:42 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | } |