void osync_mapping_engine_set_master(OSyncMappingEngine *engine, OSyncMappingEntryEngine *entry)
{
  if (engine->master)
    osync_entry_engine_unref(engine->master);
  engine->master = entry;
  osync_entry_engine_ref(engine->master);
}
void osync_mapping_engine_unref(OSyncMappingEngine *engine)
{
  osync_assert(engine);
		
  if (g_atomic_int_dec_and_test(&(engine->ref_count))) {
    if (engine->mapping)
      osync_mapping_unref(engine->mapping);
		
    if (engine->master)
      osync_entry_engine_unref(engine->master);
		
    while (engine->entries) {
      OSyncMappingEntryEngine *entry = engine->entries->data;
      osync_entry_engine_unref(entry);
			
      engine->entries = g_list_remove(engine->entries, engine->entries->data);
    }
		
    g_free(engine);
  }
}
void osync_sink_engine_unref(OSyncSinkEngine *engine)
{
    osync_assert(engine);

    if (g_atomic_int_dec_and_test(&(engine->ref_count))) {
        while (engine->unmapped) {
            OSyncChange *change = engine->unmapped->data;
            osync_change_unref(change);

            engine->unmapped = osync_list_remove(engine->unmapped, engine->unmapped->data);
        }

        while (engine->entries) {
            OSyncMappingEntryEngine *entry = engine->entries->data;
            osync_entry_engine_unref(entry);

            engine->entries = osync_list_remove(engine->entries, engine->entries->data);
        }

        osync_obj_engine_unref(engine->engine);

        osync_free(engine);
    }
}