Cleanup thread handling to resolve non-exiting daemons on FreeBSD.

Seems that calling pthread_exit() in the main (and only active)
thread does not cause the whole process to exit.  Very odd.
Anyways, as we want to whole process to exit, we should just exit
after joining with our other threads.
I've also removed dead code for detaching threads we join with.
This commit is contained in:
Kurt Zeilenga 1998-12-30 00:06:27 +00:00
parent 25f2f9dd70
commit 595bf86635
3 changed files with 9 additions and 73 deletions

View file

@ -179,44 +179,25 @@ main( int argc, char **argv )
read_config( configfile, &be, fp );
if ( ! inetd ) {
pthread_attr_t attr;
int status;
time( &starttime );
pthread_attr_init( &attr );
#ifdef DETACH_LISTENER_THREAD
/* we should detach it if we're going to join with it */
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
#endif
#if !defined(HAVE_PTHREADS_D4)
/* POSIX_THREADS or compatible
* This is a draft 10 or standard pthreads implementation
*/
if ( pthread_create( &listener_tid, &attr, slapd_daemon,
if ( pthread_create( &listener_tid, NULL, slapd_daemon,
(void *) port ) != 0 ) {
Debug( LDAP_DEBUG_ANY,
"listener pthread_create failed\n", 0, 0, 0 );
exit( 1 );
}
#else /* draft4 */
/*
* This is a draft 4 or earlier pthreads implementation
*/
if ( pthread_create( &listener_tid, attr, slapd_daemon,
(void *) port ) != 0 ) {
Debug( LDAP_DEBUG_ANY,
"listener pthread_create failed\n", 0, 0, 0 );
exit( 1 );
}
#endif /* !draft4 */
pthread_attr_destroy( &attr );
#ifdef HAVE_PHREADS_FINAL
pthread_join( listener_tid, (void *) NULL );
#else
pthread_join( listener_tid, (void *) &status );
#endif
pthread_exit( 0 );
return 0;
} else {
Connection c;
Operation *o;

View file

@ -112,33 +112,13 @@ main(
/*
* Start the main file manager thread (in fm.c).
*/
pthread_attr_init( &attr );
#if !defined(HAVE_PTHREADS_D4)
/* POSIX_THREADS or compatible
* This is a draft 10 or standard pthreads implementation
*/
if ( pthread_create( &(sglob->fm_tid), &attr, fm, (void *) NULL )
if ( pthread_create( &(sglob->fm_tid), NULL, fm, (void *) NULL )
!= 0 ) {
Debug( LDAP_DEBUG_ANY, "file manager pthread_create failed\n",
0, 0, 0 );
exit( 1 );
}
#else /* !PTHREADS_FINAL */
/*
* This is a draft 4 or earlier pthreads implementation
*/
if ( pthread_create( &(sglob->fm_tid), attr, fm, (void *) NULL )
!= 0 ) {
Debug( LDAP_DEBUG_ANY, "file manager pthread_create failed\n",
0, 0, 0 );
exit( 1 );
}
#endif /* !PTHREADS_FINAL */
pthread_attr_destroy( &attr );
/*
* Wait for the fm thread to finish.
@ -160,7 +140,7 @@ main(
}
Debug( LDAP_DEBUG_ANY, "slurpd: terminating normally\n", 0, 0, 0 );
sglob->slurpd_shutdown = 1;
pthread_exit( 0 );
return 0;
#endif /* !NO_THREADS */
}

View file

@ -54,38 +54,13 @@ start_replica_thread(
Ri *ri
)
{
pthread_attr_t attr;
pthread_attr_init( &attr );
#ifdef NOTDEF
/* if main wants to join with us, we shouldn't detach */
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
#endif
#if !defined(HAVE_PTHREADS_D4)
/* POSIX_THREADS or compatible
* This is a draft 10 or standard pthreads implementation
*/
if ( pthread_create( &(ri->ri_tid), &attr, replicate,
/* POSIX_THREADS or compatible */
if ( pthread_create( &(ri->ri_tid), NULL, replicate,
(void *) ri ) != 0 ) {
Debug( LDAP_DEBUG_ANY, "replica \"%s:%d\" pthread_create failed\n",
ri->ri_hostname, ri->ri_port, 0 );
pthread_attr_destroy( &attr );
return -1;
}
#else /* !final */
/*
* This is a draft 4 or earlier pthreads implementation
*/
if ( pthread_create( &(ri->ri_tid), attr, replicate,
(void *) ri ) != 0 ) {
Debug( LDAP_DEBUG_ANY, "replica \"%s:%d\" pthread_create failed\n",
ri->ri_hostname, ri->ri_port, 0 );
pthread_attr_destroy( &attr );
return -1;
}
#endif /* !final */
pthread_attr_destroy( &attr );
return 0;
}