D-Bus  1.4.10
dbus-resources.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-resources.c Resource tracking/limits
3  *
4  * Copyright (C) 2003 Red Hat Inc.
5  *
6  * Licensed under the Academic Free License version 2.1
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  */
23 
24 #include <config.h>
25 #include <dbus/dbus-resources.h>
26 #include <dbus/dbus-internals.h>
27 
55 {
56  int refcount;
58  long size_value;
64  DBusCounterNotifyFunction notify_function;
65  void *notify_data;
66 };
67  /* end of resource limits internals docs */
69 
83 {
84  DBusCounter *counter;
85 
86  counter = dbus_new (DBusCounter, 1);
87  if (counter == NULL)
88  return NULL;
89 
90  counter->refcount = 1;
91  counter->size_value = 0;
92  counter->unix_fd_value = 0;
93 
94  counter->notify_size_guard_value = 0;
95  counter->notify_unix_fd_guard_value = 0;
96  counter->notify_function = NULL;
97  counter->notify_data = NULL;
98 
99  return counter;
100 }
101 
108 DBusCounter *
110 {
111  _dbus_assert (counter->refcount > 0);
112 
113  counter->refcount += 1;
114 
115  return counter;
116 }
117 
124 void
126 {
127  _dbus_assert (counter->refcount > 0);
128 
129  counter->refcount -= 1;
130 
131  if (counter->refcount == 0)
132  {
133 
134  dbus_free (counter);
135  }
136 }
137 
147 void
149  long delta)
150 {
151  long old = counter->size_value;
152 
153  counter->size_value += delta;
154 
155 #if 0
156  _dbus_verbose ("Adjusting counter %ld by %ld = %ld\n",
157  old, delta, counter->size_value);
158 #endif
159 
160  if (counter->notify_function != NULL &&
161  ((old < counter->notify_size_guard_value &&
162  counter->size_value >= counter->notify_size_guard_value) ||
163  (old >= counter->notify_size_guard_value &&
164  counter->size_value < counter->notify_size_guard_value)))
165  (* counter->notify_function) (counter, counter->notify_data);
166 }
167 
177 void
179  long delta)
180 {
181  long old = counter->unix_fd_value;
182 
183  counter->unix_fd_value += delta;
184 
185 #if 0
186  _dbus_verbose ("Adjusting counter %ld by %ld = %ld\n",
187  old, delta, counter->unix_fd_value);
188 #endif
189 
190  if (counter->notify_function != NULL &&
191  ((old < counter->notify_unix_fd_guard_value &&
192  counter->unix_fd_value >= counter->notify_unix_fd_guard_value) ||
193  (old >= counter->notify_unix_fd_guard_value &&
194  counter->unix_fd_value < counter->notify_unix_fd_guard_value)))
195  (* counter->notify_function) (counter, counter->notify_data);
196 }
197 
204 long
206 {
207  return counter->size_value;
208 }
209 
216 long
218 {
219  return counter->unix_fd_value;
220 }
221 
233 void
235  long size_guard_value,
236  long unix_fd_guard_value,
237  DBusCounterNotifyFunction function,
238  void *user_data)
239 {
240  counter->notify_size_guard_value = size_guard_value;
241  counter->notify_unix_fd_guard_value = unix_fd_guard_value;
242  counter->notify_function = function;
243  counter->notify_data = user_data;
244 }
245  /* end of resource limits exported API */