From: Linus Nordberg Date: Mon, 26 Aug 2013 08:35:12 +0000 (+0200) Subject: Create threads with a 32 KB stack rather than what happens to be the default. X-Git-Tag: radsecproxy-1.6.3-rc0~11 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=radsecproxy.git;a=commitdiff_plain;h=55ca280f16473095380e22c574910f106b11058f Create threads with a 32 KB stack rather than what happens to be the default. On Linux, the default stack size is typically 8 MB. Patch by Fabian Mauchle. --- diff --git a/dtls.c b/dtls.c index 3772113..8be677e 100644 --- a/dtls.c +++ b/dtls.c @@ -309,7 +309,7 @@ void dtlsserverrd(struct client *client) { debug(DBG_DBG, "dtlsserverrd: starting for %s", addr2string(client->addr)); - if (pthread_create(&dtlsserverwrth, NULL, dtlsserverwr, (void *)client)) { + if (pthread_create(&dtlsserverwrth, &pthread_attr, dtlsserverwr, (void *)client)) { debug(DBG_ERR, "dtlsserverrd: pthread_create failed"); return; } @@ -512,7 +512,7 @@ void *udpdtlsserverrd(void *arg) { if (udp2bio(s, params->sesscache->rbios, cnt)) { debug(DBG_DBG, "udpdtlsserverrd: got DTLS in UDP from %s", addr2string((struct sockaddr *)&from)); - if (!pthread_create(&dtlsserverth, NULL, dtlsservernew, (void *)params)) { + if (!pthread_create(&dtlsserverth, &pthread_attr, dtlsservernew, (void *)params)) { pthread_detach(dtlsserverth); cacheexpire(sessioncache, &lastexpiry); continue; @@ -701,10 +701,10 @@ void initextradtls() { } if (client4_sock >= 0) - if (pthread_create(&cl4th, NULL, udpdtlsclientrd, (void *)&client4_sock)) + if (pthread_create(&cl4th, &pthread_attr, udpdtlsclientrd, (void *)&client4_sock)) debugx(1, DBG_ERR, "pthread_create failed"); if (client6_sock >= 0) - if (pthread_create(&cl6th, NULL, udpdtlsclientrd, (void *)&client6_sock)) + if (pthread_create(&cl6th, &pthread_attr, udpdtlsclientrd, (void *)&client6_sock)) debugx(1, DBG_ERR, "pthread_create failed"); } #else diff --git a/radsecproxy.c b/radsecproxy.c index e919ceb..56abe3e 100644 --- a/radsecproxy.c +++ b/radsecproxy.c @@ -1816,7 +1816,7 @@ void *clientwr(void *arg) { #if defined ENABLE_EXPERIMENTAL_DYNDISC server->in_use = 1; #endif - if (pthread_create(&clientrdth, NULL, conf->pdef->clientconnreader, (void *)server)) { + if (pthread_create(&clientrdth, &pthread_attr, conf->pdef->clientconnreader, (void *)server)) { debugerrno(errno, DBG_ERR, "clientwr: pthread_create failed"); goto errexit; } @@ -1975,7 +1975,7 @@ void createlistener(uint8_t type, char *arg) { if (!sp) debugx(1, DBG_ERR, "malloc failed"); *sp = s; - if (pthread_create(&th, NULL, protodefs[type]->listener, (void *)sp)) + if (pthread_create(&th, &pthread_attr, protodefs[type]->listener, (void *)sp)) debugerrnox(errno, DBG_ERR, "pthread_create failed"); pthread_detach(th); } @@ -2225,7 +2225,7 @@ struct list *createsubrealmservers(struct realm *realm, struct list *srvconfs) { #if defined ENABLE_EXPERIMENTAL_DYNDISC pthread_mutex_lock(&srvconf->servers->lock); #endif - if (pthread_create(&clientth, NULL, clientwr, (void *)(srvconf->servers))) { + if (pthread_create(&clientth, &pthread_attr, clientwr, (void *)(srvconf->servers))) { #if defined ENABLE_EXPERIMENTAL_DYNDISC pthread_mutex_unlock(&srvconf->servers->lock); #endif @@ -3344,6 +3344,11 @@ int radsecproxy_main(int argc, char **argv) { debug_init("radsecproxy"); debug_set_level(DEBUG_LEVEL); + if (pthread_attr_init(&pthread_attr)) + debugx(1, DBG_ERR, "pthread_attr_init failed"); + if (pthread_attr_setstacksize(&pthread_attr, PTHREAD_STACK_SIZE)) + debugx(1, DBG_ERR, "pthread_attr_setstacksize failed"); + for (i = 0; i < RAD_PROTOCOUNT; i++) protodefs[i] = protoinits[i](i); @@ -3395,7 +3400,7 @@ int radsecproxy_main(int argc, char **argv) { sigaddset(&sigset, SIGHUP); sigaddset(&sigset, SIGPIPE); pthread_sigmask(SIG_BLOCK, &sigset, NULL); - pthread_create(&sigth, NULL, sighandler, NULL); + pthread_create(&sigth, &pthread_attr, sighandler, NULL); for (entry = list_first(srvconfs); entry; entry = list_next(entry)) { srvconf = (struct clsrvconf *)entry->data; @@ -3403,7 +3408,7 @@ int radsecproxy_main(int argc, char **argv) { continue; if (!addserver(srvconf)) debugx(1, DBG_ERR, "failed to add server"); - if (pthread_create(&srvconf->servers->clientth, NULL, clientwr, + if (pthread_create(&srvconf->servers->clientth, &pthread_attr, clientwr, (void *)(srvconf->servers))) debugx(1, DBG_ERR, "pthread_create failed"); } diff --git a/radsecproxy.h b/radsecproxy.h index 1e9dc42..bbb9b58 100644 --- a/radsecproxy.h +++ b/radsecproxy.h @@ -28,6 +28,7 @@ #define MAX_CERT_DEPTH 5 #define STATUS_SERVER_PERIOD 25 #define IDLE_TIMEOUT 300 +#define PTHREAD_STACK_SIZE 32768 /* 27262 is vendor DANTE Ltd. */ #define DEFAULT_TTL_ATTR "27262:1" @@ -246,6 +247,7 @@ int radsrv(struct request *rq); void replyh(struct server *server, unsigned char *buf); struct addrinfo *resolve_hostport_addrinfo(uint8_t type, char *hostport); uint8_t *radattr2ascii(struct tlv *attr); +pthread_attr_t pthread_attr; /* Local Variables: */ /* c-file-style: "stroustrup" */ diff --git a/tcp.c b/tcp.c index 86fa9b6..6de39fc 100644 --- a/tcp.c +++ b/tcp.c @@ -276,7 +276,7 @@ void tcpserverrd(struct client *client) { debug(DBG_DBG, "tcpserverrd: starting for %s", addr2string(client->addr)); - if (pthread_create(&tcpserverwrth, NULL, tcpserverwr, (void *)client)) { + if (pthread_create(&tcpserverwrth, &pthread_attr, tcpserverwr, (void *)client)) { debug(DBG_ERR, "tcpserverrd: pthread_create failed"); return; } @@ -357,7 +357,7 @@ void *tcplistener(void *arg) { debug(DBG_WARN, "accept failed"); continue; } - if (pthread_create(&tcpserverth, NULL, tcpservernew, (void *)&s)) { + if (pthread_create(&tcpserverth, &pthread_attr, tcpservernew, (void *)&s)) { debug(DBG_ERR, "tcplistener: pthread_create failed"); shutdown(s, SHUT_RDWR); close(s); diff --git a/tls.c b/tls.c index 084c0ce..d60d59b 100644 --- a/tls.c +++ b/tls.c @@ -339,7 +339,7 @@ void tlsserverrd(struct client *client) { debug(DBG_DBG, "tlsserverrd: starting for %s", addr2string(client->addr)); - if (pthread_create(&tlsserverwrth, NULL, tlsserverwr, (void *)client)) { + if (pthread_create(&tlsserverwrth, &pthread_attr, tlsserverwr, (void *)client)) { debug(DBG_ERR, "tlsserverrd: pthread_create failed"); return; } @@ -460,7 +460,7 @@ void *tlslistener(void *arg) { debug(DBG_WARN, "accept failed"); continue; } - if (pthread_create(&tlsserverth, NULL, tlsservernew, (void *)&s)) { + if (pthread_create(&tlsserverth, &pthread_attr, tlsservernew, (void *)&s)) { debug(DBG_ERR, "tlslistener: pthread_create failed"); shutdown(s, SHUT_RDWR); close(s); diff --git a/udp.c b/udp.c index c804703..380db18 100644 --- a/udp.c +++ b/udp.c @@ -352,15 +352,15 @@ void initextraudp() { } if (client4_sock >= 0) - if (pthread_create(&cl4th, NULL, udpclientrd, (void *)&client4_sock)) + if (pthread_create(&cl4th, &pthread_attr, udpclientrd, (void *)&client4_sock)) debugx(1, DBG_ERR, "pthread_create failed"); if (client6_sock >= 0) - if (pthread_create(&cl6th, NULL, udpclientrd, (void *)&client6_sock)) + if (pthread_create(&cl6th, &pthread_attr, udpclientrd, (void *)&client6_sock)) debugx(1, DBG_ERR, "pthread_create failed"); if (find_clconf_type(handle, NULL)) { server_replyq = newqueue(); - if (pthread_create(&srvth, NULL, udpserverwr, (void *)server_replyq)) + if (pthread_create(&srvth, &pthread_attr, udpserverwr, (void *)server_replyq)) debugx(1, DBG_ERR, "pthread_create failed"); } }