NetBSD-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Out of threads
In article <1m40q40.be9cjllegby3M%manu%netbsd.org@localhost>,
Emmanuel Dreyfus <manu%netbsd.org@localhost> wrote:
>Hello
>
>I have a problem with Apache, that sometimes horribly dies with this
>message:
>Can't initialize threads: error 35
>
>The strings is from libmysqlclient. In MySQL source, we have:
>mysql-5.6.23/mysys/my_thr_init.c
> if ((pth_ret= pthread_key_create(&THR_KEY_mysys, NULL)) != 0)
> {
> fprintf(stderr, "Can't initialize threads: error %d\n", pth_ret);
> return 1;
> }
>
>In NetBSD, src/lib/libpthread/pthread_tsd.c
> for (i = nextkey; i < PTHREAD_KEYS_MAX; i++)
> if (pthread__tsd_alloc[i] == NULL)
> break;
>
> if (i == PTHREAD_KEYS_MAX) {
> /* 2. If that didn't work, search from the start
> * of the list back to "nextkey".
> */
> for (i = 0; i < nextkey; i++)
> if (pthread__tsd_alloc[i] == NULL)
> break;
>
> if (i == nextkey) {
> /* If we didn't find one here, there isn't one
> * to be found.
> */
> pthread_mutex_unlock(&tsd_mutex);
> return EAGAIN;
>
>We hit a hardcoded value here, which is set to 256 in <limits.h>. Anyone
>encountered this? Is there other workarounds than rebuilding libpthread
>with a higher PTHREAD_KEYS_MAX? In an ideal world, we could throttle on
>failure, instead of exitting.
The throttling needs to be done by the application; we return EAGAIN.
I think you need to compile with a larger PTHREAD_KEYS_MAX. Perhaps
we can make this more flexible by dynamically allocating the array,
so one does not need to recompile (and provide PTHREAD_USER_KEYS_MAX
like: http://docstore.mik.ua/manuals/hp-ux/en/B2355-60130/pthread_key_create.3T.html).
christos
Home |
Main Index |
Thread Index |
Old Index