From ba51045d9e85b8e48afed629d6d87ac3338acd46 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 29 Jan 2013 23:20:19 +0100 Subject: refcount: convert to C++ --- src/archive/Bzip2ArchivePlugin.cxx | 9 +++-- src/archive/Iso9660ArchivePlugin.cxx | 9 +++-- src/archive/ZzipArchivePlugin.cxx | 9 +++-- src/input/CdioParanoiaInputPlugin.cxx | 1 - src/refcount.h | 67 ----------------------------------- src/util/RefCount.hxx | 59 ++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 83 deletions(-) delete mode 100644 src/refcount.h create mode 100644 src/util/RefCount.hxx (limited to 'src') diff --git a/src/archive/Bzip2ArchivePlugin.cxx b/src/archive/Bzip2ArchivePlugin.cxx index be7388d5b..f93718128 100644 --- a/src/archive/Bzip2ArchivePlugin.cxx +++ b/src/archive/Bzip2ArchivePlugin.cxx @@ -29,7 +29,7 @@ #include "InputInternal.hxx" #include "InputStream.hxx" #include "InputPlugin.hxx" -#include "refcount.h" +#include "util/RefCount.hxx" #include #include @@ -45,18 +45,17 @@ struct Bzip2ArchiveFile { struct archive_file base; - struct refcount ref; + RefCount ref; char *name; struct input_stream *istream; Bzip2ArchiveFile() { archive_file_init(&base, &bz2_archive_plugin); - refcount_init(&ref); } void Unref() { - if (!refcount_dec(&ref)) + if (!ref.Decrement()) return; g_free(name); @@ -174,7 +173,7 @@ Bzip2InputStream::Bzip2InputStream(Bzip2ArchiveFile &_context, const char *uri, :base(bz2_inputplugin, uri, mutex, cond), archive(&_context), eof(false) { - refcount_inc(&archive->ref); + archive->ref.Increment(); } Bzip2InputStream::~Bzip2InputStream() diff --git a/src/archive/Iso9660ArchivePlugin.cxx b/src/archive/Iso9660ArchivePlugin.cxx index 895087efc..344cdac6a 100644 --- a/src/archive/Iso9660ArchivePlugin.cxx +++ b/src/archive/Iso9660ArchivePlugin.cxx @@ -29,7 +29,7 @@ #include "InputInternal.hxx" #include "InputStream.hxx" #include "InputPlugin.hxx" -#include "refcount.h" +#include "util/RefCount.hxx" #include #include @@ -44,14 +44,13 @@ struct Iso9660ArchiveFile { struct archive_file base; - struct refcount ref; + RefCount ref; iso9660_t *iso; Iso9660ArchiveFile(iso9660_t *_iso) :iso(_iso) { archive_file_init(&base, &iso9660_archive_plugin); - refcount_init(&ref); } ~Iso9660ArchiveFile() { @@ -59,7 +58,7 @@ struct Iso9660ArchiveFile { } void Unref() { - if (refcount_dec(&ref)) + if (ref.Decrement()) delete this; } @@ -161,7 +160,7 @@ struct Iso9660InputStream { base.ready = true; base.size = statbuf->size; - refcount_inc(&archive->ref); + archive->ref.Increment(); } ~Iso9660InputStream() { diff --git a/src/archive/ZzipArchivePlugin.cxx b/src/archive/ZzipArchivePlugin.cxx index 4075e2179..1b089a484 100644 --- a/src/archive/ZzipArchivePlugin.cxx +++ b/src/archive/ZzipArchivePlugin.cxx @@ -29,7 +29,7 @@ #include "InputInternal.hxx" #include "InputStream.hxx" #include "InputPlugin.hxx" -#include "refcount.h" +#include "util/RefCount.hxx" #include #include @@ -38,17 +38,16 @@ struct ZzipArchiveFile { struct archive_file base; - struct refcount ref; + RefCount ref; ZZIP_DIR *dir; ZzipArchiveFile() { archive_file_init(&base, &zzip_archive_plugin); - refcount_init(&ref); } void Unref() { - if (!refcount_dec(&ref)) + if (!ref.Decrement()) return; //close archive @@ -136,7 +135,7 @@ struct ZzipInputStream { zzip_file_stat(file, &z_stat); base.size = z_stat.st_size; - refcount_inc(&archive->ref); + archive->ref.Increment(); } ~ZzipInputStream() { diff --git a/src/input/CdioParanoiaInputPlugin.cxx b/src/input/CdioParanoiaInputPlugin.cxx index 942eefb99..f0fa835b3 100644 --- a/src/input/CdioParanoiaInputPlugin.cxx +++ b/src/input/CdioParanoiaInputPlugin.cxx @@ -26,7 +26,6 @@ #include "InputInternal.hxx" #include "InputStream.hxx" #include "InputPlugin.hxx" -#include "refcount.h" #include #include diff --git a/src/refcount.h b/src/refcount.h deleted file mode 100644 index a882d76b0..000000000 --- a/src/refcount.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2003-2011 The Music Player Daemon Project - * http://www.musicpd.org - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** \file - * - * A very simple reference counting library. - */ - -#ifndef MPD_REFCOUNT_H -#define MPD_REFCOUNT_H - -#include -#include - -struct refcount { - gint n; -}; - -static inline void -refcount_init(struct refcount *r) -{ - r->n = 1; -} - -static inline void -refcount_inc(struct refcount *r) -{ - g_atomic_int_inc(&r->n); -} - -/** - * @return true if the number of references has been dropped to 0 - */ -static inline bool -refcount_dec(struct refcount *r) -{ - return g_atomic_int_dec_and_test(&r->n); -} - -#endif diff --git a/src/util/RefCount.hxx b/src/util/RefCount.hxx new file mode 100644 index 000000000..9a45a585b --- /dev/null +++ b/src/util/RefCount.hxx @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2003-2013 The Music Player Daemon Project + * http://www.musicpd.org + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** \file + * + * A very simple reference counting library. + */ + +#ifndef MPD_REFCOUNT_HXX +#define MPD_REFCOUNT_HXX + +#include + +class RefCount { + std::atomic_uint n; + +public: + constexpr RefCount():n(1) {} + + void Increment() { + ++n; + } + + /** + * @return true if the number of references has been dropped to 0 + */ + bool Decrement() { + return --n == 0; + } +}; + +#endif -- cgit v1.2.3