For INDIRECT_CORE make process_realloc() free the physical blocks before resize
authorNick Downing <nick@ndcode.org>
Sun, 2 Jun 2019 02:29:57 +0000 (12:29 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 2 Jun 2019 02:29:57 +0000 (12:29 +1000)
block_pool.c
process.c

index cc28091..b6e4906 100644 (file)
@@ -21,6 +21,7 @@ void block_pool_init(struct block_pool *block_pool, int n_blocks) {
   block_pool->avail = n_blocks;
 }
 
+// note: size argument can be negative, indicates a no-op
 bool block_pool_alloc(struct block_pool *block_pool, int *table, int size) {
   int i, j, k;
   uint8_t c;
@@ -63,23 +64,22 @@ bool block_pool_alloc(struct block_pool *block_pool, int *table, int size) {
     assert(table[i] == 0x55555555);
 #endif
  //printf("block_pool %p table+i %p alloc %d\n", block_pool, table + i, block_pool->next);
- fflush(stdout);
     table[i] = block_pool->next++;
     if (block_pool->next >= block_pool->n_blocks)
       block_pool->next = 0;
   }
 
-  block_pool->avail -= size;
+  block_pool->avail -= i;
   return true;
 }
 
+// note: size argument can be negative, indicates a no-op
 void block_pool_free(struct block_pool *block_pool, int *table, int size) {
   int i, j, k;
 
   for (i = 0; i < size; ++i) {
     j = table[i];
  //printf("block_pool %p table+i %p free %d\n", block_pool, table + i, j);
- fflush(stdout);
     assert(j >= 0 && j < block_pool->n_blocks);
     k = j & 7;
     j >>= 3;
@@ -90,5 +90,5 @@ void block_pool_free(struct block_pool *block_pool, int *table, int size) {
 #endif
   }
 
-  block_pool->avail += size;
+  block_pool->avail += i;
 }
index 0d1a350..3de3863 100644 (file)
--- a/process.c
+++ b/process.c
@@ -47,6 +47,7 @@ void process_init(int n, int spare) {
   victim = NULL;
 }
 
+// note: swap_out argument can be negative, indicates a no-op
 static bool do_swap_out(int swap_out) {
   int victim_core_blocks;
   int blocks, swap_base, core_base;
@@ -385,6 +386,17 @@ bool process_realloc(struct process *process, int paras, bool dir) {
     )
   );
 #else /* INDIRECT_CORE */
+  // discard physical blocks as needed
+  block_pool_free(
+    &core_block_pool,
+    core_table_mem + (
+      dir ?
+        process->core_item.base :
+        process->core_item.limit + blocks_change
+    ),
+    -blocks_change
+  );
+
   // reallocate core and possible swap
   if (
     !pool_alloc(
@@ -394,6 +406,7 @@ bool process_realloc(struct process *process, int paras, bool dir) {
       dir | POOL_ALLOC_MODE_REALLOC
     )
   ) {
+    assert(blocks_change >= 0);
     pool_free(&swap_table, &process->swap_item);
     rassert(
       pool_alloc(
@@ -406,34 +419,21 @@ bool process_realloc(struct process *process, int paras, bool dir) {
     return false;
   }
 
-  if (blocks_change < 0)
-    // discard physical blocks as needed
-    block_pool_free(
+  // free up as much core as we need to
+  rassert(do_swap_out(blocks_change - core_block_pool.avail));
+
+  // populate physical blocks as needed
+  rassert(
+    block_pool_alloc(
       &core_block_pool,
       core_table_mem + (
         dir ?
-          process->core_item.base + blocks_change :
-          process->core_item.limit
+          process->core_item.base :
+          process->core_item.limit - blocks_change
       ),
-      -blocks_change
-    );
-  else {
-    // free up as much core as we need to
-    rassert(do_swap_out(blocks_change - core_block_pool.avail));
-
-    // populate physical blocks as needed
-    rassert(
-      block_pool_alloc(
-        &core_block_pool,
-        core_table_mem + (
-          dir ?
-            process->core_item.base :
-            process->core_item.limit - blocks_change
-        ),
-        blocks_change
-      )
-    );
-  }
+      blocks_change
+    )
+  );
 #endif /* INDIRECT_CORE */
 
   // track total allocation