You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2010/08/22 13:37:38 UTC

svn commit: r987869 - /subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c

Author: stefan2
Date: Sun Aug 22 11:37:38 2010
New Revision: 987869

URL: http://svn.apache.org/viewvc?rev=987869&view=rev
Log:
Fix VisualStudio build: memory size calculation for variable size 
arrays is not portable.

* subversion/libsvn_fs_fs/temp_serializer.c
  (serialize_dir, serialize_txdelta_ops): fix array size calculation

Modified:
    subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c

Modified: subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c?rev=987869&r1=987868&r2=987869&view=diff
==============================================================================
--- subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c Sun Aug 22 11:37:38 2010
@@ -272,7 +272,7 @@ serialize_dir(apr_hash_t *entries, apr_p
 
   /* calculate sizes */
   apr_size_t count = apr_hash_count(entries);
-  apr_size_t entries_len = sizeof(svn_fs_dirent_t*[count]);
+  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t*[1]);
 
   /* copy the hash entries to an auxilliary struct of known layout */
   hash_data.count = count;
@@ -422,7 +422,7 @@ serialize_txdelta_ops(svn_temp_serialize
   /* the ops form a simple chunk of memory with no further references */
   svn_temp_serializer__push(context,
                             (const void * const *)ops,
-                            sizeof(svn_txdelta_op_t[count]));
+                            count * sizeof(svn_txdelta_op_t[1]));
   svn_temp_serializer__pop(context);
 }
 



Re: svn commit: r987869 - /subversion/branches/performance/subversion/libsvn_fs_fs/temp_serial izer.c

Posted by Daniel Shahaf <d....@daniel.shahaf.name>.
Stefan Sperling wrote on Sun, Aug 22, 2010 at 13:44:07 +0200:
> On Sun, Aug 22, 2010 at 11:37:38AM -0000, stefan2@apache.org wrote:
> > +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t*[1]);
> 

So how would this be parsed?  Is it parsed as

	sizeof( (type *) [1] )

?

> Do you really want the second asterisk in that line?
> It looks like you really want this:
> 
>  +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t[1]);

Re: svn commit: r987869 - /subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c

Posted by Stefan Sperling <st...@elego.de>.
On Sun, Aug 22, 2010 at 01:44:07PM +0200, Stefan Sperling wrote:
> On Sun, Aug 22, 2010 at 11:37:38AM -0000, stefan2@apache.org wrote:
> > Author: stefan2
> > Date: Sun Aug 22 11:37:38 2010
> > New Revision: 987869
> > 
> > URL: http://svn.apache.org/viewvc?rev=987869&view=rev
> > Log:
> > Fix VisualStudio build: memory size calculation for variable size 
> > arrays is not portable.
> > 
> > * subversion/libsvn_fs_fs/temp_serializer.c
> >   (serialize_dir, serialize_txdelta_ops): fix array size calculation
> > 
> > Modified:
> >     subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c
> > 
> > Modified: subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c
> > URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c?rev=987869&r1=987868&r2=987869&view=diff
> > ==============================================================================
> > --- subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c (original)
> > +++ subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c Sun Aug 22 11:37:38 2010
> > @@ -272,7 +272,7 @@ serialize_dir(apr_hash_t *entries, apr_p
> >  
> >    /* calculate sizes */
> >    apr_size_t count = apr_hash_count(entries);
> > -  apr_size_t entries_len = sizeof(svn_fs_dirent_t*[count]);
> > +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t*[1]);
> 
> Do you really want the second asterisk in that line?
> It looks like you really want this:
> 
>  +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t[1]);

Bah, what I wrote doesn't make any sense.

Let me try again:

I don't understand that syntax.
Is this really treating a pointer to a struct as an array with a single
element? If so, why?

It looks like this is saying "I need 'count' times the size of 
a pointer to svn_fs_dirent_t". So why not just write:

  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t*);

> 
> >  
> >    /* copy the hash entries to an auxilliary struct of known layout */
> >    hash_data.count = count;
> > @@ -422,7 +422,7 @@ serialize_txdelta_ops(svn_temp_serialize
> >    /* the ops form a simple chunk of memory with no further references */
> >    svn_temp_serializer__push(context,
> >                              (const void * const *)ops,
> > -                            sizeof(svn_txdelta_op_t[count]));
> > +                            count * sizeof(svn_txdelta_op_t[1]));

Again, the [1] seems redundant. What's it for?

Thanks,
Stefan

Re: svn commit: r987869 - /subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c

Posted by Stefan Sperling <st...@elego.de>.
On Sun, Aug 22, 2010 at 11:37:38AM -0000, stefan2@apache.org wrote:
> Author: stefan2
> Date: Sun Aug 22 11:37:38 2010
> New Revision: 987869
> 
> URL: http://svn.apache.org/viewvc?rev=987869&view=rev
> Log:
> Fix VisualStudio build: memory size calculation for variable size 
> arrays is not portable.
> 
> * subversion/libsvn_fs_fs/temp_serializer.c
>   (serialize_dir, serialize_txdelta_ops): fix array size calculation
> 
> Modified:
>     subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c
> 
> Modified: subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c
> URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c?rev=987869&r1=987868&r2=987869&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c (original)
> +++ subversion/branches/performance/subversion/libsvn_fs_fs/temp_serializer.c Sun Aug 22 11:37:38 2010
> @@ -272,7 +272,7 @@ serialize_dir(apr_hash_t *entries, apr_p
>  
>    /* calculate sizes */
>    apr_size_t count = apr_hash_count(entries);
> -  apr_size_t entries_len = sizeof(svn_fs_dirent_t*[count]);
> +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t*[1]);

Do you really want the second asterisk in that line?
It looks like you really want this:

 +  apr_size_t entries_len = count * sizeof(svn_fs_dirent_t[1]);

>  
>    /* copy the hash entries to an auxilliary struct of known layout */
>    hash_data.count = count;
> @@ -422,7 +422,7 @@ serialize_txdelta_ops(svn_temp_serialize
>    /* the ops form a simple chunk of memory with no further references */
>    svn_temp_serializer__push(context,
>                              (const void * const *)ops,
> -                            sizeof(svn_txdelta_op_t[count]));
> +                            count * sizeof(svn_txdelta_op_t[1]));

Because you're not using the extra asterisk here, either.

Stefan

>    svn_temp_serializer__pop(context);
>  }
>  
>