}
}
+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)
{
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 */