Signed-off-by: Steven Dake <sd...@redhat.com>
---
 exec/totemsrp.c |   47 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/exec/totemsrp.c b/exec/totemsrp.c
index 4a299a0..a97ed49 100644
--- a/exec/totemsrp.c
+++ b/exec/totemsrp.c
@@ -1349,6 +1349,35 @@ static void memb_set_and_with_ring_id (
        return;
 }
 
+static void memb_set_and (
+       struct srp_addr *set1,
+       int set1_entries,
+       struct srp_addr *set2,
+       int set2_entries,
+       struct srp_addr *and,
+       int *and_entries)
+{
+       int i;
+       int j;
+       int found = 0;
+
+       *and_entries = 0;
+
+       for (i = 0; i < set2_entries; i++) {
+               for (j = 0; j < set1_entries; j++) {
+                       if (srp_addr_equal (&set1[j], &set2[i])) {
+                               found = 1;
+                               break;
+                       }
+               }
+               if (found) {
+                       srp_addr_copy (&and[*and_entries], &set1[j]);
+                       *and_entries = *and_entries + 1;
+               }
+               found = 0;
+       }
+       return;
+}
 #ifdef CODE_COVERAGE
 static void memb_set_print (
        char *string,
@@ -1718,6 +1747,8 @@ static void memb_state_operational_enter (struct 
totemsrp_instance *instance)
        unsigned int trans_memb_list_totemip[PROCESSOR_COUNT_MAX];
        unsigned int new_memb_list_totemip[PROCESSOR_COUNT_MAX];
        unsigned int left_list[PROCESSOR_COUNT_MAX];
+       struct srp_addr difference_list[PROCESSOR_COUNT_MAX];
+       int difference_list_entries = 0;
        unsigned int i;
        unsigned int res;
 
@@ -1739,14 +1770,20 @@ static void memb_state_operational_enter (struct 
totemsrp_instance *instance)
        /*
         * Calculate joined and left list
         */
-       memb_set_subtract (instance->my_left_memb_list,
-               &instance->my_left_memb_entries,
+       memb_set_subtract (difference_list,
+               &difference_list_entries,
+               instance->my_new_memb_list, instance->my_new_memb_entries,
+               instance->my_memb_list, instance->my_memb_entries);
+
+       memb_set_and (
+               difference_list, difference_list_entries,
                instance->my_memb_list, instance->my_memb_entries,
-               instance->my_trans_memb_list, instance->my_trans_memb_entries);
+               instance->my_left_memb_list, &instance->my_left_memb_entries);
 
-       memb_set_subtract (joined_list, &joined_list_entries,
+       memb_set_and (
+               difference_list, difference_list_entries,
                instance->my_new_memb_list, instance->my_new_memb_entries,
-               instance->my_trans_memb_list, instance->my_trans_memb_entries);
+               joined_list, &joined_list_entries);
 
        /*
         * Install new membership
-- 
1.7.6

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to