From: <svn...@op...> - 2009-04-06 12:54:18
|
Author: bellmich Date: Mon Apr 6 14:54:12 2009 New Revision: 1036 URL: http://libsyncml.opensync.org/changeset/1036 Log: - made pendingMaps thread safe - re-enabled 10.000 test items for stress tests - still think that the COMMITTEDCHANGES event is wrong (depends on race condition) Modified: trunk/libsyncml/objects/sml_ds_server.c trunk/libsyncml/objects/sml_ds_server_internals.h trunk/tests/check_data_sync_api.c Modified: trunk/libsyncml/objects/sml_ds_server.c ============================================================================== --- trunk/libsyncml/objects/sml_ds_server.c Mon Apr 6 14:39:58 2009 (r1035) +++ trunk/libsyncml/objects/sml_ds_server.c Mon Apr 6 14:54:12 2009 (r1036) @@ -34,14 +34,17 @@ { smlTrace(TRACE_ENTRY, "%s(%p, %s, %i)", __func__, dsession, VA_STRING(uid), type); + g_mutex_lock(dsession->pendingMapsLock); GList *c = NULL; for (c = dsession->pendingMaps; c; c = c->next) { SmlWriteContext *ctx = c->data; if (!strcmp(uid, ctx->uid) && ctx->type == type) { + g_mutex_unlock(dsession->pendingMapsLock); smlTrace(TRACE_EXIT, "%s: %p", __func__, ctx); return ctx; } } + g_mutex_unlock(dsession->pendingMapsLock); smlTrace(TRACE_EXIT_ERROR, "%s: Not found", __func__); return NULL; @@ -79,7 +82,9 @@ if (((ctx->type != SML_CHANGE_ADD || smlStatusGetClass(ctx->status) != SML_ERRORCLASS_SUCCESS) && !ctx->newuid) || dsession->server->servertype == SML_DS_CLIENT) { ctx->callback(dsession, ctx->status, NULL, ctx->userdata); + g_mutex_lock(dsession->pendingMapsLock); dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); + g_mutex_unlock(dsession->pendingMapsLock); _write_context_free(ctx); smlTrace(TRACE_EXIT, "%s", __func__); @@ -93,9 +98,12 @@ ctx->callback(dsession, ctx->status, ctx->newuid, ctx->userdata); + g_mutex_lock(dsession->pendingMapsLock); dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); + g_mutex_unlock(dsession->pendingMapsLock); _write_context_free(ctx); + /* FIXME: Are you sure about this comment? */ // Now there are no more MapItems ... do some fancy callback. Some applications will love it ;) if (dsession->recvEventCallback && !dsession->pendingMaps) { dsession->recvEventCallback(dsession, SML_DS_EVENT_COMMITEDCHANGES, dsession->recvEventCallbackUserdata); @@ -404,6 +412,8 @@ dsession->location = server->location; smlLocationRef(dsession->location); + + dsession->pendingMapsLock = g_mutex_new(); smlTrace(TRACE_EXIT, "%s: %p", __func__, dsession); return dsession; @@ -456,12 +466,18 @@ if (dsession->syncCommand) smlCommandUnref(dsession->syncCommand); + if (!g_mutex_trylock(dsession->pendingMapsLock)) { + smlTrace(TRACE_ERROR, + "%s: somebody still uses this object", __func__); + g_mutex_lock(dsession->pendingMapsLock); + } while (dsession->pendingMaps) { SmlWriteContext *ctx = dsession->pendingMaps->data; _write_context_free(ctx); dsession->pendingMaps = g_list_delete_link(dsession->pendingMaps, dsession->pendingMaps); } - + g_mutex_unlock(dsession->pendingMapsLock); + g_mutex_free(dsession->pendingMapsLock); while (dsession->mapItems) { SmlMapItem *item = dsession->mapItems->data; @@ -1073,7 +1089,9 @@ ctx->type = type; ctx->session = dsession; + g_mutex_lock(dsession->pendingMapsLock); dsession->pendingMaps = g_list_append(dsession->pendingMaps, ctx); + g_mutex_unlock(dsession->pendingMapsLock); if (!smlSessionSendCommand(dsession->session, cmd, dsession->syncCommand, _change_reply, ctx, error)) goto error_free_ctx; Modified: trunk/libsyncml/objects/sml_ds_server_internals.h ============================================================================== --- trunk/libsyncml/objects/sml_ds_server_internals.h Mon Apr 6 14:39:58 2009 (r1035) +++ trunk/libsyncml/objects/sml_ds_server_internals.h Mon Apr 6 14:54:12 2009 (r1036) @@ -85,6 +85,7 @@ SmlCommand *syncCommand; GList *pendingMaps; + GMutex *pendingMapsLock; GList *mapItems; //SmlCommand *mapCommand; Modified: trunk/tests/check_data_sync_api.c ============================================================================== --- trunk/tests/check_data_sync_api.c Mon Apr 6 14:39:58 2009 (r1035) +++ trunk/tests/check_data_sync_api.c Mon Apr 6 14:54:12 2009 (r1036) @@ -511,7 +511,7 @@ goto error; /* configure test data */ - int max_items = 1000; + int max_items = 10000; int i; for(i = 0; i < max_items; i++) { client_items = g_list_append(client_items, (char *) "client data"); |