[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#4943) tpool.c pause vs. finish
hyc@symas.com writes:
>h.b.furuseth@usit.uio.no wrote:
>> Eh? Yes, that's what I was talking about. But I'm not sure what you
>> mean with them exiting immediately - or how they could. Also they stay
>> around until there are no pending requests. A pause request could
>> arrive more or less at any time, I presume. (I don't know if there is a
>> pause while the max threads number is being modified.)
>
> Yes. As stated back in the distant past, cn=config fully serializes
> all write operations. The pool is paused for each write op.
Oh, right.
> When the op completes and the pool is resumed, the condition variable
> is broadcasted, so all the other threads will wake up, and the first
> to do so will see that they're above the max and exit, before any
> other tasks are started.
No, they won't exit pool_wrapper() while there are pending requests, but
if that is a bug it is easy to fix. And by that description the wait I
inserted after context_reset() in pool_wrapper() should not be there,
since it releases ltp_mutex before the ID is removed from thread_keys[].
However another thread could be waiting in pool_pause() and start
another pause. And the thread which did pool_resume() will be active
and could call pool_pause() again (but I think it won't in the same LDAP
operation with the current bconfig.c code). So if pool_wrapper() does
not go active for context_reset() we must ensure that a pause is not
started while a thread in pool_wrapper() is dying. That leaves
thread_keys[] protected by either a pause or one of two mutexes,
depending on circumstances. I'll sleep on it before trying to wrap my
head around that one:-)
>> (...) We did have code which compared thread IDs with '==' for
>> quite some time. Do you remember if anyone complained, or if the
>> switch to using ldap_pvt_thread_equal() was a "just in case" fix?
>
> Yes, I needed to use pthread_equal() on OS/390 since their thread type
> was a structure.
Ouch. That kills my tls.c patch too. I so hoped not to hear of an
example...
>> BTW I don't know if the unsigned long needs to be the thread ID or just
>> _some_ unique integer. A question to openssl-users@openssl.org got no
>> answer.
>
> It just needs to be a unique integer. I've already had this
> conversation with the OpenSSL folks...
Got a reference to that which I can beat them with? (To get them to
update their doc if nothing else.)
>>>>>>> The best fix may be to just use the address of the thread's
>>>>>>> stack as the thread ID. That's actually perfect for our purpose.
>> (...)
>> Hmm. I asked the wrong question, should have read some man pages first.
>> Still, thr_cthreads.c & thr_lwp.c don't use LDAP_PVT_THREAD_STACK_SIZE.
>> man pthread_attr_getstacksize says it sets the _minimum_ stack size, but
>> perhaps several M is large enough that one can expect it won't get
>> multiples of that.
>
> That kinda implies that no one has been using the cthreads or lwp support
> recently, since I doubt their default stack size would work with back-bdb's
> filterindex demands.
Um, okay... could remove them from configure and tell anyone who needs
them to shout.
How about pool_context() called from subsystems which create their own
threads (like Perl code or plugins)?
I guess it's just that I don't see I why using a private,
hopefully-OS-independent hack is an improvement over OS-provided
thread-specific data (when that is supported).
Any risk that there are systems around which support non-contiguous
stacks? (Allocate a new stack chunk if the current one is used up, and
chain it to the old one.) I don't have a clue how common they are or
were, nor of the arguments for/against implementing them.
--
Regards,
Hallvard