Fix: sessiond: double free on duplicate removal of tracer source
[lttng-tools.git] / src / bin / lttng-sessiond / fd-limit.c
CommitLineData
4063050c 1/*
ab5be9fa 2 * Copyright (C) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4063050c 3 *
ab5be9fa 4 * SPDX-License-Identifier: GPL-2.0-only
4063050c 5 *
4063050c
MD
6 */
7
6c1c0768 8#define _LGPL_SOURCE
4063050c
MD
9#include <urcu/uatomic.h>
10#include <sys/time.h>
11#include <sys/resource.h>
4063050c
MD
12#include <stdio.h>
13#include "fd-limit.h"
6f04ed72 14#include <common/error.h>
edf4b93e 15#include <common/compat/errno.h>
4063050c
MD
16
17/* total count of fd. */
18static long fd_count;
19
20/*
21 * threshold in % of number of fd allowed.
22 */
23static long fd_threshold[LTTNG_FD_NR_TYPES] = {
24 [LTTNG_FD_APPS] = 75,
25};
26
27static rlim_t max_nr_fd;
28
29int lttng_fd_get(enum lttng_fd_type type, unsigned int nr)
30{
31 long newval;
32
33 if (type >= LTTNG_FD_NR_TYPES) {
34 return -EINVAL;
35 }
36
37 newval = uatomic_add_return(&fd_count, (long) nr);
38 if ((long) (newval * 100)
39 - (long) (max_nr_fd * fd_threshold[type]) > 0) {
40 uatomic_sub(&fd_count, (long) nr);
41 return -EPERM;
42 }
43 return 0;
44}
45
46void lttng_fd_put(enum lttng_fd_type type, unsigned int nr)
47{
48 uatomic_sub(&fd_count, (long) nr);
49}
50
51void lttng_fd_init(void)
52{
53 struct rlimit rlim;
54 int ret;
55
56 ret = getrlimit(RLIMIT_NOFILE, &rlim);
57 if (ret < 0) {
6f04ed72 58 PERROR("getrlimit");
4063050c
MD
59 }
60 max_nr_fd = rlim.rlim_cur;
61}
This page took 0.058437 seconds and 4 git commands to generate.