From 6e9b6bf8400091bacdb089c249d0736ca9103042 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 22 Jul 2011 17:46:28 +1000 Subject: [PATCH] Implement pool removal. --- main.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/main.c b/main.c index 21826304..a97f60c6 100644 --- a/main.c +++ b/main.c @@ -1441,6 +1441,30 @@ static void display_pool_summary(struct pool *pool) wprintw(logwin, " Submitting work remotely delay occasions: %d\n\n", pool->remotefail_occasions); } +/* We can't remove the memory used for this struct pool because there may + * still be work referencing it. We just remove it from the pools list */ +static void remove_pool(struct pool *pool) +{ + int i, last_pool = total_pools - 1; + struct pool *other; + + /* Boost priority of any lower prio than this one */ + for (i = 0; i < total_pools; i++) { + other = pools[i]; + if (other->prio > pool->prio) + other->prio--; + } + + if (pool->pool_no < last_pool) { + /* Swap the last pool for this one */ + (pools[last_pool])->pool_no = pool->pool_no; + pools[pool->pool_no] = pools[last_pool]; + } + /* Give it an invalid number */ + pool->pool_no = total_pools; + total_pools--; +} + static void display_pools(void) { struct pool *pool; @@ -1481,6 +1505,26 @@ retry: if (!strncasecmp(&input, "a", 1)) { input_pool(true); goto updated; + } else if (!strncasecmp(&input, "r", 1)) { + if (active_pools() <= 1) { + wprintw(logwin, "Cannot remove last pool"); + goto retry; + } + selected = curses_int("Select pool number"); + if (selected < 0 || selected >= total_pools) { + wprintw(logwin, "Invalid selection\n"); + goto retry; + } + pool = pools[selected]; + if (pool == current_pool()) + switch_pools(NULL); + if (pool == current_pool()) { + wprintw(logwin, "Unable to remove pool due to activity\n"); + goto retry; + } + pool->enabled = false; + remove_pool(pool); + goto updated; } else if (!strncasecmp(&input, "s", 1)) { selected = curses_int("Select pool number"); if (selected < 0 || selected >= total_pools) {