[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
non-null tvp on select() (ITS#2603)
Full_Name: Jeff Bouis
Version: 2.1.21
OS: Solaris 9
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (65.247.141.10)
Openldap 2.1.21, daemon.c, line 1325 is
tvp = at ? &tv : NULL;
Apparently this changed in version 2.1.20 (per ITS#2374), because prior to that,
the equivalent code was
#if defined( HAVE_YIELDING_SELECT ) || defined( NO_THREADS )
tvp = NULL
#else
tvp = at ? &tv : NULL;
#endif
In the earlier code, OS's that allow select() to yield (such as Solaris) always
set tvp to NULL, regardless of if any threads were active. But in the new code,
if there are no active threads and everything is idle, then tvp points to a
struct timeval which has its values set to 0 by default.
So, in the old code (NULL tvp), select() would simply block and wait for
something to happen. But in the new code (tvp with 0 time), select() runs, sees
nothing has changed, so goes back into the "while ( !slapd_shutdown )" loop and
starts over. Just polling and polling and polling....
In less than 30 seconds of running, slapd with full logging output over
40,000(!) log entries of
daemon: select timeout - yielding
daemon: select: listen=6 active_threads=1 tvp=idle
Note this behavior is also mentioned in the followup message of ITS#2580.
Jeff