|
@@ -1600,15 +1600,23 @@ get_max_sockets(void)
|
|
|
* tell Tor it's allowed to use. */
|
|
|
#define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond ConnLimit_ */
|
|
|
|
|
|
-/** Learn the maximum allowed number of file descriptors, and tell the system
|
|
|
- * we want to use up to that number. (Some systems have a low soft limit, and
|
|
|
- * let us set it higher.)
|
|
|
+/** Learn the maximum allowed number of file descriptors, and tell the
|
|
|
+ * system we want to use up to that number. (Some systems have a low soft
|
|
|
+ * limit, and let us set it higher.) We compute this by finding the largest
|
|
|
+ * number that we can use.
|
|
|
*
|
|
|
- * We compute this by finding the largest number that we can use.
|
|
|
- * If we can't find a number greater than or equal to <b>limit</b>,
|
|
|
- * then we fail: return -1.
|
|
|
+ * If the limit is below the reserved file descriptor value (ULIMIT_BUFFER),
|
|
|
+ * return -1 and <b>max_out</b> is untouched.
|
|
|
*
|
|
|
- * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>.*/
|
|
|
+ * If we can't find a number greater than or equal to <b>limit</b>, then we
|
|
|
+ * fail by returning -1 and <b>max_out</b> is untouched.
|
|
|
+ *
|
|
|
+ * If we are unable to set the limit value because of setrlimit() failing,
|
|
|
+ * return -1 and <b>max_out</b> is set to the current maximum value returned
|
|
|
+ * by getrlimit().
|
|
|
+ *
|
|
|
+ * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>
|
|
|
+ * and set <b>max_sockets</b> with that value as well.*/
|
|
|
int
|
|
|
set_max_file_descriptors(rlim_t limit, int *max_out)
|
|
|
{
|
|
@@ -1665,7 +1673,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out)
|
|
|
}
|
|
|
/* Set the current limit value so if the attempt to set the limit to the
|
|
|
* max fails at least we'll have a valid value of maximum sockets. */
|
|
|
- max_sockets = (int)rlim.rlim_cur - ULIMIT_BUFFER;
|
|
|
+ *max_out = max_sockets = (int)rlim.rlim_cur - ULIMIT_BUFFER;
|
|
|
rlim.rlim_cur = rlim.rlim_max;
|
|
|
|
|
|
if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
|