]> code.delx.au - pulseaudio/commitdiff
add generic rate limiting implementation
authorLennart Poettering <lennart@poettering.net>
Fri, 23 Jan 2009 22:58:36 +0000 (23:58 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 23 Jan 2009 22:58:36 +0000 (23:58 +0100)
src/Makefile.am
src/pulsecore/ratelimit.c [new file with mode: 0644]
src/pulsecore/ratelimit.h [new file with mode: 0644]

index 24623d3fd267f150d16d79a230894b1ff998affd..e27bfbad9e56d8f8ba28dbbf73b8e8ecf97d82c1 100644 (file)
@@ -533,6 +533,7 @@ libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES = \
                pulsecore/llist.h \
                pulsecore/lock-autospawn.c pulsecore/lock-autospawn.h \
                pulsecore/log.c pulsecore/log.h \
+               pulsecore/ratelimit.c pulsecore/ratelimit.h \
                pulsecore/macro.h pulsecore/vector.h \
                pulsecore/mcalign.c pulsecore/mcalign.h \
                pulsecore/memblock.c pulsecore/memblock.h \
diff --git a/src/pulsecore/ratelimit.c b/src/pulsecore/ratelimit.c
new file mode 100644 (file)
index 0000000..8ce7857
--- /dev/null
@@ -0,0 +1,75 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Lennart Poettering
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2 of the
+  License, or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulsecore/rtclock.h>
+#include <pulsecore/log.h>
+#include <pulsecore/mutex.h>
+
+#include "ratelimit.h"
+
+static pa_static_mutex mutex;
+
+/* Modelled after Linux' lib/ratelimit.c by Dave Young
+ * <hidave.darkstar@gmail.com>, which is licensed GPLv2. */
+
+pa_bool_t pa_ratelimit_test(pa_ratelimit *r) {
+    pa_usec_t now;
+    pa_mutex *m;
+
+    now = pa_rtclock_usec();
+
+    m = pa_static_mutex_get(&mutex, FALSE, FALSE);
+    pa_mutex_lock(m);
+
+    pa_assert(r);
+    pa_assert(r->interval > 0);
+    pa_assert(r->burst > 0);
+
+    if (r->begin <= 0 ||
+        r->begin + r->interval < now) {
+
+        if (r->n_missed > 0)
+            pa_log_warn("%u events suppressed", r->n_missed);
+
+        r->begin = now;
+
+        /* Reset counters */
+        r->n_printed = 0;
+        r->n_missed = 0;
+        goto good;
+    }
+
+    if (r->n_printed <= r->burst)
+        goto good;
+
+    r->n_missed++;
+    pa_mutex_unlock(m);
+    return FALSE;
+
+good:
+    r->n_printed++;
+    pa_mutex_unlock(m);
+    return TRUE;
+}
diff --git a/src/pulsecore/ratelimit.h b/src/pulsecore/ratelimit.h
new file mode 100644 (file)
index 0000000..e652c52
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef foopulsecoreratelimithfoo
+#define foopulsecoreratelimithfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Lennart Poettering
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2 of the
+  License, or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#include <pulse/sample.h>
+#include <pulsecore/macro.h>
+
+typedef struct pa_ratelimit {
+    const pa_usec_t interval;
+    const unsigned burst;
+    unsigned n_printed, n_missed;
+    pa_usec_t begin;
+} pa_ratelimit;
+
+#define PA_DEFINE_RATELIMIT(_name, _interval, _burst)   \
+    pa_ratelimit _name = {                              \
+        .interval = _interval,                          \
+        .burst = _burst,                                \
+        .n_printed = 0,                                 \
+        .n_missed = 0,                                  \
+        .begin = 0                                      \
+    }
+
+pa_bool_t pa_ratelimit_test(pa_ratelimit *r);
+
+#endif