From: short <> Date: Sun, 30 Nov 2003 10:06:09 +0000 (+0000) Subject: +captive_shared_cache_map_memory_range_set_dirty(): Set dirty by buffer address. X-Git-Tag: captive-1_1_1_2~4 X-Git-Url: http://git.jankratochvil.net/?p=captive.git;a=commitdiff_plain;h=3522c07fd5f3d3025126bc5206d141a34774fe33 +captive_shared_cache_map_memory_range_set_dirty(): Set dirty by buffer address. --- diff --git a/src/libcaptive/cc/sharedcachemap.c b/src/libcaptive/cc/sharedcachemap.c index b278008..6f8bfcf 100644 --- a/src/libcaptive/cc/sharedcachemap.c +++ b/src/libcaptive/cc/sharedcachemap.c @@ -540,6 +540,61 @@ CaptiveSharedCacheMapObject_page *page; } } +typedef struct _captive_shared_cache_map_memory_range_set_dirty_param + captive_shared_cache_map_memory_range_set_dirty_param; +struct _captive_shared_cache_map_memory_range_set_dirty_param { + gpointer address_start; + gpointer address_end; + guint64 bytes_set; + }; + +static void captive_shared_cache_map_memory_range_set_dirty_foreach( + CaptiveSharedCacheMapObject *captive_shared_cache_map_object, /* key */ + CaptiveSharedCacheMapObject *captive_shared_cache_map_object_value, /* value */ + captive_shared_cache_map_memory_range_set_dirty_param *param) /* user_data */ +{ +gpointer address_start_local,address_end_local; + + g_return_if_fail(CAPTIVE_SHARED_CACHE_MAP_IS_OBJECT(captive_shared_cache_map_object)); + g_return_if_fail(captive_shared_cache_map_object==captive_shared_cache_map_object_value); + g_return_if_fail(param!=NULL); + + address_start_local=MAX(param->address_start,captive_shared_cache_map_object->buffer); + address_end_local=MIN(param->address_end,captive_shared_cache_map_object->buffer+captive_shared_cache_map_object->AllocationSize); + + if (address_start_local>address_end_local) + return; + + captive_shared_cache_map_set_dirty(captive_shared_cache_map_object, + address_start_local-captive_shared_cache_map_object->buffer, /* start */ + address_end_local -captive_shared_cache_map_object->buffer); /* end */ + + param->bytes_set+=(address_end_local-address_start_local); +} + +guint64 captive_shared_cache_map_memory_range_set_dirty(gpointer address_start,gpointer address_end) +{ +captive_shared_cache_map_memory_range_set_dirty_param set_dirty_param; + + g_return_val_if_fail(address_start!=NULL,0); + g_return_val_if_fail(address_end!=NULL,0); + g_return_val_if_fail(address_start<=address_end,0); + + address_start=CAPTIVE_ROUND_DOWN(address_start,PAGE_SIZE); + address_end=CAPTIVE_ROUND_UP(address_end,PAGE_SIZE); + + CaptiveSharedCacheMapObject_hash_init(); + set_dirty_param.address_start=address_start; + set_dirty_param.address_end=address_end; + set_dirty_param.bytes_set=0; + g_hash_table_foreach( + CaptiveSharedCacheMapObject_hash, /* hash_table */ + (GHFunc)captive_shared_cache_map_memory_range_set_dirty_foreach, /* func */ + &set_dirty_param); /* user_data */ + + return set_dirty_param.bytes_set; +} + gboolean captive_shared_cache_map_is_page_dirty(CaptiveSharedCacheMapObject *captive_shared_cache_map_object, guint64 offset) { @@ -763,6 +818,8 @@ CaptiveSharedCacheMapObject_page *page; lsn_target=page->lsn_newest; } + CaptiveSharedCacheMapObject_hash_init(); + lsn_pages_foreach_param.lsn_target=lsn_target; lsn_pages_foreach_param.lsn_pages_count=0; lsn_pages_foreach_param.lsn_pages_pointer=NULL; /* Not yet filling */ diff --git a/src/libcaptive/cc/sharedcachemap.h b/src/libcaptive/cc/sharedcachemap.h index bb3de81..a3737b5 100644 --- a/src/libcaptive/cc/sharedcachemap.h +++ b/src/libcaptive/cc/sharedcachemap.h @@ -59,6 +59,7 @@ void captive_shared_cache_map_set_data_invalid(CaptiveSharedCacheMapObject *capt guint64 start,guint64 end); void captive_shared_cache_map_set_dirty(CaptiveSharedCacheMapObject *captive_shared_cache_map_object, guint64 start,guint64 end); +guint64 captive_shared_cache_map_memory_range_set_dirty(gpointer address_start,gpointer address_end); gboolean captive_shared_cache_map_is_page_dirty(CaptiveSharedCacheMapObject *captive_shared_cache_map_object, guint64 offset); void captive_shared_cache_map_page_set_lsn(CaptiveSharedCacheMapObject *captive_shared_cache_map_object,