Просмотр исходного кода

cpg: Move filling of member_list to subfunction

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Jan Friesse 6 лет назад
Родитель
Сommit
3c7f19a02f
1 измененных файлов с 50 добавлено и 36 удалено
  1. 50 36
      exec/cpg.c

+ 50 - 36
exec/cpg.c

@@ -652,26 +652,27 @@ static int notify_lib_totem_membership (
 	return CS_OK;
 }
 
-static int notify_lib_joinlist(
+/*
+ * Helper function for notify_lib_joinlist which prepares member_list using
+ * process_info_list with removed left_list items.
+ * member_list_entries - When not NULL it contains number of member_list entries
+ * member_list - When not NULL it is used as pointer to start of preallocated
+ *               array of members. Pointer is adjusted to the end of array on
+ *               exit.
+ */
+static void notify_lib_joinlist_fill_member_list(
 	const mar_cpg_name_t *group_name,
-	int joined_list_entries,
-	mar_cpg_address_t *joined_list,
 	int left_list_entries,
-	mar_cpg_address_t *left_list,
-	int id)
+	const mar_cpg_address_t *left_list,
+	int *member_list_entries,
+	mar_cpg_address_t **member_list)
 {
-	int size;
-	char *buf;
 	struct qb_list_head *iter;
-	int member_list_entries;
-	struct res_lib_cpg_confchg_callback *res;
-	mar_cpg_address_t *retgi;
 	int i;
 
-	/*
-	 * Find size of member_list (use process_info_list but remove items in left_list)
-	 */
-	member_list_entries = 0;
+	if (member_list_entries != NULL) {
+		*member_list_entries = 0;
+	}
 
 	qb_list_for_each(iter, &process_info_list_head) {
 		struct process_info *pi = qb_list_entry (iter, struct process_info, list);
@@ -687,10 +688,42 @@ static int notify_lib_joinlist(
 			}
 
 			if (!in_left_list) {
-				member_list_entries++;
+				if (member_list_entries != NULL) {
+					(*member_list_entries)++;
+				}
+
+				if (member_list != NULL) {
+					(*member_list)->nodeid = pi->nodeid;
+					(*member_list)->pid = pi->pid;
+					(*member_list)->reason = CPG_REASON_UNDEFINED;
+					(*member_list)++;
+				}
 			}
 		}
 	}
+}
+
+static int notify_lib_joinlist(
+	const mar_cpg_name_t *group_name,
+	int joined_list_entries,
+	mar_cpg_address_t *joined_list,
+	int left_list_entries,
+	mar_cpg_address_t *left_list,
+	int id)
+{
+	int size;
+	char *buf;
+	struct qb_list_head *iter;
+	int member_list_entries;
+	struct res_lib_cpg_confchg_callback *res;
+	mar_cpg_address_t *retgi;
+	int i;
+
+	/*
+	 * Find size of member_list (use process_info_list but remove items in left_list)
+	 */
+	notify_lib_joinlist_fill_member_list(group_name, left_list_entries, left_list,
+	    &member_list_entries, NULL);
 
 	size = sizeof(struct res_lib_cpg_confchg_callback) +
 		sizeof(mar_cpg_address_t) * (member_list_entries + left_list_entries + joined_list_entries);
@@ -711,27 +744,8 @@ static int notify_lib_joinlist(
 	/*
 	 * Fill res->memberlist. Use process_info_list but remove items in left_list.
 	 */
-	qb_list_for_each(iter, &process_info_list_head) {
-		struct process_info *pi = qb_list_entry (iter, struct process_info, list);
-
-		if (mar_name_compare (&pi->group, group_name) == 0) {
-			int in_left_list = 0;
-
-			for (i = 0; i < left_list_entries; i++) {
-				if (left_list[i].nodeid == pi->nodeid && left_list[i].pid == pi->pid) {
-					in_left_list = 1;
-					break ;
-				}
-			}
-
-			if (!in_left_list) {
-				retgi->nodeid = pi->nodeid;
-				retgi->pid = pi->pid;
-				retgi->reason = CPG_REASON_UNDEFINED;
-				retgi++;
-			}
-		}
-	}
+	notify_lib_joinlist_fill_member_list(group_name, left_list_entries, left_list,
+	    NULL, &retgi);
 
 	/*
 	 * Fill res->left_list