}
}
-void log_thread_start (void)
+void log_thread_start (pthread_attr_t *attr)
{
- pthread_attr_t attr;
-
logdbg(stderr,"enter log_thread_start\n");
logq_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(logev_lock, NULL);
pthread_cond_init(logev_cond, NULL);
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr, 64 * 1024);
-
if (log_init("multipathd", 0)) {
fprintf(stderr,"can't initialize log buffer\n");
exit(1);
}
- pthread_create(&log_thr, &attr, log_thread, NULL);
+ pthread_create(&log_thr, attr, log_thread, NULL);
return;
}
#include "lock.h"
#include "waiter.h"
+pthread_attr_t waiter_attr;
+
struct event_thread *alloc_waiter (void)
{
int start_waiter_thread (struct multipath *mpp, struct vectors *vecs)
{
- pthread_attr_t attr;
struct event_thread *wp;
if (!mpp)
return 0;
- if (pthread_attr_init(&attr))
- goto out;
-
- pthread_attr_setstacksize(&attr, 32 * 1024);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
wp = alloc_waiter();
if (!wp)
wp->vecs = vecs;
wp->mpp = mpp;
- if (pthread_create(&wp->thread, &attr, waitevent, wp)) {
+ if (pthread_create(&wp->thread, &waiter_attr, waitevent, wp)) {
condlog(0, "%s: cannot create event checker", wp->mapname);
goto out1;
}
#include <errno.h>
#include <sys/time.h>
#include <sys/resource.h>
+#include <limits.h>
/*
* libcheckers
fclose(fp);
}
+void
+setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached)
+{
+ if (pthread_attr_init(attr)) {
+ fprintf(stderr, "can't initialize thread attr: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+ if (stacksize < PTHREAD_STACK_MIN)
+ stacksize = PTHREAD_STACK_MIN;
+
+ if (pthread_attr_setstacksize(attr, stacksize)) {
+ fprintf(stderr, "can't set thread stack size to %lu: %s\n",
+ (unsigned long)stacksize, strerror(errno));
+ exit(1);
+ }
+ if (detached && pthread_attr_setdetachstate(attr,
+ PTHREAD_CREATE_DETACHED)) {
+ fprintf(stderr, "can't set thread to detached: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+}
+
static int
child (void * param)
{
pthread_t check_thr, uevent_thr, uxlsnr_thr;
- pthread_attr_t attr;
+ pthread_attr_t log_attr, misc_attr;
struct vectors * vecs;
mlockall(MCL_CURRENT | MCL_FUTURE);
- if (logsink)
- log_thread_start();
+ setup_thread_attr(&misc_attr, 64 * 1024, 1);
+ setup_thread_attr(&waiter_attr, 32 * 1024, 1);
+
+ if (logsink) {
+ setup_thread_attr(&log_attr, 64 * 1024, 0);
+ log_thread_start(&log_attr);
+ pthread_attr_destroy(&log_attr);
+ }
condlog(2, "--------start up--------");
condlog(2, "read " DEFAULT_CONFIGFILE);
/*
* start threads
*/
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr, 64 * 1024);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
- pthread_create(&check_thr, &attr, checkerloop, vecs);
- pthread_create(&uevent_thr, &attr, ueventloop, vecs);
- pthread_create(&uxlsnr_thr, &attr, uxlsnrloop, vecs);
+ pthread_create(&check_thr, &misc_attr, checkerloop, vecs);
+ pthread_create(&uevent_thr, &misc_attr, ueventloop, vecs);
+ pthread_create(&uxlsnr_thr, &misc_attr, uxlsnrloop, vecs);
+ pthread_attr_destroy(&misc_attr);
pthread_cond_wait(&exit_cond, &exit_mutex);