[Openais] [PATCH 5/7] objdb: fix key change notifications

Steven Dake sdake at redhat.com
Mon Mar 29 22:39:51 PDT 2010


good for commit

On Tue, 2010-03-30 at 13:31 +1100, Angus Salkeld wrote:
> 1) don't send notifications if the key is the same.
> 2) Add key value change notifications to key_inc & key_dec
> 
> Signed-off-by: Angus Salkeld <asalkeld at redhat.com>
> ---
>  exec/objdb.c |   21 ++++++++++++++++++---
>  1 files changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/exec/objdb.c b/exec/objdb.c
> index f8b12e4..e26ff14 100644
> --- a/exec/objdb.c
> +++ b/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);
>  	}



More information about the Openais mailing list