From 3eede48f6bbaeed08ebe87440c40b03d8cff5b3d Mon Sep 17 00:00:00 2001
From: David Bigagli <david@schedmd.com>
Date: Wed, 17 Jul 2013 12:25:23 -0700
Subject: [PATCH] Implement lib C qsort() as main sorting function. Change the
 compare functions accordingly.

---
 src/common/list.c                             |  95 ++++++-
 src/common/list.h                             |  12 +-
 src/common/print_fields.c                     |  11 +-
 src/common/slurm_protocol_defs.c              |  10 +-
 src/common/slurm_protocol_defs.h              |   4 +-
 src/common/slurmdb_defs.c                     |  19 +-
 src/db_api/job_report_functions.c             |  14 +-
 .../accounting_storage/common/common_as.c     |   6 +-
 .../filetxt/filetxt_jobacct_process.c         |   4 +-
 .../accounting_storage/mysql/as_mysql_assoc.c |   8 +-
 .../accounting_storage/pgsql/as_pg_assoc.c    |   8 +-
 .../partition_prio/preempt_partition_prio.c   |   9 +-
 src/plugins/preempt/qos/preempt_qos.c         |   9 +-
 .../select/bluegene/bg_record_functions.c     |  16 +-
 .../select/bluegene/bg_record_functions.h     |   4 +-
 src/plugins/select/cons_res/select_cons_res.c |  22 +-
 src/plugins/select/linear/select_linear.c     |  15 +-
 src/sacctmgr/common.c                         |   9 +-
 src/sacctmgr/sacctmgr.h                       |   3 +-
 src/sinfo/sort.c                              | 173 ++++++++-----
 src/slurmctld/gang.c                          |  15 +-
 src/slurmctld/job_scheduler.c                 |   8 +-
 src/slurmctld/node_mgr.c                      |  11 +-
 src/squeue/sort.c                             | 232 ++++++++++++------
 src/sreport/common.c                          |  36 ++-
 src/sreport/job_reports.c                     |  26 +-
 src/sreport/sreport.h                         |  12 +-
 src/sview/block_info.c                        |  12 +-
 src/sview/grid.c                              |  11 +-
 src/sview/job_info.c                          |  12 +-
 src/sview/part_info.c                         |  24 +-
 src/sview/resv_info.c                         |  12 +-
 32 files changed, 611 insertions(+), 251 deletions(-)

diff --git a/src/common/list.c b/src/common/list.c
index 773f2007ff1..bf6230a730b 100644
--- a/src/common/list.c
+++ b/src/common/list.c
@@ -115,7 +115,7 @@ strong_alias(list_install_fork_handlers, slurm_list_install_fork_handlers);
 #  ifndef lsd_nomem_error
 	static void * lsd_nomem_error(char *file, int line, char *mesg)
 	{
-		
+
 		log_oom(file, line, mesg);
 		abort();
 		return NULL;
@@ -201,7 +201,8 @@ static ListIterator list_iterator_alloc (void);
 static void list_iterator_free (ListIterator i);
 static void * list_alloc_aux (int size, void *pfreelist);
 static void list_free_aux (void *x, void *pfreelist);
-
+static void *_list_pop_locked(List l);
+static void *_list_append_locked(List l, void *x);
 
 /***************
  *  Variables  *
@@ -369,7 +370,7 @@ list_append (List l, void *x)
     assert(x != NULL);
     list_mutex_lock(&l->mutex);
     assert(l->magic == LIST_MAGIC);
-    v = list_node_create(l, l->tail, x);
+    v = _list_append_locked(l, x);
     list_mutex_unlock(&l->mutex);
     return(v);
 }
@@ -530,7 +531,7 @@ list_flush (List l)
 }
 
 void
-list_sort (List l, ListCmpF f)
+list_sort2 (List l, ListCmpF f)
 {
     ListIterator it;
 
@@ -613,7 +614,7 @@ list_sort (List l, ListCmpF f)
 }
 
 void
-list_sort2 (List l, ListCmpF f)
+list_sort3 (List l, ListCmpF f)
 {
 /*  Note: Time complexity O(n^2).
  */
@@ -669,6 +670,58 @@ list_push (List l, void *x)
     return(v);
 }
 
+void
+list_sort(List l, ListCmpF f)
+{
+	char **v;
+	int n;
+	int lsize;
+	void *e;
+	ListIterator i;
+
+	assert(l != NULL);
+	assert(f != NULL);
+	assert(l->magic == LIST_MAGIC);
+	list_mutex_lock(&l->mutex);
+
+	if (l->count <= 1) {
+		list_mutex_unlock(&l->mutex);
+		return;
+	}
+
+	lsize = l->count;
+	v = xmalloc(lsize * sizeof(char *));
+	if (v == NULL) {
+		list_mutex_unlock(&l->mutex);
+		lsd_nomem_error(__FILE__, __LINE__, "list_sort");
+		return;
+	}
+
+	n = 0;
+	while ((e = _list_pop_locked(l))) {
+		v[n] = e;
+		++n;
+	}
+
+	qsort(v, n, sizeof(char *), (__compar_fn_t)f);
+
+	for (n = 0; n < lsize; n++) {
+		_list_append_locked(l, v[n]);
+	}
+
+	xfree(v);
+
+	/* Reset all iterators on the list to point
+	 * to the head of the list.
+	 */
+	for (i = l->iNext; i; i = i->iNext) {
+		assert(i->magic == LIST_MAGIC);
+		i->pos = i->list->head;
+		i->prev = &i->list->head;
+	}
+
+	list_mutex_unlock(&l->mutex);
+}
 
 void *
 list_pop (List l)
@@ -678,7 +731,7 @@ list_pop (List l)
     assert(l != NULL);
     list_mutex_lock(&l->mutex);
     assert(l->magic == LIST_MAGIC);
-    v = list_node_destroy(l, &l->head);
+    v = _list_pop_locked(l);
     list_mutex_unlock(&l->mutex);
     return(v);
 }
@@ -1121,3 +1174,33 @@ list_mutex_is_locked (pthread_mutex_t *mutex)
 }
 #endif /* WITH_PTHREADS */
 #endif /* !NDEBUG */
+
+/* _list_pop_locked
+ *
+ * Pop an item from the list assuming the
+ * the list is already locked.
+ */
+static void *
+_list_pop_locked(List l)
+{
+	void *v;
+
+	v = list_node_destroy(l, &l->head);
+
+	return v;
+}
+
+/* _list_append_locked()
+ *
+ * Append an item to the list. The function assumes
+ * the list is already locked.
+ */
+static void *
+_list_append_locked(List l, void *x)
+{
+	void *v;
+
+	v = list_node_create(l, l->tail, x);
+
+	return v;
+}
diff --git a/src/common/list.h b/src/common/list.h
index d24dcdd3839..1e19fea80e9 100644
--- a/src/common/list.h
+++ b/src/common/list.h
@@ -217,7 +217,17 @@ void list_sort (List l, ListCmpF f);
 /*
  *  Sorts list [l] into ascending order according to the function [f].
  *  Note: Sorting a list resets all iterators associated with the list.
- *  Note: The sort algorithm is stable.
+ *  This function uses the libC qsort() algorithm.
+ */
+
+void list_sort2 (List l, ListCmpF f);
+/* This function uses the sort merge algorithm
+ *  Note: Sorting a list resets all iterators associated with the list.
+ */
+
+void list_sort3 (List l, ListCmpF f);
+/* This function uses the n^2 brute force algorithm.
+ * Note: Sorting a list resets all iterators associated with the list.
  */
 
 /****************************
diff --git a/src/common/print_fields.c b/src/common/print_fields.c
index 3e8fe1d51d6..fe13a5bdbec 100644
--- a/src/common/print_fields.c
+++ b/src/common/print_fields.c
@@ -42,9 +42,16 @@
 int print_fields_parsable_print = 0;
 int print_fields_have_header = 1;
 
-static int _sort_char_list(char *name_a, char *name_b)
+static int _sort_char_list(void *v1, void *v2)
 {
-	int diff = strcmp(name_a, name_b);
+	int diff;
+	char *name_a;
+	char *name_b;
+
+	name_a = *(char **)v1;
+	name_b = *(char **)v2;
+
+	diff = strcmp(name_a, name_b);
 
 	if (diff < 0)
 		return -1;
diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index e4df20a6d62..460b8c3c3ed 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -254,9 +254,15 @@ endit:
 	return count;
 }
 
-extern int slurm_sort_char_list_asc(char *name_a, char *name_b)
+extern int slurm_sort_char_list_asc(void *v1, void *v2)
 {
-	int diff = strcmp(name_a, name_b);
+	int diff;
+	char *name_a;
+	char *name_b;
+
+	name_a = *(char **)v1;
+	name_b = *(char **)v2;
+	diff = strcmp(name_a, name_b);
 
 	if (diff < 0)
 		return -1;
diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h
index 544ec49c515..a70d9b2915d 100644
--- a/src/common/slurm_protocol_defs.h
+++ b/src/common/slurm_protocol_defs.h
@@ -748,7 +748,7 @@ typedef struct return_code_msg {
  * the job epilog. */
 
 #define SIG_PREEMPTED	994	/* Dummy signal value for job preemption */
