From: <dg...@su...> - 2009-01-18 23:41:38
|
Author: dgollub Date: Mon Jan 19 00:40:31 2009 New Revision: 5186 URL: http://www.opensync.org/changeset/5186 Log: Use two additional list to handle "active" and "dummy" sinks in OSyncObjEngine . Dropped "dummy"-sattribute from OSyncSinkEngine. Don't use the number "dummy" sinks in the public interface. osync_obj_engine_num_sink_engines() returns now the number of active sinks. All those changes are required for mixed-objtype syncing later. Modified: trunk/opensync/engine/opensync_obj_engine.c trunk/opensync/engine/opensync_obj_engine_internals.h trunk/opensync/engine/opensync_sink_engine.c trunk/opensync/engine/opensync_sink_engine_internals.h Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Sun Jan 18 20:15:11 2009 (r5185) +++ trunk/opensync/engine/opensync_obj_engine.c Mon Jan 19 00:40:31 2009 (r5186) @@ -108,7 +108,7 @@ osync_trace(TRACE_INTERNAL, "SlowSync requested during connect."); } - if (osync_bitcount(engine->sink_errors | engine->sink_connects) == osync_obj_engine_num_active_sinkengines(engine)) { + if (osync_bitcount(engine->sink_errors | engine->sink_connects) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_errors)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "At least one sink_engine failed while connecting"); osync_obj_engine_set_error(engine, locerror); @@ -138,7 +138,7 @@ osync_status_update_member(engine->parent, osync_client_proxy_get_member(proxy), OSYNC_CLIENT_EVENT_CONNECT_DONE, engine->objtype, NULL); } - if (osync_bitcount(engine->sink_errors | engine->sink_connect_done) == osync_obj_engine_num_active_sinkengines(engine)) { + if (osync_bitcount(engine->sink_errors | engine->sink_connect_done) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_connect_done) < osync_bitcount(engine->sink_connects)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "Fewer sink_engines reported connect_done than connected"); osync_obj_engine_set_error(engine, locerror); @@ -156,7 +156,7 @@ OSyncError *locerror = NULL; osync_trace(TRACE_ENTRY, "%s(%p)", __func__, engine); - if (osync_bitcount(engine->sink_errors | engine->sink_disconnects) == osync_obj_engine_num_active_sinkengines(engine)) { + if (osync_bitcount(engine->sink_errors | engine->sink_disconnects) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_disconnects) < osync_bitcount(engine->sink_connects)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "Fewer sink_engines disconnected than connected"); osync_obj_engine_set_error(engine, locerror); @@ -345,7 +345,7 @@ osync_status_update_member(engine->parent, osync_client_proxy_get_member(proxy), OSYNC_CLIENT_EVENT_READ, engine->objtype, NULL); } - if (osync_bitcount(engine->sink_errors | engine->sink_get_changes) == osync_obj_engine_num_active_sinkengines(engine)) { + if (osync_bitcount(engine->sink_errors | engine->sink_get_changes) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_get_changes) < osync_bitcount(engine->sink_connects)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "Fewer sink_engines reported get_changes than connected"); @@ -458,7 +458,7 @@ /* And that we received the written replies from all sinks */ /* TODO: Review if this is intended to even check for "dummy" sinks here!i - * Other commands/devent checks for osync_obj_engine_num_active_sinkengines()! */ + * Other commands/devent checks for osync_obj_engine_num_sinkengines()! */ if (osync_bitcount(engine->sink_errors | engine->sink_written) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_written) < osync_bitcount(engine->sink_connects)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "Fewer sink_engines reported committed all than connected"); @@ -576,7 +576,7 @@ osync_status_update_member(engine->parent, osync_client_proxy_get_member(proxy), OSYNC_CLIENT_EVENT_SYNC_DONE, engine->objtype, NULL); } - if (osync_bitcount(engine->sink_errors | engine->sink_sync_done) == osync_obj_engine_num_active_sinkengines(engine)) { + if (osync_bitcount(engine->sink_errors | engine->sink_sync_done) == osync_obj_engine_num_sinkengines(engine)) { if (osync_bitcount(engine->sink_sync_done) < osync_bitcount(engine->sink_connects)) { osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "Fewer sink_engines reported sync_done than connected"); osync_obj_engine_set_error(engine, locerror); @@ -784,8 +784,6 @@ osync_trace(TRACE_INTERNAL, "Loaded %i mappings", osync_mapping_table_num_mappings(engine->mapping_table)); - engine->dummies = 0; - objtype = osync_obj_engine_get_objtype(engine); num = osync_engine_num_proxies(engine->parent); @@ -809,11 +807,11 @@ if (!sinkengine) goto error; - if (dummy_sink) { - osync_sink_engine_set_dummy(sinkengine, TRUE); - engine->dummies++; - } - + if (dummy_sink) + engine->dummy_sink_engines = osync_list_append(engine->dummy_sink_engines, sinkengine); + else + engine->active_sink_engines = osync_list_append(engine->active_sink_engines, sinkengine); + engine->sink_engines = osync_list_append(engine->sink_engines, sinkengine); } @@ -870,6 +868,11 @@ engine->sink_engines = osync_list_remove(engine->sink_engines, sinkengine); } + + osync_list_free(engine->active_sink_engines); + osync_list_free(engine->dummy_sink_engines); + engine->active_sink_engines = NULL; + engine->dummy_sink_engines = NULL; while (engine->conflicts) { mapping_engine = engine->conflicts->data; @@ -927,34 +930,25 @@ switch (cmd) { case OSYNC_ENGINE_COMMAND_CONNECT: - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - if (!osync_client_proxy_connect(sinkengine->proxy, _osync_obj_engine_connect_callback, sinkengine, engine->objtype, engine->slowsync, error)) goto error; } break; case OSYNC_ENGINE_COMMAND_CONNECT_DONE: - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - if (!osync_client_proxy_connect_done(sinkengine->proxy, _osync_obj_engine_connect_done_callback, sinkengine, engine->objtype, error)) goto error; } break; case OSYNC_ENGINE_COMMAND_READ: - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - for (o = sinkengine->entries; o; o = o->next) { OSyncMappingEntryEngine *entry = o->data; OSyncChange *change = entry->change; @@ -976,7 +970,7 @@ write_sinks = _osync_obj_engine_num_write_sinks(engine); /* Get change entries since last sync. (get_changes) */ - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { OSyncMember *member = NULL; OSyncObjTypeSink *objtype_sink = NULL; @@ -984,9 +978,6 @@ member = osync_client_proxy_get_member(sinkengine->proxy); - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - objtype_sink = osync_member_find_objtype_sink(member, engine->objtype); /* Is there at least one other writeable sink? */ @@ -1099,23 +1090,17 @@ break; case OSYNC_ENGINE_COMMAND_SYNC_DONE: - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - if (!osync_client_proxy_sync_done(sinkengine->proxy, _osync_obj_engine_sync_done_callback, sinkengine, engine->objtype, error)) goto error; } break; case OSYNC_ENGINE_COMMAND_DISCONNECT:; - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - /* Don't call client disconnect functions if the sink is already disconnected. This avoids unintended disconnect calls of clients/plugins which might not prepared for a disconnect call when their never got connected. (testcases: *_connect_error, *_connect_timeout ..) */ @@ -1208,13 +1193,7 @@ unsigned int osync_obj_engine_num_sinkengines(OSyncObjEngine *engine) { osync_assert(engine); - return osync_list_length(engine->sink_engines); -} - -unsigned int osync_obj_engine_num_active_sinkengines(OSyncObjEngine *engine) -{ - osync_assert(engine); - return (osync_obj_engine_num_sinkengines(engine) - engine->dummies); + return osync_list_length(engine->active_sink_engines); } unsigned int osync_obj_engine_num_mapping_engines(OSyncObjEngine *engine) @@ -1238,7 +1217,7 @@ if (!merger_enabled && !converter_enabled) return TRUE; - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { OSyncSinkEngine *sinkengine = p->data; if (merger_enabled @@ -1265,22 +1244,11 @@ osync_assert(engine); - for (p = engine->sink_engines; p; p = p->next) { + for (p = engine->active_sink_engines; p; p = p->next) { OSyncSinkEngine *sinkengine = p->data; - /* FIXME: for "clean" mixed-objtype syncing - all peers should report - * via their native OSyncObjEngine. This temp. solution uses not the - * ObjTypeSink to write/commit changes. Later the "native" ObjEngine - * should be used. - - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - */ - member = osync_client_proxy_get_member(sinkengine->proxy); objtype_sink = osync_member_find_objtype_sink(member, engine->objtype); - - /* If sink could not be found use "data" sink if available */ /* TODO: Get rid of hardcoded-"data". Make this indepdendent of "data" */ Modified: trunk/opensync/engine/opensync_obj_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_obj_engine_internals.h Sun Jan 18 20:15:11 2009 (r5185) +++ trunk/opensync/engine/opensync_obj_engine_internals.h Mon Jan 19 00:40:31 2009 (r5186) @@ -46,6 +46,12 @@ /** List of OSyncSinkEngine-elements */ OSyncList *sink_engines; + /** List of Active OSyncSinkEngine-elements */ + OSyncList *active_sink_engines; + + /** List of Dummy OSyncSinkEngine-elements */ + OSyncList *dummy_sink_engines; + /** Pointer to OSyncObjEngine assinged error struct */ OSyncError *error; /** Pointer to format enviornment */ @@ -79,30 +85,14 @@ /** Conflicts already solved */ osync_bool conflicts_solved; - - /** Total number of "dummy" OSyncSinkEngine-elements */ - unsigned int dummies; }; OSyncMappingEngine *_osync_obj_engine_create_mapping_engine(OSyncObjEngine *engine, OSyncError **error); -/*! @brief Get number of "active" Sink Engines (excluded "dummy" Sink Engines) - * in ObjEngine - * - * This function should be used to determine the number of "active" Sink - * Engines. Original purpose of this function is to determine the number of - * Sink Engine to wait for. Excluded are all Sink Engines which have the - * attribute "dummy" set. - * - * @param engine Pointer to OSyncObjEngine - * @returns Number of "active" Sink Engines - */ -unsigned int osync_obj_engine_num_active_sinkengines(OSyncObjEngine *engine); - /*! @brief Get total number of OSyncMappingEngines of this OSyncObjEngine * * @param engine Pointer to OSyncObjEngine - * @returns Total number of "active" and "dummy" Sink Engines + * @returns Total number of Mapping Engines */ unsigned int osync_obj_engine_num_mapping_engines(OSyncObjEngine *engine); Modified: trunk/opensync/engine/opensync_sink_engine.c ============================================================================== --- trunk/opensync/engine/opensync_sink_engine.c Sun Jan 18 20:15:11 2009 (r5185) +++ trunk/opensync/engine/opensync_sink_engine.c Mon Jan 19 00:40:31 2009 (r5186) @@ -109,18 +109,6 @@ return !!(objengine->sink_connects & (1 << engine->position)); } -void osync_sink_engine_set_dummy(OSyncSinkEngine *engine, osync_bool isdummy) -{ - osync_assert(engine); - engine->dummy_sink = isdummy; -} - -osync_bool osync_sink_engine_is_dummy(OSyncSinkEngine *engine) -{ - osync_assert(engine); - return engine->dummy_sink; -} - const OSyncList *osync_sink_engine_get_mapping_entry_engines(OSyncSinkEngine *engine) { osync_return_val_if_fail(engine, NULL); Modified: trunk/opensync/engine/opensync_sink_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_sink_engine_internals.h Sun Jan 18 20:15:11 2009 (r5185) +++ trunk/opensync/engine/opensync_sink_engine_internals.h Mon Jan 19 00:40:31 2009 (r5186) @@ -37,8 +37,6 @@ OSyncList *entries; /** List of assinged OSyncMappingEntryEngine elemebts, but unmapped (no counter-entry) */ OSyncList *unmapped; - /** "dummy" attribute, when set no proxy functions of OSyncSinkEngine get called */ - osync_bool dummy_sink; }; OSyncSinkEngine *osync_sink_engine_new(int position, OSyncClientProxy *proxy, OSyncObjEngine *objengine, OSyncError **error); @@ -46,27 +44,6 @@ void osync_sink_engine_unref(OSyncSinkEngine *engine); osync_bool osync_sink_engine_is_connected(OSyncSinkEngine *engine); - -/*! @brief Set "dummy" attribute for OSyncSinkEngine - * - * If the "dummy" attribute set, then OSyncSinkEngine will not call any proxy - * function inside the OSyncObjEngine. The original purpose of this is to have - * a OSyncSinkEngine for "peers" which make use of mixed-ObjTypes. For this - * reason primarly the lists of OSyncSinkEngine (i.e. entries and unmapped - * entries) get used for mixed-ObjType mappings. - * - * @param engine Pointer to an OSyncSinkEngine which should act as "dummy" - * @param isdummy TRUE or FALSE to set the "dummy" attribute - */ -void osync_sink_engine_set_dummy(OSyncSinkEngine *engine, osync_bool isdummy); - -/*! @brief Get state of "dummy" attribute of OSyncSinkEngine - * - * @param engine Pointer to an OSyncSinkEngine which should act as "dummy" - * @returns TRUE if engine got set as "dummy", FALSE otherwise - */ -osync_bool osync_sink_engine_is_dummy(OSyncSinkEngine *engine); - /*! @brief Demerge all entries of OSyncSinkEngine * * If the Member/Client of the OSyncSinkEngine doesn't have capabilities |