Skip to content
Snippets Groups Projects
Commit 595bf866 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

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.
parent 25f2f9dd
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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 */
}
......@@ -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,
(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,
/* 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;
}
#endif /* !final */
pthread_attr_destroy( &attr );
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment