[Image-SIG] AccessInit: hash collision: 3 for both 1 and 1
Bill Janssen
janssen at parc.com
Mon Apr 12 18:23:34 CEST 2010
Fredrik Lundh <fredrik at pythonware.com> wrote:
> The error should only occur if the C module's initialization function
> is called twice. That shouldn't happen under normal use of Python
> (and if it happens anyway, it invariably results in resource leaks for
> many modules, and potentially also more serious issues -- the C module
> interface doesn't have a "uninit" mechanism). Changing the init to
> ignore double initializations only addresses the symptoms.
>
> (the reason this is a hard error is that collision under normal
> circumstances means that the library is unusable unless rebuilt with
> proper hash settings).
>
> Googling led me to someone mentioning that this happened after he'd
> used easy_install, but that it went away after rebuilding with
> setup.py. How did you build your copy?
Setup.py:
python setup.py build --compiler=mingw32 install --prefix="C:\\UpLib\\1.7.9\\python"
I do have setuptools installed in that prefix, though -- need it for
some other modules. But as long as PIL's setup.py doesn't load it, it
shouldn't be an issue. I think. Not sure, perhaps installing
setuptools pollutes distutils right off the bat.
>From the Google hits, it looks to me as if this is something docutils is
doing, perhaps only on Windows, but I don't know what. That's why I
suggested changing (if possible) the exit(1) to some way of triggering a
Python exception or error, so that we can get a stack trace.
Bill
>
> </F>
>
> On Thu, Apr 8, 2010 at 8:17 PM, Bill Janssen <janssen at parc.com> wrote:
> > Fredrik Lundh <fredrik at pythonware.com> wrote:
> >
> >> The idea is that add_item should only be called once for each mode
> >> (see ImagingAccessInit). What did you do to trick Python into calling
> >> the module initializer multiple times?
> >
> > I was using epydoc and docutils 0.5 to build my documentation. Epydoc
> > crashed with this error. If you google "AccessInit: hash collision: 3
> > for both 1 and 1", you'll see it's not just me. After I applied my
> > patch, things seem to work fine.
> >
> > Seems to be a problem with Django and Sphinx and Satchmo, too. And
> > it looks like maybe it only occurs on Windows. I ran into it using
> > PIL built with msys for Python 2.6.4 on Windows XP. I've never seen
> > it on OS X or Ubuntu or Fedora.
> >
> > By the way, "exit(1)" is pretty harsh. Shouldn't you somehow throw a
> > Python exception there? Give us a better chance of figuring out where
> > it's being called from.
> >
> > Bill
> >
> >>
> >> </F>
> >>
> >> On Mon, Apr 5, 2010 at 4:41 AM, Bill Janssen <janssen at parc.com> wrote:
> >> > Seems to me that in libImaging, Access.c:add_item should really read
> >> >
> >> > static ImagingAccess
> >> > add_item(const char* mode)
> >> > {
> >> > UINT32 i = hash(mode);
> >> > /* printf("hash %s => %d\n", mode, i); */
> >> > if (access_table[i].mode && (strcmp(mode, access_table[i].mode) != 0)) {
> >> > fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n",
> >> > i, mode, access_table[i].mode);
> >> > exit(1);
> >> > }
> >> > access_table[i].mode = mode;
> >> > return &access_table[i];
> >> > }
> >> >
> >> > Currently, it reads:
> >> >
> >> > static ImagingAccess
> >> > add_item(const char* mode)
> >> > {
> >> > UINT32 i = hash(mode);
> >> > /* printf("hash %s => %d\n", mode, i); */
> >> > if (access_table[i].mode) {
> >> > fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n",
> >> > i, mode, access_table[i].mode);
> >> > exit(1);
> >> > }
> >> > access_table[i].mode = mode;
> >> > return &access_table[i];
> >> > }
> >> >
> >> > And there's a number of Google hits for "AccessInit: hash collision: 3
> >> > for both 1 and 1", starting about the release of 1.1.7.
> >> >
> >> > Bill
> >> > _______________________________________________
> >> > Image-SIG maillist - Image-SIG at python.org
> >> > http://mail.python.org/mailman/listinfo/image-sig
> >> >
> >
More information about the Image-SIG
mailing list