00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <config.h>
00025 #include <dbus/dbus-resources.h>
00026 #include <dbus/dbus-internals.h>
00027
00054 struct DBusCounter
00055 {
00056 int refcount;
00058 long size_value;
00059 long unix_fd_value;
00061 #ifdef DBUS_ENABLE_STATS
00062 long peak_size_value;
00063 long peak_unix_fd_value;
00064 #endif
00065
00066 long notify_size_guard_value;
00067 long notify_unix_fd_guard_value;
00069 DBusCounterNotifyFunction notify_function;
00070 void *notify_data;
00071 dbus_bool_t notify_pending : 1;
00072 };
00073
00075
00087 DBusCounter*
00088 _dbus_counter_new (void)
00089 {
00090 DBusCounter *counter;
00091
00092 counter = dbus_new0 (DBusCounter, 1);
00093 if (counter == NULL)
00094 return NULL;
00095
00096 counter->refcount = 1;
00097
00098 return counter;
00099 }
00100
00107 DBusCounter *
00108 _dbus_counter_ref (DBusCounter *counter)
00109 {
00110 _dbus_assert (counter->refcount > 0);
00111
00112 counter->refcount += 1;
00113
00114 return counter;
00115 }
00116
00123 void
00124 _dbus_counter_unref (DBusCounter *counter)
00125 {
00126 _dbus_assert (counter->refcount > 0);
00127
00128 counter->refcount -= 1;
00129
00130 if (counter->refcount == 0)
00131 {
00132
00133 dbus_free (counter);
00134 }
00135 }
00136
00147 void
00148 _dbus_counter_adjust_size (DBusCounter *counter,
00149 long delta)
00150 {
00151 long old = counter->size_value;
00152
00153 counter->size_value += delta;
00154
00155 #ifdef DBUS_ENABLE_STATS
00156 if (counter->peak_size_value < counter->size_value)
00157 counter->peak_size_value = counter->size_value;
00158 #endif
00159
00160 #if 0
00161 _dbus_verbose ("Adjusting counter %ld by %ld = %ld\n",
00162 old, delta, counter->size_value);
00163 #endif
00164
00165 if (counter->notify_function != NULL &&
00166 ((old < counter->notify_size_guard_value &&
00167 counter->size_value >= counter->notify_size_guard_value) ||
00168 (old >= counter->notify_size_guard_value &&
00169 counter->size_value < counter->notify_size_guard_value)))
00170 counter->notify_pending = TRUE;
00171 }
00172
00181 void
00182 _dbus_counter_notify (DBusCounter *counter)
00183 {
00184 if (counter->notify_pending)
00185 {
00186 counter->notify_pending = FALSE;
00187 (* counter->notify_function) (counter, counter->notify_data);
00188 }
00189 }
00190
00201 void
00202 _dbus_counter_adjust_unix_fd (DBusCounter *counter,
00203 long delta)
00204 {
00205 long old = counter->unix_fd_value;
00206
00207 counter->unix_fd_value += delta;
00208
00209 #ifdef DBUS_ENABLE_STATS
00210 if (counter->peak_unix_fd_value < counter->unix_fd_value)
00211 counter->peak_unix_fd_value = counter->unix_fd_value;
00212 #endif
00213
00214 #if 0
00215 _dbus_verbose ("Adjusting counter %ld by %ld = %ld\n",
00216 old, delta, counter->unix_fd_value);
00217 #endif
00218
00219 if (counter->notify_function != NULL &&
00220 ((old < counter->notify_unix_fd_guard_value &&
00221 counter->unix_fd_value >= counter->notify_unix_fd_guard_value) ||
00222 (old >= counter->notify_unix_fd_guard_value &&
00223 counter->unix_fd_value < counter->notify_unix_fd_guard_value)))
00224 counter->notify_pending = TRUE;
00225 }
00226
00233 long
00234 _dbus_counter_get_size_value (DBusCounter *counter)
00235 {
00236 return counter->size_value;
00237 }
00238
00245 long
00246 _dbus_counter_get_unix_fd_value (DBusCounter *counter)
00247 {
00248 return counter->unix_fd_value;
00249 }
00250
00262 void
00263 _dbus_counter_set_notify (DBusCounter *counter,
00264 long size_guard_value,
00265 long unix_fd_guard_value,
00266 DBusCounterNotifyFunction function,
00267 void *user_data)
00268 {
00269 counter->notify_size_guard_value = size_guard_value;
00270 counter->notify_unix_fd_guard_value = unix_fd_guard_value;
00271 counter->notify_function = function;
00272 counter->notify_data = user_data;
00273 counter->notify_pending = FALSE;
00274 }
00275
00276 #ifdef DBUS_ENABLE_STATS
00277 long
00278 _dbus_counter_get_peak_size_value (DBusCounter *counter)
00279 {
00280 return counter->peak_size_value;
00281 }
00282
00283 long
00284 _dbus_counter_get_peak_unix_fd_value (DBusCounter *counter)
00285 {
00286 return counter->peak_unix_fd_value;
00287 }
00288 #endif
00289