<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -65,7 +65,7 @@ STRUCT: gc-event
 { data-sweep-time cell }
 { code-sweep-time cell }
 { compaction-time cell }
-{ temp-time cell } ;
+{ temp-time ulonglong } ;
 
 STRUCT: dispatch-statistics
 { megamorphic-cache-hits cell }</diff>
      <filename>basis/vm/vm.factor</filename>
    </modified>
    <modified>
      <diff>@@ -39,39 +39,59 @@ void free_list::add_to_free_list(free_heap_block *block)
 free_heap_block *free_list::find_free_block(cell size)
 {
 	/* Check small free lists */
-	for(cell i = size / block_granularity; i &lt; free_list_count; i++)
+	if(size / block_granularity &lt; free_list_count)
 	{
-		std::vector&lt;free_heap_block *&gt; &amp;blocks = small_blocks[i];
-		if(blocks.size())
+		std::vector&lt;free_heap_block *&gt; &amp;blocks = small_blocks[size / block_granularity];
+		if(blocks.size() == 0)
 		{
-			free_heap_block *block = blocks.back();
-			blocks.pop_back();
-
-			free_block_count--;
-			free_space -= block-&gt;size();
-
-			return block;
+			/* Round up to a multiple of 'size' */
+			cell large_block_size = ((allocation_page_size + size - 1) / size) * size;
+
+			/* Allocate a block this big */
+			free_heap_block *large_block = find_free_block(large_block_size);
+			if(!large_block) return NULL;
+
+			large_block = split_free_block(large_block,large_block_size);
+
+			/* Split it up into pieces and add each piece back to the free list */
+			for(cell offset = 0; offset &lt; large_block_size; offset += size)
+			{
+				free_heap_block *small_block = large_block;
+				large_block = (free_heap_block *)((cell)large_block + size);
+				small_block-&gt;make_free(size);
+				add_to_free_list(small_block);
+			}
 		}
-	}
-
-	/* Check large free lists */
-	free_heap_block key;
-	key.make_free(size);
-	large_block_set::iterator iter = large_blocks.lower_bound(&amp;key);
-	large_block_set::iterator end = large_blocks.end();
 
-	if(iter != end)
-	{
-		free_heap_block *block = *iter;
-		large_blocks.erase(iter);
+		free_heap_block *block = blocks.back();
+		blocks.pop_back();
 
 		free_block_count--;
 		free_space -= block-&gt;size();
 
 		return block;
 	}
+	else
+	{
+		/* Check large free list */
+		free_heap_block key;
+		key.make_free(size);
+		large_block_set::iterator iter = large_blocks.lower_bound(&amp;key);
+		large_block_set::iterator end = large_blocks.end();
 
-	return NULL;
+		if(iter != end)
+		{
+			free_heap_block *block = *iter;
+			large_blocks.erase(iter);
+
+			free_block_count--;
+			free_space -= block-&gt;size();
+
+			return block;
+		}
+
+		return NULL;
+	}
 }
 
 free_heap_block *free_list::split_free_block(free_heap_block *block, cell size)
@@ -90,22 +110,7 @@ free_heap_block *free_list::split_free_block(free_heap_block *block, cell size)
 
 bool free_list::can_allot_p(cell size)
 {
-	/* Check small free lists */
-	for(cell i = size / block_granularity; i &lt; free_list_count; i++)
-	{
-		if(small_blocks[i].size()) return true;
-	}
-
-	/* Check large free lists */
-	large_block_set::const_iterator iter = large_blocks.begin();
-	large_block_set::const_iterator end = large_blocks.end();
-
-	for(; iter != end; iter++)
-	{
-		if((*iter)-&gt;size() &gt;= size) return true;
-	}
-
-	return false;
+	return largest_free_block() &gt;= std::max(size,allocation_page_size);
 }
 
 cell free_list::largest_free_block()</diff>
      <filename>vm/free_list.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@ namespace factor
 {
 
 static const cell free_list_count = 32;
+static const cell allocation_page_size = 1024;
 
 struct free_heap_block
 {</diff>
      <filename>vm/free_list.hpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@ struct gc_event {
 	cell data_sweep_time;
 	cell code_sweep_time;
 	cell compaction_time;
-	cell temp_time;
+	u64 temp_time;
 
 	explicit gc_event(gc_op op_, factor_vm *parent);
 	void started_card_scan();</diff>
      <filename>vm/gc.hpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ef7fc35f23c53d947a5da356afbf3d29173f4c72</id>
    </parent>
  </parents>
  <author>
    <name>Slava Pestov</name>
    <email>slava@slava-pestovs-macbook-pro.local</email>
  </author>
  <url>http://github.com/slavapestov/factor/commit/61f1f3b4735635695c175375743b27a9ce82073c</url>
  <id>61f1f3b4735635695c175375743b27a9ce82073c</id>
  <committed-date>2009-11-11T17:33:50-08:00</committed-date>
  <authored-date>2009-11-11T17:33:50-08:00</authored-date>
  <message>Revert &quot;Revert &quot;vm: faster allocation in tenured space and code heap. If small free list exhausted, allocate a 1kb block and split it up instead of searching larger free lists&quot;&quot;

This reverts commit 81a68ebd364926d69328c01a685a755ed597b846.</message>
  <tree>0c8aa19d4607a0ad2f76218bc3f53106a9e9b718</tree>
  <committer>
    <name>Slava Pestov</name>
    <email>slava@slava-pestovs-macbook-pro.local</email>
  </committer>
</commit>
