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

objdb: fix key change notifications

1) don't send notifications if the key is the same.
2) Add key value change notifications to key_inc & key_dec



git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2746 fd59a12c-fef9-0310-b244-a6a79926bd2f
Angus Salkeld 16 лет назад
Родитель
Сommit
805a0f3c1d
1 измененных файлов с 18 добавлено и 3 удалено
  1. 18 3
      exec/objdb.c

+ 18 - 3
exec/objdb.c

@@ -1087,6 +1087,10 @@ static int object_key_increment (
 	}
 
 	hdb_handle_put (&object_instance_database, object_handle);
+	if (res == 0) {
+		object_key_changed_notification (object_handle, key_name, key_len,
+			object_key->value, object_key->value_len, OBJECT_KEY_REPLACED);
+	}
 	objdb_rdunlock();
 	return (res);
 
@@ -1170,6 +1174,10 @@ static int object_key_decrement (
 	}
 
 	hdb_handle_put (&object_instance_database, object_handle);
+	if (res == 0) {
+		object_key_changed_notification (object_handle, key_name, key_len,
+			object_key->value, object_key->value_len, OBJECT_KEY_REPLACED);
+	}
 	objdb_rdunlock();
 	return (res);
 
@@ -1244,6 +1252,7 @@ static int object_key_replace (
 	struct object_key *object_key = NULL;
 	struct list_head *list;
 	int found = 0;
+	int value_changed = 0;
 
 	objdb_rdlock();
 
@@ -1308,8 +1317,14 @@ static int object_key_replace (
 			free(object_key->value);
 			object_key->value = replacement_value;
 		}
-		memcpy(object_key->value, new_value, new_value_len);
-		object_key->value_len = new_value_len;
+		if (memcmp (object_key->value, new_value, new_value_len) == 0) {
+			value_changed = 0;
+		}
+		else {
+			memcpy(object_key->value, new_value, new_value_len);
+			object_key->value_len = new_value_len;
+			value_changed = 1;
+		}
 	}
 	else {
 		ret = -1;
@@ -1317,7 +1332,7 @@ static int object_key_replace (
 	}
 
 	hdb_handle_put (&object_instance_database, object_handle);
-	if (ret == 0) {
+	if (ret == 0 && value_changed) {
 		object_key_changed_notification (object_handle, key_name, key_len,
 			new_value, new_value_len, OBJECT_KEY_REPLACED);
 	}