-#define SIG_DEBUG_WAKE	995	/* Dummy signal value to wake procs stopped 
+#define SIG_DEBUG_WAKE	995	/* Dummy signal value to wake procs stopped
 				 * for debugger */
 #define SIG_TIME_LIMIT	996	/* Dummy signal value for time limit reached */
 #define SIG_ABORT	997	/* Dummy signal value to abort a job */
@@ -1030,7 +1030,7 @@ extern void slurm_destroy_uint32_ptr(void *object);
 /* here to add \\ to all \" in a string this needs to be xfreed later */
 extern char *slurm_add_slash_to_quotes(char *str);
 extern int slurm_addto_char_list(List char_list, char *names);
-extern int slurm_sort_char_list_asc(char *name_a, char *name_b);
+extern int slurm_sort_char_list_asc(void *, void *);
 extern int slurm_sort_char_list_desc(char *name_a, char *name_b);
 
 /* free message functions */
diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c
index f9f14ac13ac..1a97df4c673 100644
--- a/src/common/slurmdb_defs.c
+++ b/src/common/slurmdb_defs.c
@@ -119,10 +119,14 @@ static void _free_cluster_cond_members(slurmdb_cluster_cond_t *cluster_cond)
  *
  */
 
-static int _sort_childern_list(slurmdb_hierarchical_rec_t *assoc_a,
-			       slurmdb_hierarchical_rec_t *assoc_b)
+static int _sort_children_list(void *v1, void *v2)
 {
 	int diff = 0;
+	slurmdb_hierarchical_rec_t *assoc_a;
+	slurmdb_hierarchical_rec_t *assoc_b;
+
+	assoc_a = *(slurmdb_hierarchical_rec_t **)v1;
+	assoc_b = *(slurmdb_hierarchical_rec_t    **)v2;
 
 	/* Since all these assocations are on the same level we don't
 	 * have to check the lfts
@@ -155,9 +159,14 @@ static int _sort_childern_list(slurmdb_hierarchical_rec_t *assoc_a,
  *
  */
 
-static int _sort_assoc_by_lft_dec(slurmdb_association_rec_t *assoc_a,
-				  slurmdb_association_rec_t *assoc_b)
+static int _sort_assoc_by_lft_dec(void *v1, void *v2)
 {
+	slurmdb_association_rec_t *assoc_a;
+	slurmdb_association_rec_t *assoc_b;
+
+	assoc_a = *(slurmdb_association_rec_t **)v1;
+	assoc_b = *(slurmdb_association_rec_t **)v2;
+
 	if (assoc_a->lft == assoc_b->lft)
 		return 0;
 	if (assoc_a->lft > assoc_b->lft)
@@ -174,7 +183,7 @@ static int _sort_slurmdb_hierarchical_rec_list(
 	if (!list_count(slurmdb_hierarchical_rec_list))
 		return SLURM_SUCCESS;
 
-	list_sort(slurmdb_hierarchical_rec_list, (ListCmpF)_sort_childern_list);
+	list_sort(slurmdb_hierarchical_rec_list, (ListCmpF)_sort_children_list);
 
 	itr = list_iterator_create(slurmdb_hierarchical_rec_list);
 	while((slurmdb_hierarchical_rec = list_next(itr))) {
diff --git a/src/db_api/job_report_functions.c b/src/db_api/job_report_functions.c
index af92f7aff24..69e4c478da4 100644
--- a/src/db_api/job_report_functions.c
+++ b/src/db_api/job_report_functions.c
@@ -49,10 +49,18 @@
 #include "src/common/slurm_accounting_storage.h"
 #include "src/common/xstring.h"
 
-static int _sort_group_asc(char *group_a, char *group_b)
+static int _sort_group_asc(void *v1, void *v2)
 {
-	int size_a = atoi(group_a);
-	int size_b = atoi(group_b);
+	char *group_a;
+	char *group_b;
+	int size_a;
+	int size_b;
+
+	group_a = *(char **)v1;
+	group_b = *(char **)v2;
+
+	size_a = atoi(group_a);
+	size_b = atoi(group_b);
 
 	if (size_a < size_b)
 		return -1;
diff --git a/src/plugins/accounting_storage/common/common_as.c b/src/plugins/accounting_storage/common/common_as.c
index c5961a9729b..420799ce440 100644
--- a/src/plugins/accounting_storage/common/common_as.c
+++ b/src/plugins/accounting_storage/common/common_as.c
@@ -65,9 +65,11 @@ extern char *wckey_month_table;
 /*
  * We want SLURMDB_MODIFY_ASSOC always to be the last
  */
-static int _sort_update_object_dec(slurmdb_update_object_t *object_a,
-				   slurmdb_update_object_t *object_b)
+static int _sort_update_object_dec(void *a, void *b)
 {
+	slurmdb_update_object_t *object_a = *(slurmdb_update_object_t **)a;
+	slurmdb_update_object_t *object_b = *(slurmdb_update_object_t **)b;
+
 	if ((object_a->type == SLURMDB_MODIFY_ASSOC)
 	    && (object_b->type != SLURMDB_MODIFY_ASSOC))
 		return 1;
diff --git a/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c b/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c
index a762e441ff2..a8bb9fdca37 100644
--- a/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c
+++ b/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c
@@ -470,8 +470,8 @@ static FILE *_open_log_file(char *logfile)
 }
 
 static int _cmp_jrec(const void *a1, const void *a2) {
-	expired_rec_t *j1 = (expired_rec_t *) a1;
-	expired_rec_t *j2 = (expired_rec_t *) a2;
+	expired_rec_t *j1 = *(expired_rec_t **) a1;
+	expired_rec_t *j2 = *(expired_rec_t **) a2;
 
 	if (j1->job <  j2->job)
 		return -1;
diff --git a/src/plugins/accounting_storage/mysql/as_mysql_assoc.c b/src/plugins/accounting_storage/mysql/as_mysql_assoc.c
index e5ed5be3004..297bdd9c892 100644
--- a/src/plugins/accounting_storage/mysql/as_mysql_assoc.c
+++ b/src/plugins/accounting_storage/mysql/as_mysql_assoc.c
@@ -181,11 +181,13 @@ enum {
 	RASSOC_COUNT
 };
 
-static int _assoc_sort_cluster(slurmdb_association_rec_t *rec_a,
-			       slurmdb_association_rec_t *rec_b)
+static int _assoc_sort_cluster(void *r1, void *r2)
 {
-	int diff = strcmp(rec_a->cluster, rec_b->cluster);
+	slurmdb_association_rec_t *rec_a = *(slurmdb_association_rec_t **)r1;
+	slurmdb_association_rec_t *rec_b = *(slurmdb_association_rec_t **)r2;
+	int diff;
 
+	diff = strcmp(rec_a->cluster, rec_b->cluster);
 	if (diff < 0)
 		return -1;
 	else if (diff > 0)
diff --git a/src/plugins/accounting_storage/pgsql/as_pg_assoc.c b/src/plugins/accounting_storage/pgsql/as_pg_assoc.c
index 20e3e3ccb9d..caf7ebe7890 100644
--- a/src/plugins/accounting_storage/pgsql/as_pg_assoc.c
+++ b/src/plugins/accounting_storage/pgsql/as_pg_assoc.c
@@ -1423,11 +1423,13 @@ check_assoc_tables(PGconn *db_conn, char *cluster)
 }
 
 static int
-_assoc_sort_cluster(slurmdb_association_rec_t *rec_a,
-		    slurmdb_association_rec_t *rec_b)
+_assoc_sort_cluster(void *r1, void *r2)
 {
-	int diff = strcmp(rec_a->cluster, rec_b->cluster);
+	slurmdb_association_rec_t *rec_a = *(slurmdb_association_rec_t **)r1;
+	slurmdb_association_rec_t *rec_b = *(slurmdb_association_rec_t **)r2;
+	int diff;
 
+	diff = strcmp(rec_a->cluster, rec_b->cluster);
 	if (diff < 0)
 		return -1;
 	else if (diff > 0)
diff --git a/src/plugins/preempt/partition_prio/preempt_partition_prio.c b/src/plugins/preempt/partition_prio/preempt_partition_prio.c
index 300a5c9160a..620c0fc355b 100644
--- a/src/plugins/preempt/partition_prio/preempt_partition_prio.c
+++ b/src/plugins/preempt/partition_prio/preempt_partition_prio.c
@@ -153,9 +153,14 @@ static int _sort_by_prio (void *x, void *y)
 {
 	int rc;
 	uint32_t job_prio1, job_prio2;
+	struct job_record *j1;
+	struct job_record *j2;
 
-	job_prio1 = _gen_job_prio((struct job_record *) x);
-	job_prio2 = _gen_job_prio((struct job_record *) y);
+	j1 = *(struct job_record **)x;
+	j2 = *(struct job_record **)y;
+
+	job_prio1 = _gen_job_prio(j1);
+	job_prio2 = _gen_job_prio(j2);
 
 	if (job_prio1 > job_prio2)
 		rc = 1;
diff --git a/src/plugins/preempt/qos/preempt_qos.c b/src/plugins/preempt/qos/preempt_qos.c
index af01632b1c2..9e4210842b7 100644
--- a/src/plugins/preempt/qos/preempt_qos.c
+++ b/src/plugins/preempt/qos/preempt_qos.c
@@ -170,9 +170,14 @@ static int _sort_by_prio (void *x, void *y)
 {
 	int rc;
 	uint32_t job_prio1, job_prio2;
+	struct job_record *j1;
+	struct job_record *j2;
 
-	job_prio1 = _gen_job_prio((struct job_record *) x);
-	job_prio2 = _gen_job_prio((struct job_record *) y);
+	j1 = *(struct job_record **)x;
+	j2 = *(struct job_record **)y;
+
+	job_prio1 = _gen_job_prio(j1);
+	job_prio2 = _gen_job_prio(j2);
 
 	if (job_prio1 > job_prio2)
 		rc = 1;
diff --git a/src/plugins/select/bluegene/bg_record_functions.c b/src/plugins/select/bluegene/bg_record_functions.c
index 636bf960e39..4aa6939aded 100644
--- a/src/plugins/select/bluegene/bg_record_functions.c
+++ b/src/plugins/select/bluegene/bg_record_functions.c
@@ -456,10 +456,15 @@ extern void copy_bg_record(bg_record_t *fir_record, bg_record_t *sec_record)
  * returns: -1: rec_a > rec_b   0: rec_a == rec_b   1: rec_a < rec_b
  *
  */
-extern int bg_record_cmpf_inc(bg_record_t* rec_a, bg_record_t* rec_b)
+extern int bg_record_cmpf_inc(void *r1, void *r2)
 {
-	int size_a = rec_a->cnode_cnt;
-	int size_b = rec_b->cnode_cnt;
+	bg_record_t *rec_a = *(bg_record_t **)r1;
+	bg_record_t *rec_b = *(bg_record_t **)r2;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->cnode_cnt;
+	size_b = rec_b->cnode_cnt;
 
 	/* We only look at this if we are ordering blocks larger than
 	 * a midplane, order of ionodes is how we order otherwise. */
@@ -496,8 +501,11 @@ extern int bg_record_cmpf_inc(bg_record_t* rec_a, bg_record_t* rec_b)
  * returns: -1: rec_a < rec_b   0: rec_a == rec_b   1: rec_a > rec_b
  *
  */
-extern int bg_record_sort_aval_inc(bg_record_t* rec_a, bg_record_t* rec_b)
+extern int bg_record_sort_aval_inc(void *r1, void *r2)
 {
+	bg_record_t* rec_a = *(bg_record_t **)r1;
+	bg_record_t* rec_b = *(bg_record_t **)r2;
+
 	if ((rec_a->job_running == BLOCK_ERROR_STATE)
 	    && (rec_b->job_running != BLOCK_ERROR_STATE))
 		return 1;
diff --git a/src/plugins/select/bluegene/bg_record_functions.h b/src/plugins/select/bluegene/bg_record_functions.h
index 3ef4c76effc..bad871bc946 100644
--- a/src/plugins/select/bluegene/bg_record_functions.h
+++ b/src/plugins/select/bluegene/bg_record_functions.h
@@ -64,8 +64,8 @@ extern void destroy_bg_record(void *object);
 extern void process_nodes(bg_record_t *bg_reord, bool startup);
 extern List copy_bg_list(List in_list);
 extern void copy_bg_record(bg_record_t *fir_record, bg_record_t *sec_record);
-extern int bg_record_cmpf_inc(bg_record_t *rec_a, bg_record_t *rec_b);
-extern int bg_record_sort_aval_inc(bg_record_t* rec_a, bg_record_t* rec_b);
+extern int bg_record_cmpf_inc(void *, void *);
+extern int bg_record_sort_aval_inc(void *, void *);
 extern void setup_subblock_structs(bg_record_t *bg_record);
 
 /* change username of a block bg_record_t target_name needs to be
diff --git a/src/plugins/select/cons_res/select_cons_res.c b/src/plugins/select/cons_res/select_cons_res.c
index ab058643eb8..5b89db27b57 100644
--- a/src/plugins/select/cons_res/select_cons_res.c
+++ b/src/plugins/select/cons_res/select_cons_res.c
@@ -212,8 +212,8 @@ static int _run_now(struct job_record *job_ptr, bitstr_t *bitmap,
 		    uint32_t req_nodes, uint16_t job_node_req,
 		    List preemptee_candidates, List *preemptee_job_list,
 		    bitstr_t *exc_core_bitmap);
-static int _sort_usable_nodes_dec(struct job_record *job_a,
-				  struct job_record *job_b);
+static int _sort_usable_nodes_dec(void *, void *);
+
 static int _test_only(struct job_record *job_ptr, bitstr_t *bitmap,
 		      uint32_t min_nodes, uint32_t max_nodes,
  		      uint32_t req_nodes, uint16_t job_node_req);
@@ -1492,9 +1492,11 @@ static int _test_only(struct job_record *job_ptr, bitstr_t *bitmap,
  * Sort the usable_node element to put jobs in the correct
  * preemption order.
  */
-static int _sort_usable_nodes_dec(struct job_record *job_a,
-				  struct job_record *job_b)
+static int _sort_usable_nodes_dec(void *j1, void *j2)
 {
+	struct job_record *job_a = *(struct job_record **)j1;
+	struct job_record *job_b = *(struct job_record **)j2;
+
 	if (job_a->details->usable_nodes > job_b->details->usable_nodes)
 		return -1;
 	else if (job_a->details->usable_nodes < job_b->details->usable_nodes)
@@ -2663,7 +2665,7 @@ bitstr_t *sequential_pick(bitstr_t *avail_bitmap, uint32_t node_cnt,
 
 			cores_in_node = 0;
 
-			/* First let's see in there are enough cores in 
+			/* First let's see in there are enough cores in
 			 * this node */
 			for (i = 0; i < local_cores; i++) {
 				if (bit_test(tmpcore, coff + i))
@@ -2672,7 +2674,7 @@ bitstr_t *sequential_pick(bitstr_t *avail_bitmap, uint32_t node_cnt,
 			if (cores_in_node < cores_per_node)
 				continue;
 
-			debug2("Using node %d (avail: %d, needed: %d)", 
+			debug2("Using node %d (avail: %d, needed: %d)",
 				inx, cores_in_node, cores_per_node);
 
 			cores_in_node = 0;
@@ -2805,7 +2807,7 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 
 	if (core_cnt && (*core_bitmap == NULL))
 		*core_bitmap = _make_core_bitmap_filtered(avail_bitmap, 0);
-	
+
 	rem_nodes = node_cnt;
 	rem_cores = core_cnt[0];
 
@@ -2919,7 +2921,7 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 			if (switches_node_cnt[j] == 0)
 				continue;
 			if (core_cnt) {
-				sufficient = 
+				sufficient =
 					(switches_node_cnt[j] >= rem_nodes) &&
 					(switches_cpu_cnt[j] >= core_cnt[0]);
 			} else
@@ -2970,7 +2972,7 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 				}
 				if (avail_cores_in_node < cores_per_node)
 					continue;
-				
+
 				debug2("Using node %d with %d cores available",
 				       i, avail_cores_in_node);
 			}
@@ -2997,7 +2999,7 @@ fini:	for (i=0; i<switch_record_cnt; i++) {
 	xfree(switches_node_cnt);
 	xfree(switches_required);
 
-	if (avail_nodes_bitmap && core_cnt) { 
+	if (avail_nodes_bitmap && core_cnt) {
 		/* Reservation is using partial nodes */
 		//char str[100];
 		bitstr_t *exc_core_bitmap = NULL;
diff --git a/src/plugins/select/linear/select_linear.c b/src/plugins/select/linear/select_linear.c
index b1622af730e..e7856089e44 100644
--- a/src/plugins/select/linear/select_linear.c
+++ b/src/plugins/select/linear/select_linear.c
@@ -154,8 +154,7 @@ static int _run_now(struct job_record *job_ptr, bitstr_t *bitmap,
 		    int max_share, uint32_t req_nodes,
 		    List preemptee_candidates,
 		    List *preemptee_job_list);
-static int _sort_usable_nodes_dec(struct job_record *job_a,
-				  struct job_record *job_b);
+static int _sort_usable_nodes_dec(void *, void *);
 static bool _test_run_job(struct cr_record *cr_ptr, uint32_t job_id);
 static bool _test_tot_job(struct cr_record *cr_ptr, uint32_t job_id);
 static int _test_only(struct job_record *job_ptr, bitstr_t *bitmap,
@@ -2271,7 +2270,7 @@ static void _init_node_cr(void)
 			if (!bit_test(job_resrcs_ptr->node_bitmap, i))
 				continue;
 			node_offset++;
-			if (!bit_test(job_ptr->node_bitmap, i)) 
+			if (!bit_test(job_ptr->node_bitmap, i))
 				continue; /* node already released */
 			node_ptr = node_record_table_ptr + i;
 			if (exclusive)
@@ -2380,9 +2379,11 @@ static int _test_only(struct job_record *job_ptr, bitstr_t *bitmap,
  * Sort the usable_node element to put jobs in the correct
  * preemption order.
  */
-static int _sort_usable_nodes_dec(struct job_record *job_a,
-				  struct job_record *job_b)
+static int _sort_usable_nodes_dec(void *j1, void *j2)
 {
+	struct job_record *job_a = *(struct job_record **)j1;
+	struct job_record *job_b = *(struct job_record **)j2;
+
 	if (job_a->details->usable_nodes > job_b->details->usable_nodes)
 		return -1;
 	else if (job_a->details->usable_nodes < job_b->details->usable_nodes)
@@ -2674,8 +2675,8 @@ static int _will_run_test(struct job_record *job_ptr, bitstr_t *bitmap,
 
 static int  _cr_job_list_sort(void *x, void *y)
 {
-	struct job_record *job1_ptr = (struct job_record *) x;
-	struct job_record *job2_ptr = (struct job_record *) y;
+	struct job_record *job1_ptr = *(struct job_record **) x;
+	struct job_record *job2_ptr = *(struct job_record **) y;
 	return (int) SLURM_DIFFTIME(job1_ptr->end_time, job2_ptr->end_time);
 }
 
diff --git a/src/sacctmgr/common.c b/src/sacctmgr/common.c
index 7091d12d07d..d2124107f3b 100644
--- a/src/sacctmgr/common.c
+++ b/src/sacctmgr/common.c
@@ -1552,10 +1552,13 @@ extern void sacctmgr_print_qos_limits(slurmdb_qos_rec_t *qos)
 
 }
 
-extern int sort_coord_list(slurmdb_coord_rec_t *coord_a,
-			   slurmdb_coord_rec_t *coord_b)
+extern int sort_coord_list(void *a, void *b)
 {
-	int diff = strcmp(coord_a->name, coord_b->name);
+	slurmdb_coord_rec_t *coord_a = *(slurmdb_coord_rec_t **)a;
+	slurmdb_coord_rec_t *coord_b = *(slurmdb_coord_rec_t **)b;
+	int diff;
+
+	diff = strcmp(coord_a->name, coord_b->name);
 
 	if (diff < 0)
 		return -1;
diff --git a/src/sacctmgr/sacctmgr.h b/src/sacctmgr/sacctmgr.h
index 69bce88bb68..3a31353d459 100644
--- a/src/sacctmgr/sacctmgr.h
+++ b/src/sacctmgr/sacctmgr.h
@@ -268,8 +268,7 @@ extern void sacctmgr_print_qos_bitstr(print_field_t *field, List qos_list,
 extern void sacctmgr_print_assoc_limits(slurmdb_association_rec_t *assoc);
 extern void sacctmgr_print_qos_limits(slurmdb_qos_rec_t *qos);
 extern int sacctmgr_remove_assoc_usage(slurmdb_association_cond_t *assoc_cond);
-extern int sort_coord_list(slurmdb_coord_rec_t *coord_a,
-			   slurmdb_coord_rec_t *coord_b);
+extern int sort_coord_list(void *, void *);
 extern List sacctmgr_process_format_list(List format_list);
 
 /* you need to free the objects returned from these functions */
diff --git a/src/sinfo/sort.c b/src/sinfo/sort.c
index 76c88939a55..7b4c3cbb150 100644
--- a/src/sinfo/sort.c
+++ b/src/sinfo/sort.c
@@ -50,6 +50,7 @@
 static bool reverse_order;
 static bool part_order;		/* order same as in part table */
 
+static void _get_sinfo_from_void(sinfo_data_t **s1, sinfo_data_t **s2, void *v1, void *v2);
 static int _sort_by_avail(void *void1, void *void2);
 static int _sort_by_cpu_load(void *void1, void *void2);
 static int _sort_by_cpus(void *void1, void *void2);
@@ -104,7 +105,7 @@ void sort_sinfo_list(List sinfo_list)
 		if ((i > 0) && (params.sort[i-1] == '#'))
 			part_order = true;
 
-		if      (params.sort[i] == 'a')
+		if (params.sort[i] == 'a')
 			list_sort(sinfo_list, _sort_by_avail);
 		else if (params.sort[i] == 'A')
 			list_sort(sinfo_list, _sort_by_nodes_ai);
@@ -168,12 +169,22 @@ void sort_sinfo_list(List sinfo_list)
 /*****************************************************************************
  * Local Sort Functions
  *****************************************************************************/
+
+static void
+_get_sinfo_from_void(sinfo_data_t **s1, sinfo_data_t **s2, void *v1, void *v2)
+{
+	*s1 = *(sinfo_data_t **) v1;
+	*s2 = *(sinfo_data_t **) v2;
+}
+
 static int _sort_by_avail(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
 	int val1 = 0, val2 = 0;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->state_up;
@@ -189,8 +200,10 @@ static int _sort_by_avail(void *void1, void *void2)
 static int _sort_by_cpu_load(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_cpu_load - sinfo2->min_cpu_load;
 
@@ -202,8 +215,10 @@ static int _sort_by_cpu_load(void *void1, void *void2)
 static int _sort_by_cpus(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_cpus - sinfo2->min_cpus;
 
@@ -215,8 +230,10 @@ static int _sort_by_cpus(void *void1, void *void2)
 static int _sort_by_sct(void *void1, void *void2)
 {
 	int diffs, diffc, difft;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diffs = sinfo1->min_sockets - sinfo2->min_sockets;
 	diffc = sinfo1->min_cores - sinfo2->min_cores;
@@ -238,8 +255,10 @@ static int _sort_by_sct(void *void1, void *void2)
 static int _sort_by_sockets(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_sockets - sinfo2->min_sockets;
 
@@ -251,8 +270,10 @@ static int _sort_by_sockets(void *void1, void *void2)
 static int _sort_by_cores(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_cores - sinfo2->min_cores;
 
@@ -264,8 +285,10 @@ static int _sort_by_cores(void *void1, void *void2)
 static int _sort_by_threads(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_threads - sinfo2->min_threads;
 
@@ -277,8 +300,10 @@ static int _sort_by_threads(void *void1, void *void2)
 static int _sort_by_disk(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_disk - sinfo2->min_disk;
 
@@ -290,10 +315,12 @@ static int _sort_by_disk(void *void1, void *void2)
 static int _sort_by_features(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1 = "", *val2 = "";
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->features)
 		val1 = sinfo1->features;
 	if (sinfo2->features)
@@ -308,10 +335,12 @@ static int _sort_by_features(void *void1, void *void2)
 static int _sort_by_groups(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1 = "", *val2 = "";
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info && sinfo1->part_info->allow_groups)
 		val1 = sinfo1->part_info->allow_groups;
 	if (sinfo2->part_info && sinfo2->part_info->allow_groups)
@@ -326,13 +355,15 @@ static int _sort_by_groups(void *void1, void *void2)
 static int _sort_by_node_addr(void *void1, void *void2)
 {
 	int diff = 0;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1, *val2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	val1 = hostlist_shift(sinfo1->node_addr);
 	if (val1) {
 		hostlist_push_host(sinfo1->node_addr, val1);
@@ -381,13 +412,15 @@ static int _sort_by_node_addr(void *void1, void *void2)
 static int _sort_by_hostnames(void *void1, void *void2)
 {
 	int diff = 0;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1, *val2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	val1 = hostlist_shift(sinfo1->hostnames);
 	if (val1) {
 		hostlist_push_host(sinfo1->hostnames, val1);
@@ -436,10 +469,12 @@ static int _sort_by_hostnames(void *void1, void *void2)
 static int _sort_by_job_size(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	uint32_t val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info) {
 		val1 = sinfo1->part_info->max_nodes;
 		if (val1 != INFINITE)
@@ -460,10 +495,12 @@ static int _sort_by_job_size(void *void1, void *void2)
 static int _sort_by_max_time(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	uint32_t val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->max_time;
 	if (sinfo2->part_info)
@@ -478,8 +515,10 @@ static int _sort_by_max_time(void *void1, void *void2)
 static int _sort_by_memory(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_mem - sinfo2->min_mem;
 
@@ -491,13 +530,15 @@ static int _sort_by_memory(void *void1, void *void2)
 static int _sort_by_node_list(void *void1, void *void2)
 {
 	int diff = 0;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1, *val2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	val1 = hostlist_shift(sinfo1->nodes);
 	if (val1) {
 		hostlist_push_host(sinfo1->nodes, val1);
@@ -546,8 +587,10 @@ static int _sort_by_node_list(void *void1, void *void2)
 static int _sort_by_nodes_ai(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->nodes_alloc - sinfo2->nodes_alloc;
 
@@ -559,8 +602,10 @@ static int _sort_by_nodes_ai(void *void1, void *void2)
 static int _sort_by_nodes(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->nodes_total - sinfo2->nodes_total;
 
@@ -572,10 +617,12 @@ static int _sort_by_nodes(void *void1, void *void2)
 static int _sort_by_partition(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1 = "", *val2 = "";
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (part_order) {
 		diff = (int)sinfo1->part_inx - (int)sinfo2->part_inx;
 	} else {
@@ -594,10 +641,12 @@ static int _sort_by_partition(void *void1, void *void2)
 static int _sort_by_reason(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *val1 = "", *val2 = "";
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->reason)
 		val1 = sinfo1->reason;
 	if (sinfo2->reason)
@@ -617,10 +666,12 @@ static int _sort_by_reason(void *void1, void *void2)
 static int _sort_by_reason_time(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	char *tmp, *val1 = "", *val2 = "";
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->reason) {
 		tmp = strrchr(sinfo1->reason, '@');
 		if (tmp)
@@ -645,10 +696,12 @@ static int _sort_by_reason_time(void *void1, void *void2)
 static int _sort_by_root(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	int val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->flags & PART_FLAG_ROOT_ONLY;
 	if (sinfo2->part_info)
@@ -663,10 +716,12 @@ static int _sort_by_root(void *void1, void *void2)
 static int _sort_by_share(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	int val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->max_share;
 	if (sinfo2->part_info)
@@ -681,10 +736,12 @@ static int _sort_by_share(void *void1, void *void2)
 static int _sort_by_preempt_mode(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	int val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->preempt_mode;
 	if (sinfo2->part_info)
@@ -699,10 +756,12 @@ static int _sort_by_preempt_mode(void *void1, void *void2)
 static int _sort_by_priority(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
 	int val1 = 0, val2 = 0;
 
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
+
 	if (sinfo1->part_info)
 		val1 = sinfo1->part_info->priority;
 	if (sinfo2->part_info)
@@ -717,8 +776,10 @@ static int _sort_by_priority(void *void1, void *void2)
 static int _sort_by_state(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = (int)sinfo1->node_state - (int)sinfo2->node_state;
 
@@ -731,8 +792,10 @@ static int _sort_by_state(void *void1, void *void2)
 static int _sort_by_weight(void *void1, void *void2)
 {
 	int diff;
-	sinfo_data_t *sinfo1 = (sinfo_data_t *) void1;
-	sinfo_data_t *sinfo2 = (sinfo_data_t *) void2;
+	sinfo_data_t *sinfo1;
+	sinfo_data_t *sinfo2;
+
+	_get_sinfo_from_void(&sinfo1, &sinfo2, void1, void2);
 
 	diff = sinfo1->min_weight - sinfo2->min_weight;
 
diff --git a/src/slurmctld/gang.c b/src/slurmctld/gang.c
index 006f70333a3..fcf6322671c 100644
--- a/src/slurmctld/gang.c
+++ b/src/slurmctld/gang.c
@@ -667,7 +667,7 @@ static void _preempt_job_dequeue(void)
 				      "requeued: %s",
 				      job_ptr->job_id, slurm_strerror(rc));
 		}
-		
+
 		if (rc != SLURM_SUCCESS) {
 			rc = job_signal(job_ptr->job_id, SIGKILL, 0, 0, true);
 			if (rc == SLURM_SUCCESS)
@@ -687,8 +687,17 @@ static void _preempt_job_dequeue(void)
  *	descending order rather than ascending order */
 static int _sort_partitions(void *part1, void *part2)
 {
-	int prio1 = ((struct gs_part *) part1)->priority;
-	int prio2 = ((struct gs_part *) part2)->priority;
+	struct gs_part *g1;
+	struct gs_part *g2;
+	int prio1;
+	int prio2;
+
+	g1 = *(struct gs_part **)part1;
+	g2 = *(struct gs_part **)part2;
+
+	prio1 = g1->priority;
+	prio2 = g2->priority;
+
 	return prio2 - prio1;
 }
 
diff --git a/src/slurmctld/job_scheduler.c b/src/slurmctld/job_scheduler.c
index 4f93a460e1e..f5837ce01f5 100644
--- a/src/slurmctld/job_scheduler.c
+++ b/src/slurmctld/job_scheduler.c
@@ -822,7 +822,7 @@ next_part:			part_ptr = (struct part_record *)
 			}
 		} else {
 			job_queue_rec = list_pop_bottom(job_queue,
-							sort_job_queue2);
+			                                sort_job_queue2);
 			if (!job_queue_rec)
 				break;
 			job_ptr  = job_queue_rec->job_ptr;
@@ -1085,7 +1085,7 @@ next_part:			part_ptr = (struct part_record *)
 }
 
 /*
- * sort_job_queue - sort job_queue in decending priority order
+ * sort_job_queue - sort job_queue in descending priority order
  * IN/OUT job_queue - sorted job queue
  */
 extern void sort_job_queue(List job_queue)
@@ -1097,8 +1097,8 @@ extern void sort_job_queue(List job_queue)
  *	in order of decreasing priority */
 extern int sort_job_queue2(void *x, void *y)
 {
-	job_queue_rec_t *job_rec1 = (job_queue_rec_t *) x;
-	job_queue_rec_t *job_rec2 = (job_queue_rec_t *) y;
+	job_queue_rec_t *job_rec1 = *(job_queue_rec_t **) x;
+	job_queue_rec_t *job_rec2 = *(job_queue_rec_t **) y;
 	bool has_resv1, has_resv2;
 	static time_t config_update = 0;
 	static bool preemption_enabled = true;
diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c
index a7dc02cde3e..2f6df24b8da 100644
--- a/src/slurmctld/node_mgr.c
+++ b/src/slurmctld/node_mgr.c
@@ -583,8 +583,15 @@ unpack_error:
 int list_compare_config (void *config_entry1, void *config_entry2)
 {
 	int weight1, weight2;
-	weight1 = ((struct config_record *) config_entry1)->weight;
-	weight2 = ((struct config_record *) config_entry2)->weight;
+	struct config_record *c1;
+	struct config_record *c2;
+
+	c1 = *(struct config_record **)config_entry1;
+	c2 = *(struct config_record **)config_entry2;
+
+	weight1 = c1->weight;
+	weight2 = c2->weight;
+
 	return (weight1 - weight2);
 }
 
diff --git a/src/squeue/sort.c b/src/squeue/sort.c
index eed201241c0..ade1e435599 100644
--- a/src/squeue/sort.c
+++ b/src/squeue/sort.c
@@ -51,6 +51,8 @@
 
 static bool reverse_order;
 
+static void _get_job_info_from_void(job_info_t **j1, job_info_t **j2, void *v1, void *v2);
+static void _get_step_info_from_void(job_step_info_t **j1, job_step_info_t **j2, void *v1, void *v2);
 static int _sort_job_by_batch_host(void *void1, void *void2);
 static int _sort_job_by_gres(void *void1, void *void2);
 static int _sort_job_by_group_id(void *void1, void *void2);
@@ -111,7 +113,7 @@ void sort_job_list(List job_list)
 		if ((i > 0) && (params.sort[i-1] == '-'))
 			reverse_order = true;
 
-		if      (params.sort[i] == 'B')
+		if (params.sort[i] == 'B')
 			list_sort(job_list, _sort_job_by_batch_host);
 		else if (params.sort[i] == 'b')
 			list_sort(job_list, _sort_job_by_gres);
@@ -229,13 +231,25 @@ void sort_step_list(List step_list)
 /*****************************************************************************
  * Local Job Sort Functions
  *****************************************************************************/
+static void _get_job_info_from_void(job_info_t **j1, job_info_t **j2, void *v1, void *v2)
+{
+	*j1 = *(job_info_t **)v1;
+	*j2 = *(job_info_t **)v2;
+}
+static void _get_step_info_from_void(job_step_info_t **s1, job_step_info_t **s2, void *v1, void *v2)
+{
+	*s1 = *(job_step_info_t **)v1;
+	*s2 = *(job_step_info_t **)v2;
+}
 static int _sort_job_by_batch_host(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *val1 = "", *val2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if (job1->batch_host)
 		val1 = job1->batch_host;
 	if (job2->batch_host)
@@ -250,10 +264,12 @@ static int _sort_job_by_batch_host(void *void1, void *void2)
 static int _sort_job_by_gres(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *val1 = "", *val2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if (job1->gres)
 		val1 = job1->gres;
 	if (job2->gres)
@@ -268,8 +284,10 @@ static int _sort_job_by_gres(void *void1, void *void2)
 static int _sort_job_by_group_id(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->group_id - job2->group_id;
 
@@ -281,11 +299,13 @@ static int _sort_job_by_group_id(void *void1, void *void2)
 static int _sort_job_by_group_name(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	struct group *group_info = NULL;
 	char *name1 = "", *name2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if ((group_info = getgrgid((gid_t) job1->group_id)))
 		name1 = group_info->gr_name;
 	if ((group_info = getgrgid((gid_t) job2->group_id)))
@@ -300,8 +320,10 @@ static int _sort_job_by_group_name(void *void1, void *void2)
 static int _sort_job_by_id(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->job_id - job2->job_id;
 
@@ -313,10 +335,12 @@ static int _sort_job_by_id(void *void1, void *void2)
 static int _sort_job_by_name(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *val1 = "", *val2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if (job1->name)
 		val1 = job1->name;
 	if (job2->name)
@@ -331,14 +355,16 @@ static int _sort_job_by_name(void *void1, void *void2)
 static int _sort_job_by_node_list(void *void1, void *void2)
 {
 	int diff = 0;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	hostlist_t hostlist1, hostlist2;
 	char *val1, *val2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	hostlist1 = hostlist_create(job1->nodes);
 	hostlist_sort(hostlist1);
 	val1 = hostlist_shift(hostlist1);
@@ -386,8 +412,10 @@ static int _sort_job_by_node_list(void *void1, void *void2)
 static int _sort_job_by_num_nodes(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->num_nodes - job2->num_nodes;
 
@@ -399,8 +427,10 @@ static int _sort_job_by_num_nodes(void *void1, void *void2)
 static int _sort_job_by_num_cpus(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->num_cpus - job2->num_cpus;
 
@@ -412,8 +442,10 @@ static int _sort_job_by_num_cpus(void *void1, void *void2)
 static int _sort_job_by_num_sct(void *void1, void *void2)
 {
 	int diffs, diffc, difft;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diffs = job1->sockets_per_node - job2->sockets_per_node;
 	diffc = job1->cores_per_socket - job2->cores_per_socket;
@@ -435,8 +467,10 @@ static int _sort_job_by_num_sct(void *void1, void *void2)
 static int _sort_job_by_sockets(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->sockets_per_node - job2->sockets_per_node;
 
@@ -448,8 +482,10 @@ static int _sort_job_by_sockets(void *void1, void *void2)
 static int _sort_job_by_cores(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->cores_per_socket - job2->cores_per_socket;
 
@@ -461,8 +497,10 @@ static int _sort_job_by_cores(void *void1, void *void2)
 static int _sort_job_by_threads(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->threads_per_core - job2->threads_per_core;
 
@@ -474,8 +512,10 @@ static int _sort_job_by_threads(void *void1, void *void2)
 static int _sort_job_by_min_memory(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	job1->pn_min_memory &= (~MEM_PER_CPU);
 	job2->pn_min_memory &= (~MEM_PER_CPU);
@@ -489,8 +529,10 @@ static int _sort_job_by_min_memory(void *void1, void *void2)
 static int _sort_job_by_min_tmp_disk(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->pn_min_tmp_disk - job2->pn_min_tmp_disk;
 
@@ -502,8 +544,10 @@ static int _sort_job_by_min_tmp_disk(void *void1, void *void2)
 static int _sort_job_by_state(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = strcmp(job_state_string(job1->job_state),
 			 job_state_string(job2->job_state));
@@ -516,11 +560,13 @@ static int _sort_job_by_state(void *void1, void *void2)
 static int _sort_job_by_state_compact(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = strcmp(job_state_string_compact(job1->job_state),
-			 job_state_string_compact(job2->job_state));
+	              job_state_string_compact(job2->job_state));
 
 	if (reverse_order)
 		diff = -diff;
@@ -530,8 +576,10 @@ static int _sort_job_by_state_compact(void *void1, void *void2)
 static int _sort_job_by_time_end(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->end_time - job2->end_time;
 
@@ -543,10 +591,12 @@ static int _sort_job_by_time_end(void *void1, void *void2)
 static int _sort_job_by_time_left(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	time_t time1, time2;
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if ((job1->time_limit == INFINITE) || (job1->time_limit == NO_VAL))
 		time1 = INFINITE;
 	else
@@ -570,8 +620,10 @@ static int _sort_job_by_time_left(void *void1, void *void2)
 static int _sort_job_by_time_limit(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	if (job1->time_limit > job2->time_limit)
 		diff = 1;
@@ -597,10 +649,12 @@ static uint32_t _get_start_time(job_info_t *job)
 static int _sort_job_by_time_start(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	uint32_t start_time1, start_time2;
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	start_time1 = _get_start_time(job1);
 	start_time2 = _get_start_time(job2);
 
@@ -619,10 +673,12 @@ static int _sort_job_by_time_start(void *void1, void *void2)
 static int _sort_job_by_time_used(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	long time1, time2;
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	time1 = job_time_used(job1);
 	time2 = job_time_used(job2);
 	diff = time1 - time2;
@@ -635,10 +691,12 @@ static int _sort_job_by_time_used(void *void1, void *void2)
 static int _sort_job_by_partition(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *val1 = "", *val2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if (job1->partition)
 		val1 = job1->partition;
 	if (job2->partition)
@@ -653,8 +711,10 @@ static int _sort_job_by_partition(void *void1, void *void2)
 static int _sort_job_by_priority(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->priority - job2->priority;
 
@@ -666,8 +726,10 @@ static int _sort_job_by_priority(void *void1, void *void2)
 static int _sort_job_by_user_id(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
+
+	_get_job_info_from_void(&job1, &job2, void1, void2);
 
 	diff = job1->user_id - job2->user_id;
 
@@ -679,10 +741,12 @@ static int _sort_job_by_user_id(void *void1, void *void2)
 static int _sort_job_by_user_name(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *name1, *name2;
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	name1 = uid_to_string((uid_t) job1->user_id);
 	name2 = uid_to_string((uid_t) job2->user_id);
 	diff = strcmp(name1, name2);
@@ -697,10 +761,12 @@ static int _sort_job_by_user_name(void *void1, void *void2)
 static int _sort_job_by_reservation(void *void1, void *void2)
 {
 	int diff;
-	job_info_t *job1 = (job_info_t *) void1;
-	job_info_t *job2 = (job_info_t *) void2;
+	job_info_t *job1;
+	job_info_t *job2;
 	char *val1 = "", *val2 = "";
 
+	_get_job_info_from_void(&job1, &job2, void1, void2);
+
 	if (job1->resv_name)
 		val1 = job1->resv_name;
 	if (job2->resv_name)
@@ -718,10 +784,12 @@ static int _sort_job_by_reservation(void *void1, void *void2)
 static int _sort_step_by_gres(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
 	char *val1 = "", *val2 = "";
 
+	_get_step_info_from_void(&step1, &step2, void1, void2);
+
 	if (step1->gres)
 		val1 = step1->gres;
 	if (step2->gres)
@@ -736,8 +804,10 @@ static int _sort_step_by_gres(void *void1, void *void2)
 static int _sort_step_by_id(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
+
+	_get_step_info_from_void(&step1, &step2, void1, void2);
 
 	diff = step1->job_id - step2->job_id;
 	if (diff == 0)
@@ -751,8 +821,8 @@ static int _sort_step_by_id(void *void1, void *void2)
 static int _sort_step_by_node_list(void *void1, void *void2)
 {
 	int diff = 0;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
 
 	hostlist_t hostlist1, hostlist2;
 	char *val1, *val2;
@@ -760,6 +830,8 @@ static int _sort_step_by_node_list(void *void1, void *void2)
 	int inx;
 #endif
 
+	_get_step_info_from_void(&step1, &step2, void1, void2);
+
 	hostlist1 = hostlist_create(step1->nodes);
 	hostlist_sort(hostlist1);
 	val1 = hostlist_shift(hostlist1);
@@ -807,10 +879,12 @@ static int _sort_step_by_node_list(void *void1, void *void2)
 static int _sort_step_by_partition(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
 	char *val1 = "", *val2 = "";
 
+	_get_step_info_from_void(&step1, &step2, void1, void2);
+
 	if (step1->partition)
 		val1 = step1->partition;
 	if (step2->partition)
@@ -825,8 +899,10 @@ static int _sort_step_by_partition(void *void1, void *void2)
 static int _sort_step_by_time_limit(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
+
+	_get_step_info_from_void(&step1, &step2, void1, void2);
 
 	diff = step1->time_limit - step2->time_limit;
 
@@ -838,8 +914,10 @@ static int _sort_step_by_time_limit(void *void1, void *void2)
 static int _sort_step_by_time_start(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
+
+	_get_step_info_from_void(&step1, &step2, void1, void2);
 
 	diff = step1->start_time - step2->start_time;
 
@@ -851,10 +929,12 @@ static int _sort_step_by_time_start(void *void1, void *void2)
 static int _sort_step_by_time_used(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
 	time_t used1, used2;
 
+	_get_step_info_from_void(&step1, &step2, void1, void2);
+
 	used1 = difftime(now, step1->start_time);
 	used2 = difftime(now, step2->start_time);
 	diff = used1 - used2;
@@ -867,8 +947,10 @@ static int _sort_step_by_time_used(void *void1, void *void2)
 static int _sort_step_by_user_id(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
+
+	_get_step_info_from_void(&step1, &step2, void1, void2);
 
 	diff = step1->user_id - step2->user_id;
 
@@ -880,10 +962,12 @@ static int _sort_step_by_user_id(void *void1, void *void2)
 static int _sort_step_by_user_name(void *void1, void *void2)
 {
 	int diff;
-	job_step_info_t *step1 = (job_step_info_t *) void1;
-	job_step_info_t *step2 = (job_step_info_t *) void2;
+	job_step_info_t *step1;
+	job_step_info_t *step2;
 	char *name1, *name2;
 
+	_get_step_info_from_void(&step1, &step2, void1, void2);
+
 	name1 = uid_to_string((uid_t) step1->user_id);
 	name2 = uid_to_string((uid_t) step2->user_id);
 	diff = strcmp(name1, name2);
diff --git a/src/sreport/common.c b/src/sreport/common.c
index 6507494fabe..b02de5d3d07 100644
--- a/src/sreport/common.c
+++ b/src/sreport/common.c
@@ -232,10 +232,15 @@ extern void addto_char_list(List char_list, char *names)
  * returns: 1: user_a > user_b   0: user_a == user_b   -1: user_a < user_b
  *
  */
-extern int sort_user_dec(slurmdb_report_user_rec_t *user_a,
-			 slurmdb_report_user_rec_t *user_b)
+extern int sort_user_dec(void *v1, void *v2)
 {
-	int diff = 0;
+	slurmdb_report_user_rec_t *user_a;
+	slurmdb_report_user_rec_t *user_b;
+	int diff;
+
+	diff = 0;
+	user_a = *(slurmdb_report_user_rec_t **)v1;
+	user_b = *(slurmdb_report_user_rec_t **)v2;
 
 	if (sort_flag == SLURMDB_REPORT_SORT_TIME) {
 		if (user_a->cpu_secs > user_b->cpu_secs)
@@ -255,6 +260,7 @@ extern int sort_user_dec(slurmdb_report_user_rec_t *user_a,
 		return -1;
 
 	return 0;
+
 }
 
 /*
@@ -265,10 +271,14 @@ extern int sort_user_dec(slurmdb_report_user_rec_t *user_a,
  *           -1: cluster_a < cluster_b
  *
  */
-extern int sort_cluster_dec(slurmdb_report_cluster_rec_t *cluster_a,
-			    slurmdb_report_cluster_rec_t *cluster_b)
+extern int sort_cluster_dec(void *v1, void *v2)
 {
 	int diff = 0;
+	slurmdb_report_cluster_rec_t *cluster_a;
+	slurmdb_report_cluster_rec_t *cluster_b;
+
+	cluster_a = *(slurmdb_report_cluster_rec_t **)v1;
+	cluster_b = *(slurmdb_report_cluster_rec_t **)v2;
 
 	if (!cluster_a->name || !cluster_b->name)
 		return 0;
@@ -293,10 +303,14 @@ extern int sort_cluster_dec(slurmdb_report_cluster_rec_t *cluster_a,
  *           1: assoc_a < assoc_b
  *
  */
-extern int sort_assoc_dec(slurmdb_report_assoc_rec_t *assoc_a,
-			  slurmdb_report_assoc_rec_t *assoc_b)
+extern int sort_assoc_dec(void *v1, void *v2)
 {
 	int diff = 0;
+	slurmdb_report_assoc_rec_t *assoc_a;
+	slurmdb_report_assoc_rec_t *assoc_b;
+
+	assoc_a = *(slurmdb_report_assoc_rec_t **)v1;
+	assoc_b = *(slurmdb_report_assoc_rec_t **)v2;
 
 	if (!assoc_a->acct || !assoc_b->acct)
 		return 0;
@@ -330,10 +344,14 @@ extern int sort_assoc_dec(slurmdb_report_assoc_rec_t *assoc_a,
  * returns: 1: resv_a > resv_b   0: resv_a == resv_b   -1: resv_a < resv_b
  *
  */
-extern int sort_reservations_dec(slurmdb_reservation_rec_t *resv_a,
-				 slurmdb_reservation_rec_t *resv_b)
+extern int sort_reservations_dec(void *v1, void *v2)
 {
 	int diff = 0;
+	slurmdb_reservation_rec_t *resv_a;
+	slurmdb_reservation_rec_t *resv_b;
+
+	resv_a = *(slurmdb_reservation_rec_t **)v1;
+	resv_b = *(slurmdb_reservation_rec_t **)v2;
 
 	if (!resv_a->cluster || !resv_b->cluster)
 		return 0;
diff --git a/src/sreport/job_reports.c b/src/sreport/job_reports.c
index 46455200b13..cae78bfd3d6 100644
--- a/src/sreport/job_reports.c
+++ b/src/sreport/job_reports.c
@@ -67,11 +67,14 @@ static bool individual_grouping = 0;
  *           -1: cluster_a < cluster_b
  *
  */
-static int _sort_cluster_grouping_dec(
-	slurmdb_report_cluster_grouping_t *cluster_a,
-	slurmdb_report_cluster_grouping_t *cluster_b)
+static int _sort_cluster_grouping_dec(void *v1, void *v2)
 {
 	int diff = 0;
+	slurmdb_report_cluster_grouping_t *cluster_a;
+	slurmdb_report_cluster_grouping_t *cluster_b;
+
+	cluster_a = *(slurmdb_report_cluster_grouping_t **)v1;
+	cluster_b = *(slurmdb_report_cluster_grouping_t **)v2;
 
 	if (!cluster_a->cluster || !cluster_b->cluster)
 		return 0;
@@ -94,14 +97,17 @@ static int _sort_cluster_grouping_dec(
  *           -1: acct_a < acct_b
  *
  */
-static int _sort_acct_grouping_dec(slurmdb_report_acct_grouping_t *acct_a,
-				   slurmdb_report_acct_grouping_t *acct_b)
+static int _sort_acct_grouping_dec(void *v1, void *v2)
 {
 	int diff = 0;
-
 	char tmp_acct_a[200];
 	char tmp_acct_b[200];
 	char *wckey_a = NULL, *wckey_b = NULL;
+	slurmdb_report_acct_grouping_t *acct_a;
+	slurmdb_report_acct_grouping_t *acct_b;
+
+	acct_a = *(slurmdb_report_acct_grouping_t **)v1;
+	acct_b = *(slurmdb_report_acct_grouping_t **)v2;
 
 	if (!acct_a->acct || !acct_b->acct)
 		return 0;
@@ -679,12 +685,12 @@ extern int job_sizes_grouped_by_top_acct(int argc, char *argv[])
 	itr = list_iterator_create(print_fields_list);
 	itr2 = list_iterator_create(grouping_print_fields_list);
 	list_sort(slurmdb_report_cluster_grouping_list,
-		  (ListCmpF)_sort_cluster_grouping_dec);
+	          (ListCmpF)_sort_cluster_grouping_dec);
 	cluster_itr =
 		list_iterator_create(slurmdb_report_cluster_grouping_list);
 	while((cluster_group = list_next(cluster_itr))) {
 		list_sort(cluster_group->acct_list,
-			  (ListCmpF)_sort_acct_grouping_dec);
+		          (ListCmpF)_sort_acct_grouping_dec);
 		acct_itr = list_iterator_create(cluster_group->acct_list);
 		while((acct_group = list_next(acct_itr))) {
 
@@ -887,12 +893,12 @@ extern int job_sizes_grouped_by_wckey(int argc, char *argv[])
 	itr = list_iterator_create(print_fields_list);
 	itr2 = list_iterator_create(grouping_print_fields_list);
 	list_sort(slurmdb_report_cluster_grouping_list,
-		  (ListCmpF)_sort_cluster_grouping_dec);
+	          (ListCmpF)_sort_cluster_grouping_dec);
 	cluster_itr = list_iterator_create(
 		slurmdb_report_cluster_grouping_list);
 	while((cluster_group = list_next(cluster_itr))) {
 		list_sort(cluster_group->acct_list,
-			  (ListCmpF)_sort_acct_grouping_dec);
+		          (ListCmpF)_sort_acct_grouping_dec);
 		acct_itr = list_iterator_create(cluster_group->acct_list);
 		while((acct_group = list_next(acct_itr))) {
 
diff --git a/src/sreport/sreport.h b/src/sreport/sreport.h
index 51bb1ad0a58..d2ec5a45384 100644
--- a/src/sreport/sreport.h
+++ b/src/sreport/sreport.h
@@ -104,14 +104,10 @@ extern void slurmdb_report_print_time(print_field_t *field,
 			       uint64_t value, uint64_t total_time, int last);
 extern int parse_option_end(char *option);
 extern char *strip_quotes(char *option, int *increased);
-extern int sort_user_dec(slurmdb_report_user_rec_t *user_a,
-			 slurmdb_report_user_rec_t *user_b);
-extern int sort_cluster_dec(slurmdb_report_cluster_rec_t *cluster_a,
-			    slurmdb_report_cluster_rec_t *cluster_b);
-extern int sort_assoc_dec(slurmdb_report_assoc_rec_t *assoc_a,
-			  slurmdb_report_assoc_rec_t *assoc_b);
-extern int sort_reservations_dec(slurmdb_reservation_rec_t *resv_a,
-				 slurmdb_reservation_rec_t *resv_b);
+extern int sort_user_dec(void *, void *);
+extern int sort_cluster_dec(void *, void *);
+extern int sort_assoc_dec(void *, void *);
+extern int sort_reservations_dec(void *, void *);
 
 extern int get_uint(char *in_value, uint32_t *out_value, char *type);
 
diff --git a/src/sview/block_info.c b/src/sview/block_info.c
index af63b7106d9..cb85533f3b1 100644
--- a/src/sview/block_info.c
+++ b/src/sview/block_info.c
@@ -504,11 +504,15 @@ static void _update_info_block(List block_list,
 	last_model = model;
 }
 
-static int _sview_block_sort_aval_dec(sview_block_info_t* rec_a,
-				      sview_block_info_t* rec_b)
+static int _sview_block_sort_aval_dec(void *s1, void *s2)
 {
-	int size_a = rec_a->cnode_cnt;
-	int size_b = rec_b->cnode_cnt;
+	sview_block_info_t *rec_a = *(sview_block_info_t **)s1;
+	sview_block_info_t *rec_b = *(sview_block_info_t **)s2;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->cnode_cnt;
+	size_b = rec_b->cnode_cnt;
 
 	if (list_count(rec_a->job_list) < list_count(rec_b->job_list))
 		return 1;
diff --git a/src/sview/grid.c b/src/sview/grid.c
index 1a5dc175724..6a755b347ee 100644
--- a/src/sview/grid.c
+++ b/src/sview/grid.c
@@ -198,10 +198,15 @@ static void _add_button_signals(grid_button_t *grid_button)
  *           1: rec_a < rec_b
  *
  */
-static int _sort_button_inx(grid_button_t *button_a, grid_button_t *button_b)
+static int _sort_button_inx(void *b1, void *b2)
 {
-	int inx_a = button_a->inx;
-	int inx_b = button_b->inx;
+	grid_button_t *button_a = *(grid_button_t **)b1;
+	grid_button_t *button_b = *(grid_button_t **)b2;
+	int inx_a;
+	int inx_b;
+
+	inx_a = button_a->inx;
+	inx_b = button_b->inx;
 
 	if (inx_a < inx_b)
 		return -1;
diff --git a/src/sview/job_info.c b/src/sview/job_info.c
index b28540b6f93..23ff1f544d8 100644
--- a/src/sview/job_info.c
+++ b/src/sview/job_info.c
@@ -2610,11 +2610,15 @@ static void _update_info_job(List info_list,
 	return;
 }
 
-static int _sview_job_sort_aval_dec(sview_job_info_t* rec_a,
-				    sview_job_info_t* rec_b)
+static int _sview_job_sort_aval_dec(void *s1, void *s2)
 {
-	int size_a = rec_a->node_cnt;
-	int size_b = rec_b->node_cnt;
+	sview_job_info_t* rec_a = *(sview_job_info_t **)s1;
+	sview_job_info_t* rec_b = *(sview_job_info_t **)s2;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->node_cnt;
+	size_b = rec_b->node_cnt;
 
 	if (size_a < size_b)
 		return -1;
diff --git a/src/sview/part_info.c b/src/sview/part_info.c
index 5c541e4770a..2a71fa9ec23 100644
--- a/src/sview/part_info.c
+++ b/src/sview/part_info.c
@@ -1656,11 +1656,15 @@ static int _insert_sview_part_sub(sview_part_info_t *sview_part_info,
 	return SLURM_SUCCESS;
 }
 
-static int _sview_part_sort_aval_dec(sview_part_info_t* rec_a,
-				     sview_part_info_t* rec_b)
+static int _sview_part_sort_aval_dec(void *a, void *b)
 {
-	int size_a = rec_a->part_ptr->total_nodes;
-	int size_b = rec_b->part_ptr->total_nodes;
+	sview_part_info_t *rec_a = *(sview_part_info_t **)a;
+	sview_part_info_t *rec_b = *(sview_part_info_t **)b;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->part_ptr->total_nodes;
+	size_b = rec_b->part_ptr->total_nodes;
 
 	if (size_a < size_b)
 		return -1;
@@ -1677,11 +1681,15 @@ static int _sview_part_sort_aval_dec(sview_part_info_t* rec_a,
 	return 0;
 }
 
-static int _sview_sub_part_sort(sview_part_sub_t* rec_a,
-				sview_part_sub_t* rec_b)
+static int _sview_sub_part_sort(void *a, void *b)
 {
-	int size_a = rec_a->node_state & NODE_STATE_BASE;
-	int size_b = rec_b->node_state & NODE_STATE_BASE;
+	sview_part_sub_t *rec_a = *(sview_part_sub_t **)a;
+	sview_part_sub_t *rec_b = *(sview_part_sub_t **)b;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->node_state & NODE_STATE_BASE;
+	size_b = rec_b->node_state & NODE_STATE_BASE;
 
 	if (size_a < size_b)
 		return -1;
diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c
index 31a86f84fbf..0e2b116a510 100644
--- a/src/sview/resv_info.c
+++ b/src/sview/resv_info.c
@@ -713,11 +713,15 @@ static void _update_info_resv(List info_list,
 	last_model = model;
 }
 
-static int _sview_resv_sort_aval_dec(sview_resv_info_t* rec_a,
-				     sview_resv_info_t* rec_b)
+static int _sview_resv_sort_aval_dec(void *s1, void *s2)
 {
-	int size_a = rec_a->resv_ptr->node_cnt;
-	int size_b = rec_b->resv_ptr->node_cnt;
+	sview_resv_info_t *rec_a = *(sview_resv_info_t **)s1;
+	sview_resv_info_t *rec_b = *(sview_resv_info_t **)s2;
+	int size_a;
+	int size_b;
+
+	size_a = rec_a->resv_ptr->node_cnt;
+	size_b = rec_b->resv_ptr->node_cnt;
 
 	if (size_a < size_b)
 		return -1;
-- 
GitLab