> -----Original Message----- > From: Philip Martin [mailto:philip.mar...@wandisco.com] > Sent: dinsdag 15 maart 2011 14:52 > To: C. Michael Pilato > Cc: Subversion Development > Subject: Re: Race condition in libsvn_client code? > > "C. Michael Pilato" <cmpil...@collab.net> writes: > > > [Tweaking Subject: for (hopefully) additional visibility.] > > > > On 03/15/2011 09:15 AM, Daniel Shahaf wrote: > >> C. Michael Pilato wrote on Tue, Mar 15, 2011 at 09:05:56 -0400: > >>> On 03/15/2011 12:34 AM, Daniel Shahaf wrote: > >>>> cmpil...@apache.org wrote on Tue, Mar 08, 2011 at 20:05:51 -0000: > >>>>> Author: cmpilato > >>>>> Date: Tue Mar 8 20:05:50 2011 > >>>>> New Revision: 1079508 > >>> > >>> [...] > >>> > >>>>> svn_client_commit4(svn_commit_info_t **commit_info_p, > >>>>> const apr_array_header_t *targets, > >>> > >>> [...] > >>> > >>>>> + /* Ensure that the original notification system is in place. */ > >>>>> + ctx->notify_func2 = notify_baton.orig_notify_func2; > >>>>> + ctx->notify_baton2 = notify_baton.orig_notify_baton2; > >>>>> + > >>>> > >>>> This is actually a race condition, isn't it? (for clients that call the > >>>> deprecated API while using CTX->notify_func2 in another thread (in > the > >>>> same or another API)) > >>>> > >>>> (Okay, so maybe we'll just let it live on. Presumably N other > >>>> deprecated wrappers do this too.) > >>> > >>> I hadn't considered that. We do alot of pointer swaps like this up in the > >>> command-line client code itself, but that's a bit different than doing so > >>> down in the libsvn_client library as in this case. There is one prior > >>> instance of us doing this kind of swap inside the libsvn_client library: in > >>> libsvn_client/copy.c:repos_to_wc_copy_single(). But I'd prefer mere > >>> precedent not to be our reason for allowing badness to persist in the > codebase. > >>> > >>> Got suggestions? > >> > >> Would this work? --- > >> > >> svn_client_ctx_t ctx2 = *ctx; > >> ctx2.notify_func2 = notify_baton.orig_notify_func2; > >> ctx2.notify_baton2 = notify_baton.orig_notify_baton2; > >> svn_client_commit5(ctx=&ctx2); > > It has a different problem, if the client modifies the context in a > callback those modifications will not persist.
I don't think any of our callbacks receives the current ctx instance. But see my other mail: We store a svn_wc_context_t in the client context. So svn_client_ctx_t can't be shared between functions running on different threads anyway. Bert