Skip to content

Commit

Permalink
Create threads with a 32 KB stack rather than what happens to be the …
Browse files Browse the repository at this point in the history
…default.

On Linux, the default stack size is typically 8 MB.

Patch by Fabian Mauchle.
  • Loading branch information
Linus Nordberg committed Sep 2, 2013
1 parent 05b3606 commit 55ca280
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 16 deletions.
8 changes: 4 additions & 4 deletions dtls.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
15 changes: 10 additions & 5 deletions radsecproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -3395,15 +3400,15 @@ 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;
if (srvconf->dynamiclookupcommand)
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");
}
Expand Down
2 changes: 2 additions & 0 deletions radsecproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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" */
Expand Down
4 changes: 2 additions & 2 deletions tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Expand Down

0 comments on commit 55ca280

Please sign in to comment.