// allocate core and possible swap
#ifdef MOVEABLE_CORE
- rassert(
- core_table_alloc(
-#ifdef PREALLOCATE_CORE
- &process->core_item,
+ rassert(core_table_alloc(&PER_PROCESS_CORE_ITEM(process), size));
#else
- &process->pool_item,
-#endif
- size
- )
- );
-#else
- if (
- !core_table_alloc(
-#ifdef PREALLOCATE_CORE
- &process->core_item,
-#else
- &process->pool_item,
-#endif
- size
- )
- ) {
+ if (!core_table_alloc(&PER_PROCESS_CORE_ITEM(process), size)) {
#if defined(PREALLOCATE_SWAP) && !defined(MOVEABLE_SWAP)
swap_table_free(&process->swap_item);
#endif
// populate new table with physical blocks
rassert(
core_block_alloc(
-#ifdef PREALLOCATE_CORE
- core_table_mem + process->core_item.base,
-#else
- core_table_mem + process->pool_item.base,
-#endif
+ core_table_mem + PER_PROCESS_CORE_ITEM(process).base,
size
)
);
// reallocate core and possible swap
#ifdef MOVEABLE_CORE
- rassert(
- core_table_realloc(
-#ifdef PREALLOCATE_CORE
- &process->core_item,
-#else
- &process->pool_item,
-#endif
- size
- )
- );
-#else
- if (
- !core_table_realloc(
-#ifdef PREALLOCATE_CORE
- &process->core_item,
+ rassert(core_table_realloc(&PER_PROCESS_CORE_ITEM(process), size));
#else
- &process->pool_item,
-#endif
- size
- )
- ) {
+ if (!core_table_realloc(&PER_PROCESS_CORE_ITEM(process), size)) {
#if defined(PREALLOCATE_SWAP) && !defined(MOVEABLE_SWAP)
swap_table_free(&process->swap_item);
rassert(swap_table_alloc(&process->swap_item, process->size));
if (size_change >= 0)
rassert(
core_block_alloc(
-#ifdef PREALLOCATE_CORE
- core_table_mem + process->core_item.limit - size_change,
-#else
- core_table_mem + process->pool_item.limit - size_change,
-#endif
+ core_table_mem + PER_PROCESS_CORE_ITEM(process).limit - size_change,
size_change
)
);
else
core_block_free(
-#ifdef PREALLOCATE_CORE
- core_table_mem + process->core_item.limit,
-#else
- core_table_mem + process->pool_item.limit,
-#endif
+ core_table_mem + PER_PROCESS_CORE_ITEM(process).limit,
-size_change
);
#endif
process->lru_item.prev->next = process->lru_item.next;
process->lru_item.next->prev = process->lru_item.prev;
-#ifdef PREALLOCATE_CORE
#ifdef INDIRECT_CORE
+ int core_base = PER_PROCESS_CORE_ITEM(process).base;
core_block_free(
- core_table_mem + process->core_item.base,
- process->core_item.limit - process->core_item.base
- );
-#endif
-#else
-#ifdef INDIRECT_CORE
- core_block_free(
- core_table_mem + process->pool_item.base,
- process->pool_item.limit - process->pool_item.base
+ core_table_mem + core_base,
+ PER_PROCESS_CORE_ITEM(process).limit - core_base
);
#endif
+#ifndef PREALLOCATE_CORE
core_table_free(&process->pool_item);
#endif
}
else if (process == victim) {
// victim, free the dedicated pool items
- victim = NULL;
-#ifdef PREALLOCATE_CORE
#ifdef INDIRECT_CORE
core_block_free(
- core_table_mem + process->core_item.base + victim_swap_size,
- victim_core_size
- );
-#endif
- victim_core_size = 0;
+#ifdef PREALLOCATE_CORE
+ core_table_mem + victim->core_item.base + DEDICATED_SWAP_SIZE(victim),
#else
-#ifdef INDIRECT_CORE
- core_block_free(
core_table_mem + victim_core_item.base,
- victim_core_item.limit - victim_core_item.base
+#endif
+ DEDICATED_CORE_SIZE(victim)
);
#endif
+#ifdef PREALLOCATE_CORE
+ victim_core_size = 0;
+#else
core_table_free(&victim_core_item);
#endif
-#ifdef PREALLOCATE_SWAP
#ifdef INDIRECT_SWAP
swap_block_free(
- swap_table_mem + process->swap_item.base,
- victim_swap_size
+ swap_table_mem + DEDICATED_SWAP_ITEM(victim).base,
+ DEDICATED_SWAP_SIZE(victim)
);
#endif
+#ifdef PREALLOCATE_SWAP
victim_swap_size = 0;
#else
-#ifdef INDIRECT_SWAP
- swap_block_free(
- swap_table_mem + victim_swap_item.base,
- victim_swap_item.limit - victim_swap_item.base
- );
-#endif
swap_table_free(&victim_swap_item);
#endif
+ victim = NULL;
}
else {
// fully in swap, remove from swap pool
-#ifdef PREALLOCATE_SWAP
-#ifdef INDIRECT_SWAP
- swap_block_free(
- swap_table_mem + process->swap_item.base,
- process->swap_item.limit - process->swap_item.base
- );
-#endif
-#else
#ifdef INDIRECT_SWAP
+ int swap_base = PER_PROCESS_SWAP_ITEM(process).base;
swap_block_free(
- swap_table_mem + process->pool_item.base,
- process->pool_item.limit - process->pool_item.base
+ swap_table_mem + swap_base,
+ PER_PROCESS_SWAP_ITEM(process).limit - swap_base
);
#endif
+#ifndef PREALLOCATE_SWAP
swap_table_free(&process->pool_item);
#endif
}
//#define PREALLOCATE_CORE 1
#define PREALLOCATE_SWAP 1
+#ifdef PREALLOCATE_CORE
+#define DEDICATED_CORE_ITEM(process) \
+ process->core_item
+#define DEDICATED_CORE_SIZE(process) \
+ process##_core_size
+#define PER_PROCESS_CORE_ITEM(process) \
+ (process)->core_item
+#else
+#define DEDICATED_CORE_ITEM(process) \
+ process##_core_item
+#define DEDICATED_CORE_SIZE(process) \
+ (process##_core_item.limit - process##_core_item.base)
+#define PER_PROCESS_CORE_ITEM(process) \
+ (process)->pool_item
+#endif
+
+#ifdef PREALLOCATE_SWAP
+#define DEDICATED_SWAP_ITEM(process) \
+ process->swap_item
+#define DEDICATED_SWAP_SIZE(process) \
+ process##_swap_size
+#define PER_PROCESS_SWAP_ITEM(process) \
+ (process)->swap_item
+#else
+#define DEDICATED_SWAP_ITEM(process) \
+ process##_swap_item
+#define DEDICATED_SWAP_SIZE(process) \
+ (process##_swap_item.limit - process##_swap_item.base)
+#define PER_PROCESS_SWAP_ITEM(process) \
+ (process)->pool_item
+#endif
+
struct lru_item {
struct lru_item *prev;
struct lru_item *next;