Philip Martin wrote on Mon, May 09, 2011 at 12:33:14 +0100:
> Daniel Shahaf <danie...@elego.de> writes:
> 
> > +static apr_status_t
> > +close_stream_cleanup(void *stream)
> > +{
> > +  apr_status_t apr_err = APR_SUCCESS;
> > +  svn_error_t *err;
> > +  
> > +  err = svn_stream_close(stream);
> > +  if (err)
> > +    {
> > +      apr_err = err->apr_err;
> > +      svn_error_clear(err);
> > +    }
> > +
> > +  return apr_err;
> > +}
> > +
> >  svn_stream_t *
> >  svn_stream_create(void *baton, apr_pool_t *pool)
> >  {
> > @@ -73,6 +89,9 @@ svn_stream_create(void *baton, apr_pool_t *pool)
> >    stream->mark_fn = NULL;
> >    stream->seek_fn = NULL;
> >    stream->buffered_fn = NULL;
> > +  apr_pool_cleanup_register(pool, stream,
> > +                            close_stream_cleanup,
> > +                            apr_pool_cleanup_null);
> >    return stream;
> >  }
> 
> What happens to streams that are explicitly closed?  When the pool
> cleanup handler runs it will close the stream a second time.
> 

Undefined behaviour?

I don't think we need svn_atomic__init_once() here though, since we can
assume that people don't call svn_stream_close() whilst clearing the
pool that stream is allocated from.  In other words, a "has_been_closed"
boolean should suffice?

> -- 
> Philip

Reply via email to