Преглед изворни кода

Allow missing spots in the synchronization engine

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1448 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake пре 18 година
родитељ
комит
dcf2bb0137
4 измењених фајлова са 24 додато и 9 уклоњено
  1. 20 6
      exec/main.c
  2. 1 1
      exec/service.c
  3. 1 0
      exec/service.h
  4. 2 2
      exec/sync.c

+ 20 - 6
exec/main.c

@@ -181,15 +181,29 @@ static void openais_sync_completed (void)
 static int openais_sync_callbacks_retrieve (int sync_id,
 	struct sync_callbacks *callbacks)
 {
-	if (ais_service[sync_id] == NULL) {
+	unsigned int ais_service_index;
+	unsigned int ais_services_found = 0;
+	
+	for (ais_service_index = 0;
+		ais_service_index < SERVICE_HANDLER_MAXIMUM_COUNT;
+		ais_service_index++) {
+
+		if (ais_service[ais_service_index] != NULL) {
+			if (ais_services_found == sync_id) {
+				break;
+			}
+			ais_services_found += 1;
+		}
+	}
+	if (ais_service_index == SERVICE_HANDLER_MAXIMUM_COUNT) {
 		memset (callbacks, 0, sizeof (struct sync_callbacks));
 		return (-1);
 	}
-	callbacks->name = ais_service[sync_id]->name;
-	callbacks->sync_init = ais_service[sync_id]->sync_init;
-	callbacks->sync_process = ais_service[sync_id]->sync_process;
-	callbacks->sync_activate = ais_service[sync_id]->sync_activate;
-	callbacks->sync_abort = ais_service[sync_id]->sync_abort;
+	callbacks->name = ais_service[ais_service_index]->name;
+	callbacks->sync_init = ais_service[ais_service_index]->sync_init;
+	callbacks->sync_process = ais_service[ais_service_index]->sync_process;
+	callbacks->sync_activate = ais_service[ais_service_index]->sync_activate;
+	callbacks->sync_abort = ais_service[ais_service_index]->sync_abort;
 	return (0);
 }
 

+ 1 - 1
exec/service.c

@@ -91,7 +91,7 @@ static struct default_service default_services[] = {
 	}
 };
 
-struct openais_service_handler *ais_service[128];
+struct openais_service_handler *ais_service[SERVICE_HANDLER_MAXIMUM_COUNT];
 
 /*
  * Adds a service handler to the object database

+ 1 - 0
exec/service.h

@@ -43,6 +43,7 @@
 #endif
 
 #define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) )
+#define SERVICE_HANDLER_MAXIMUM_COUNT 64
 
 enum openais_flow_control {
 	OPENAIS_FLOW_CONTROL_REQUIRED = 1,

+ 2 - 2
exec/sync.c

@@ -228,9 +228,9 @@ static void sync_callbacks_load (void)
 	int res;
 
 	ENTER("");
-// TODO rewrite this to get rid of the for (;;)
 	for (;;) {
-		res = sync_callbacks_retrieve (sync_recovery_index, &sync_callbacks);
+		res = sync_callbacks_retrieve (sync_recovery_index,
+			&sync_callbacks);
 		/*
 		 * No more service handlers have sync callbacks at this time
 		 */