Changeset 381

Show
Ignore:
Timestamp:
03/21/05 01:07:30 (4 years ago)
Author:
azrael
Message:

Added skeleton for the new batch commit plugin
functions.

Added a new signal to the members "committed_all" that
will be called by the engine when all changes to be written
have been sent to a member.

Location:
trunk
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • trunk/Makefile.am

    r257 r381  
    1818EXTRA_DIST = \ 
    1919        autogen.sh \ 
    20         buildtest.sh \ 
    2120        plugins \ 
    2221        opensync-1.0.pc.in \ 
    23         osengine-1.0.pc.in 
     22        osengine-1.0.pc.in \ 
     23        misc/buildtest.sh \ 
     24        misc/doxygen.css 
    2425 
    2526dist-hook: 
  • trunk/opensync/opensync_format_internals.h

    r374 r381  
    8484        char *extension_name; 
    8585        struct OSyncObjTypeSink *objtype_sink; 
     86        GList *commit_changes; 
     87        GList *commit_contexts; 
    8688} OSyncObjFormatSink; 
    8789 
  • trunk/opensync/opensync_member.c

    r374 r381  
    563563        g_assert(change); 
    564564 
     565        OSyncFormatEnv *env = osync_member_get_format_env(member); 
    565566        OSyncContext *context = osync_context_new(member); 
    566567        context->callback_function = function; 
    567568        context->calldata = user_data; 
    568  
    569         OSyncFormatEnv *env = osync_member_get_format_env(member); 
     569         
    570570         
    571571        OSyncObjType *type = change->objtype; 
     
    618618                osync_debug("OSYNC", 2, "Comparing change %s with sink %s", osync_change_get_objformat(change)->name, fmtsink->format ? fmtsink->format->name : "None"); 
    619619                if (fmtsink->format == osync_change_get_objformat(change)) { 
    620                         // Send the change 
    621                         fmtsink->functions.commit_change(context, change); 
    622                         osync_trace(TRACE_EXIT, "%s", __func__); 
    623                         return; 
     620                        if (fmtsink->functions.batch_commit) { 
     621                                //Append to the stored changes 
     622                                fmtsink->commit_changes = g_list_append(fmtsink->commit_changes, change); 
     623                                fmtsink->commit_contexts = g_list_append(fmtsink->commit_contexts, context); 
     624                                osync_trace(TRACE_EXIT, "%s: Waiting for batch processing", __func__); 
     625                                return; 
     626                        } else { 
     627                                // Send the change 
     628                                fmtsink->functions.commit_change(context, change); 
     629                                osync_trace(TRACE_EXIT, "%s", __func__); 
     630                                return; 
     631                        } 
    624632                } 
    625633        } 
     
    627635        osync_context_report_error(context, OSYNC_ERROR_CONVERT, "Unable to send changes"); 
    628636        osync_trace(TRACE_EXIT_ERROR, "%s: Unable to find a sink", __func__); 
     637} 
     638 
     639void osync_member_committed_all(OSyncMember *member) 
     640{ 
     641        osync_trace(TRACE_ENTRY, "%s(%p)", __func__, member); 
     642 
     643        GList *f; 
     644        for (f = member->format_sinks; f; f = f->next) { 
     645                OSyncObjFormatSink *fmtsink = f->data; 
     646                osync_debug("OSYNC", 2, "Sending committed all to sink %s", fmtsink->format ? fmtsink->format->name : "None"); 
     647 
     648                OSyncFormatFunctions functions = fmtsink->functions; 
     649 
     650                if (functions.batch_commit) { 
     651                        GList *o = fmtsink->commit_contexts; 
     652                        GList *c = NULL; 
     653                         
     654                        int i = 0; 
     655                        OSyncChange **changes = g_malloc0(sizeof(OSyncChange *) * (g_list_length(fmtsink->commit_changes) + 1)); 
     656                        OSyncContext **contexts = g_malloc0(sizeof(OSyncContext *) * (g_list_length(fmtsink->commit_changes) + 1));; 
     657                         
     658                        for (c = fmtsink->commit_changes; c && o; c = c->next) { 
     659                                OSyncChange *change = c->data; 
     660                                OSyncContext *context = o->data; 
     661                                 
     662                                changes[i] = change; 
     663                                contexts[i] = context; 
     664                                 
     665                                i++; 
     666                                o = o->next; 
     667                        } 
     668                         
     669                        changes[i] = NULL; 
     670                        contexts[i] = NULL; 
     671                        functions.batch_commit(member->plugindata, contexts, changes); 
     672                         
     673                        g_free(changes); 
     674                        g_free(contexts); 
     675                         
     676                        g_list_free(fmtsink->commit_changes); 
     677                        fmtsink->commit_changes = NULL; 
     678                         
     679                        g_list_free(fmtsink->commit_contexts); 
     680                        fmtsink->commit_contexts = NULL; 
     681                } else if (functions.committed_all) { 
     682                        functions.committed_all(member->plugindata); 
     683                } 
     684        } 
     685         
     686        osync_trace(TRACE_EXIT, "%s", __func__); 
    629687} 
    630688 
  • trunk/opensync/opensync_member.h

    r374 r381  
    4040void osync_member_get_changeinfo(OSyncMember *member, OSyncEngCallback function, void *user_data); 
    4141void osync_member_read_change(OSyncMember *member, OSyncChange *change, OSyncEngCallback function, void *user_data); 
     42void osync_member_committed_all(OSyncMember *member); 
    4243 
    4344void *osync_member_call_plugin(OSyncMember *member, const char *function, void *data, OSyncError **error); 
  • trunk/opensync/opensync_plugin.h

    r375 r381  
    3636typedef struct OSyncFormatFunctions { 
    3737        osync_bool (* commit_change) (OSyncContext *, OSyncChange *); 
     38        void (* committed_all) (void *); 
     39        void (* batch_commit) (void *, OSyncContext **, OSyncChange **); 
    3840        osync_bool (* access) (OSyncContext *, OSyncChange *); 
    3941        void (* read) (OSyncContext *, OSyncChange *); 
  • trunk/osengine/osengine_client.c

    r375 r381  
    4242        client->fl_done = osync_flag_new(NULL); 
    4343        client->fl_finished = osync_flag_new(engine->cmb_finished); 
    44         //client->fl_reset = osync_flag_new(engine->cmb_reset); 
    45          
     44         
     45        client->cmb_written = osync_comb_flag_new(FALSE, FALSE); 
     46        osync_flag_set_pos_trigger(client->cmb_written, (MSyncFlagTriggerFunc)send_committed_all, client, engine); 
     47                 
    4648    return client; 
    4749} 
     
    6163        osync_flag_free(client->fl_done); 
    6264        osync_flag_free(client->fl_finished); 
     65        osync_flag_free(client->cmb_written); 
    6366 
    6467        g_free(client); 
     
    171174        } 
    172175 
     176        if (itm_message_is_methodcall(message, "COMMITTED_ALL")) { 
     177                osync_member_committed_all(client->member); 
     178                osync_trace(TRACE_EXIT, "client_message_handler"); 
     179                return; 
     180        } 
     181         
    173182        if (itm_message_is_methodcall(message, "READ_CHANGE")) { 
    174183                OSyncChange *change = itm_message_get_data(message, "change"); 
  • trunk/osengine/osengine_client_internals.h

    r361 r381  
    1515        MSyncFlag *fl_done; 
    1616        MSyncFlag *fl_finished; 
     17        MSyncFlag *cmb_written; 
    1718        GThread *thread; 
    1819        GMainContext *context; 
  • trunk/osengine/osengine_engine.c

    r376 r381  
    348348} 
    349349 
     350void send_committed_all(OSyncClient *target, OSyncEngine *sender) 
     351{ 
     352        osync_flag_changing(target->fl_done); 
     353        ITMessage *message = itm_message_new_signal(sender, "COMMITTED_ALL"); 
     354        itm_queue_send(target->incoming, message); 
     355} 
     356 
    350357void send_disconnect(OSyncClient *target, OSyncEngine *sender) 
    351358{ 
  • trunk/osengine/osengine_engine_internals.h

    r375 r381  
    7070void send_read_change(OSyncEngine *sender, OSyncMappingEntry *entry); 
    7171void send_engine_changed(OSyncEngine *engine); 
     72void send_committed_all(OSyncClient *target, OSyncEngine *sender);