Greg Stein <email@example.com> writes:
> On Tue, Jun 12, 2001 at 08:48:58PM -0000, firstname.lastname@example.org wrote:
> > User: sussman
> > Date: 01/06/12 13:48:58
> > Modified: subversion/libsvn_subr svn_error.c
> > Log:
> > * svn_error.c (initialize_svn_error_descriptions): new func - build a
> > hash table that maps svn errorcodes to english descriptions.
> > (svn_strerror): take a pool instead of stringbuf. pass
> > this pool to initialize_svn_error_descriptions() the first time this
> > routine is called, and then cache the hash in a static variable
> > thereafter. use the hash for lookups.
> > (svn_error_strings): removed, now part of hash initialization.
> This isn't going to work well.
And Ben rebuts! Karl spent a long time arguing about how to solve
this problem. We were waiting for someone to attack. ;)
> If the first person to call svn_strerror() passes a subpool, then future
> callers will get garbaged if that pool has gone away. It is fixable by using
> a cleanup so the hash can be rebuilt for another caller.
There is only one caller: svn_handle_error, which always uses the
pool within the svn_error_t, which is the top-level pool.
So -- we either need to make svn_strerror a static routine (so that
ONLY svn_handle_error can use it), or we need to document that the
pool must be top-level pool, or we need
> However, this is also overengineered. We don't need a hash table since this
> function won't be called often. A simple linear scan over a table is
> sufficient. That would allow constant data to be used for the whole table.
You miss the point of the hash table.
We expect a lot of skew. At first, we thought, "let's avoid the skew"
by forcing all new svn errors & descriptions to be put into a single
python list -- and then at build time, python can output a mini .h and
.c file to be #included in svn_error.h and svn_error.c. (This is what
a lot of big projects do.)
Then we came up with a solution we like better: instead of preventing
skew, make it harmless. We expect people to add a new svn errorcode
in svn_error.h, and then either forget to add a description in
svn_error.c, or perhaps add the descripiton in the wrong place. If
the descriptions were in a plain old array (as it used to be), then
either of these human errors would cause ALL the errors to be screwed
up, a big fat OBOE.
The point of having a hash is that order doesn't matter. Either of
the two mistakes don't matter. svn_strerror() just returns "no
description available" if the code isn't in the hash. And it doesn't
matter where (in the source) the new description is hash-set.
> And lastly, it would be nice to just call svn_strerror() and have it grab
> the APR error for us, if it falls in the APR range. No need for callers to
> know everything about the ranges.
We can do that, easily. That logic is currently in svn_handle_warning
right now, but we can move it.
> I've got a design for rectifying all of this, and can implement tonite. I
> explained the evil macros to Karl if you can't wait to see the code
Oh, oops. Have you already talked Karl out of this system? Then I
guess my comments are irrelevant. :-)
> [ the gist is to have a header that can create both the enumeration and the
> error string table, depending on how it is included ]
Whoa. My head hurts.
To unsubscribe, e-mail: email@example.com
For additional commands, e-mail: firstname.lastname@example.org
Received on Sat Oct 21 14:36:31 2006