X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fcc%2Fsharedcachemap.c;h=6f8bfcf5de267831b37afa6daf67fe6a69d510d1;hb=3522c07fd5f3d3025126bc5206d141a34774fe33;hp=b278008a02f675155a159504c09831f2d383cfcd;hpb=9bcf20d2f6f962421742139583437b6290a0818f;p=captive.git 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 */