Fix: file-descriptor: unnecessary assert in move constructor
[lttng-tools.git] / src / common / defaults.cpp
CommitLineData
8b3bd7a3 1/*
21cf9b6b 2 * Copyright (C) 2012 EfficiOS Inc.
8b3bd7a3 3 *
c922647d 4 * SPDX-License-Identifier: LGPL-2.1-only
8b3bd7a3 5 *
8b3bd7a3
SM
6 */
7
6c1c0768 8#define _LGPL_SOURCE
c9e313bc 9#include "defaults.hpp"
c9e313bc 10#include "error.hpp"
28ab034a
JG
11#include "macros.hpp"
12
13#include <algorithm>
14#include <pthread.h>
15#include <stdbool.h>
16#include <stddef.h>
17#include <sys/resource.h>
18#include <unistd.h>
1a1a34b4 19
4d5fb75f 20static int pthread_attr_init_done;
1a1a34b4 21static pthread_attr_t tattr;
8b3bd7a3 22
cd9adb8b 23static size_t get_page_size()
81663f07
MJ
24{
25 const long ret = sysconf(_SC_PAGE_SIZE);
26
27 if (ret < 0) {
28 /*
29 * Fatal error since there is no safe way to recover from this.
30 */
31 PERROR("Failed to get system page size using sysconf(_SC_PAGE_SIZE)");
32 abort();
33 }
34
35 return (size_t) ret;
36}
37
cd9adb8b 38size_t default_get_channel_subbuf_size()
8b3bd7a3 39{
a6bc4ca9 40 return std::max<size_t>(_DEFAULT_CHANNEL_SUBBUF_SIZE, get_page_size());
78d8fb4f
JG
41}
42
cd9adb8b 43size_t default_get_metadata_subbuf_size()
78d8fb4f 44{
a6bc4ca9 45 return std::max<size_t>(DEFAULT_METADATA_SUBBUF_SIZE, get_page_size());
78d8fb4f
JG
46}
47
cd9adb8b 48size_t default_get_kernel_channel_subbuf_size()
78d8fb4f 49{
a6bc4ca9 50 return std::max<size_t>(DEFAULT_KERNEL_CHANNEL_SUBBUF_SIZE, get_page_size());
78d8fb4f
JG
51}
52
cd9adb8b 53size_t default_get_ust_pid_channel_subbuf_size()
78d8fb4f 54{
a6bc4ca9 55 return std::max<size_t>(DEFAULT_UST_PID_CHANNEL_SUBBUF_SIZE, get_page_size());
78d8fb4f
JG
56}
57
cd9adb8b 58size_t default_get_ust_uid_channel_subbuf_size()
78d8fb4f 59{
a6bc4ca9 60 return std::max<size_t>(DEFAULT_UST_UID_CHANNEL_SUBBUF_SIZE, get_page_size());
8b3bd7a3 61}
1a1a34b4 62
cd9adb8b 63pthread_attr_t *default_pthread_attr()
1a1a34b4 64{
4d5fb75f
JG
65 if (pthread_attr_init_done) {
66 return &tattr;
67 }
1a1a34b4 68
b38afa27 69 WARN("Uninitialized pthread attributes, using libc defaults.");
cd9adb8b 70 return nullptr;
4d5fb75f 71}
1a1a34b4 72
cd9adb8b 73static void __attribute__((constructor)) init_default_pthread_attr()
4d5fb75f
JG
74{
75 int ret;
76 struct rlimit rlim;
77 size_t pthread_ss, system_ss, selected_ss;
78
79 ret = pthread_attr_init(&tattr);
80 if (ret) {
81 errno = ret;
82 PERROR("pthread_attr_init");
83 goto error;
1a1a34b4
MJ
84 }
85
86 /* Get system stack size limits. */
87 ret = getrlimit(RLIMIT_STACK, &rlim);
88 if (ret < 0) {
89 PERROR("getrlimit");
4d5fb75f 90 goto error_destroy;
1a1a34b4
MJ
91 }
92 DBG("Stack size limits: soft %lld, hard %lld bytes",
28ab034a
JG
93 (long long) rlim.rlim_cur,
94 (long long) rlim.rlim_max);
1a1a34b4 95
4d5fb75f
JG
96 /*
97 * getrlimit() may return a stack size of "-1", meaning "unlimited".
98 * In this case, we impose a known-good default minimum value which will
99 * override the libc's default stack size if it is smaller.
100 */
28ab034a 101 system_ss = rlim.rlim_cur != -1 ? rlim.rlim_cur : DEFAULT_LTTNG_THREAD_STACK_SIZE;
4d5fb75f 102
1a1a34b4 103 /* Get pthread default thread stack size. */
4d5fb75f 104 ret = pthread_attr_getstacksize(&tattr, &pthread_ss);
1a1a34b4
MJ
105 if (ret < 0) {
106 PERROR("pthread_attr_getstacksize");
4d5fb75f 107 goto error_destroy;
1a1a34b4 108 }
4d5fb75f
JG
109 DBG("Default pthread stack size is %zu bytes", pthread_ss);
110
a6bc4ca9 111 selected_ss = std::max(pthread_ss, system_ss);
4d5fb75f
JG
112 if (selected_ss < DEFAULT_LTTNG_THREAD_STACK_SIZE) {
113 DBG("Default stack size is too small, setting it to %zu bytes",
28ab034a 114 (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE);
4d5fb75f 115 selected_ss = DEFAULT_LTTNG_THREAD_STACK_SIZE;
1a1a34b4
MJ
116 }
117
89e06fb5 118 if (rlim.rlim_max > 0 && selected_ss > rlim.rlim_max) {
0d43a013 119 WARN("Your system's stack size restrictions (%zu bytes) may be too low for the LTTng daemons to function properly, please set the stack size limit to at least %zu bytes to ensure reliable operation",
28ab034a
JG
120 (size_t) rlim.rlim_max,
121 (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE);
4d5fb75f
JG
122 selected_ss = (size_t) rlim.rlim_max;
123 }
124
125 ret = pthread_attr_setstacksize(&tattr, selected_ss);
126 if (ret < 0) {
127 PERROR("pthread_attr_setstacksize");
128 goto error_destroy;
129 }
130 pthread_attr_init_done = 1;
1a1a34b4 131error:
4d5fb75f
JG
132 return;
133error_destroy:
134 ret = pthread_attr_destroy(&tattr);
135 if (ret) {
136 errno = ret;
137 PERROR("pthread_attr_destroy");
138 }
139}
140
cd9adb8b 141static void __attribute__((destructor)) fini_default_pthread_attr()
4d5fb75f
JG
142{
143 int ret;
144
145 if (!pthread_attr_init_done) {
146 return;
147 }
148
149 ret = pthread_attr_destroy(&tattr);
150 if (ret) {
151 errno = ret;
152 PERROR("pthread_attr_destroy");
153 }
1a1a34b4 154}
This page took 0.147293 seconds and 4 git commands to generate.