summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlain Magloire <alainm@gnu.org>2003-02-24 05:14:08 +0000
committerAlain Magloire <alainm@gnu.org>2003-02-24 05:14:08 +0000
commitaee5de3eb14ed3465cee88a349907f6084a5fee5 (patch)
tree4c72f9ab9e326006723dfb387f90c3cc93352f90
parenta73c55ce75ccd22d3eb606a1dc49461f97c8a842 (diff)
downloadmailutils-aee5de3eb14ed3465cee88a349907f6084a5fee5.tar.gz
mailutils-aee5de3eb14ed3465cee88a349907f6084a5fee5.tar.bz2
Simple thread-safe implementation of reference count.
-rw-r--r--mailbox/refcount.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/mailbox/refcount.c b/mailbox/refcount.c
new file mode 100644
index 000000000..5ad95344d
--- /dev/null
+++ b/mailbox/refcount.c
@@ -0,0 +1,93 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+ This library 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.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; 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 <stdlib.h>
+#include <errno.h>
+
+#include <mailutils/monitor.h>
+#include <mailutils/refcount.h>
+
+int
+mu_refcount_create (mu_refcount_t *prefcount)
+{
+ int status = 0;
+ mu_refcount_t refcount;
+ if (prefcount == NULL)
+ return EINVAL;
+ refcount = calloc (1, sizeof *refcount);
+ if (refcount != NULL)
+ {
+ refcount->ref = 1;
+ status = monitor_create (&(refcount->lock));
+ if (status == 0)
+ {
+ *prefcount = refcount;
+ }
+ else
+ {
+ free (refcount);
+ }
+ }
+ else
+ {
+ status = ENOMEM;
+ }
+ return status;
+}
+
+void
+mu_refcount_destroy (mu_refcount_t *prefcount)
+{
+ if (prefcount && *prefcount)
+ {
+ mu_refcount_t refcount = *prefcount;
+ monitor_destroy (&refcount->lock);
+ free (refcount);
+ *prefcount = NULL;
+ }
+}
+
+int
+mu_refcount_inc (mu_refcount_t refcount)
+{
+ int count = 0;
+ if (refcount)
+ {
+ monitor_lock (refcount->lock);
+ count = ++refcount->ref;
+ monitor_unlock (refcount->lock);
+ }
+ return count;
+}
+
+int
+mu_refcount_dec (mu_refcount_t refcount)
+{
+ int count = 0;
+ if (refcount)
+ {
+ monitor_lock (refcount->lock);
+ if (refcount->ref)
+ count = --refcount->ref;
+ monitor_unlock (refcount->lock);
+ }
+ return count;
+}

Return to:

Send suggestions and report system problems to the System administrator.