Commit ba51045d authored by Max Kellermann's avatar Max Kellermann

refcount: convert to C++

parent fa34dd7b
...@@ -99,7 +99,6 @@ mpd_headers = \ ...@@ -99,7 +99,6 @@ mpd_headers = \
src/poison.h \ src/poison.h \
src/riff.h \ src/riff.h \
src/aiff.h \ src/aiff.h \
src/refcount.h \
src/replay_gain_config.h \ src/replay_gain_config.h \
src/replay_gain_info.h \ src/replay_gain_info.h \
src/replay_gain_ape.h \ src/replay_gain_ape.h \
...@@ -310,6 +309,7 @@ endif ...@@ -310,6 +309,7 @@ endif
# Generic utility library # Generic utility library
libutil_a_SOURCES = \ libutil_a_SOURCES = \
src/util/RefCount.hxx \
src/util/fifo_buffer.c src/util/fifo_buffer.h \ src/util/fifo_buffer.c src/util/fifo_buffer.h \
src/util/growing_fifo.c src/util/growing_fifo.h \ src/util/growing_fifo.c src/util/growing_fifo.h \
src/util/LazyRandomEngine.cxx src/util/LazyRandomEngine.hxx \ src/util/LazyRandomEngine.cxx src/util/LazyRandomEngine.hxx \
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "InputInternal.hxx" #include "InputInternal.hxx"
#include "InputStream.hxx" #include "InputStream.hxx"
#include "InputPlugin.hxx" #include "InputPlugin.hxx"
#include "refcount.h" #include "util/RefCount.hxx"
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
...@@ -45,18 +45,17 @@ ...@@ -45,18 +45,17 @@
struct Bzip2ArchiveFile { struct Bzip2ArchiveFile {
struct archive_file base; struct archive_file base;
struct refcount ref; RefCount ref;
char *name; char *name;
struct input_stream *istream; struct input_stream *istream;
Bzip2ArchiveFile() { Bzip2ArchiveFile() {
archive_file_init(&base, &bz2_archive_plugin); archive_file_init(&base, &bz2_archive_plugin);
refcount_init(&ref);
} }
void Unref() { void Unref() {
if (!refcount_dec(&ref)) if (!ref.Decrement())
return; return;
g_free(name); g_free(name);
...@@ -174,7 +173,7 @@ Bzip2InputStream::Bzip2InputStream(Bzip2ArchiveFile &_context, const char *uri, ...@@ -174,7 +173,7 @@ Bzip2InputStream::Bzip2InputStream(Bzip2ArchiveFile &_context, const char *uri,
:base(bz2_inputplugin, uri, mutex, cond), :base(bz2_inputplugin, uri, mutex, cond),
archive(&_context), eof(false) archive(&_context), eof(false)
{ {
refcount_inc(&archive->ref); archive->ref.Increment();
} }
Bzip2InputStream::~Bzip2InputStream() Bzip2InputStream::~Bzip2InputStream()
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "InputInternal.hxx" #include "InputInternal.hxx"
#include "InputStream.hxx" #include "InputStream.hxx"
#include "InputPlugin.hxx" #include "InputPlugin.hxx"
#include "refcount.h" #include "util/RefCount.hxx"
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/iso9660.h> #include <cdio/iso9660.h>
...@@ -44,14 +44,13 @@ ...@@ -44,14 +44,13 @@
struct Iso9660ArchiveFile { struct Iso9660ArchiveFile {
struct archive_file base; struct archive_file base;
struct refcount ref; RefCount ref;
iso9660_t *iso; iso9660_t *iso;
Iso9660ArchiveFile(iso9660_t *_iso) Iso9660ArchiveFile(iso9660_t *_iso)
:iso(_iso) { :iso(_iso) {
archive_file_init(&base, &iso9660_archive_plugin); archive_file_init(&base, &iso9660_archive_plugin);
refcount_init(&ref);
} }
~Iso9660ArchiveFile() { ~Iso9660ArchiveFile() {
...@@ -59,7 +58,7 @@ struct Iso9660ArchiveFile { ...@@ -59,7 +58,7 @@ struct Iso9660ArchiveFile {
} }
void Unref() { void Unref() {
if (refcount_dec(&ref)) if (ref.Decrement())
delete this; delete this;
} }
...@@ -161,7 +160,7 @@ struct Iso9660InputStream { ...@@ -161,7 +160,7 @@ struct Iso9660InputStream {
base.ready = true; base.ready = true;
base.size = statbuf->size; base.size = statbuf->size;
refcount_inc(&archive->ref); archive->ref.Increment();
} }
~Iso9660InputStream() { ~Iso9660InputStream() {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "InputInternal.hxx" #include "InputInternal.hxx"
#include "InputStream.hxx" #include "InputStream.hxx"
#include "InputPlugin.hxx" #include "InputPlugin.hxx"
#include "refcount.h" #include "util/RefCount.hxx"
#include <zzip/zzip.h> #include <zzip/zzip.h>
#include <glib.h> #include <glib.h>
...@@ -38,17 +38,16 @@ ...@@ -38,17 +38,16 @@
struct ZzipArchiveFile { struct ZzipArchiveFile {
struct archive_file base; struct archive_file base;
struct refcount ref; RefCount ref;
ZZIP_DIR *dir; ZZIP_DIR *dir;
ZzipArchiveFile() { ZzipArchiveFile() {
archive_file_init(&base, &zzip_archive_plugin); archive_file_init(&base, &zzip_archive_plugin);
refcount_init(&ref);
} }
void Unref() { void Unref() {
if (!refcount_dec(&ref)) if (!ref.Decrement())
return; return;
//close archive //close archive
...@@ -136,7 +135,7 @@ struct ZzipInputStream { ...@@ -136,7 +135,7 @@ struct ZzipInputStream {
zzip_file_stat(file, &z_stat); zzip_file_stat(file, &z_stat);
base.size = z_stat.st_size; base.size = z_stat.st_size;
refcount_inc(&archive->ref); archive->ref.Increment();
} }
~ZzipInputStream() { ~ZzipInputStream() {
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "InputInternal.hxx" #include "InputInternal.hxx"
#include "InputStream.hxx" #include "InputStream.hxx"
#include "InputPlugin.hxx" #include "InputPlugin.hxx"
#include "refcount.h"
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
......
/* /*
* Copyright (C) 2003-2011 The Music Player Daemon Project * Copyright (C) 2003-2013 The Music Player Daemon Project
* http://www.musicpd.org * http://www.musicpd.org
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
...@@ -33,35 +33,27 @@ ...@@ -33,35 +33,27 @@
* A very simple reference counting library. * A very simple reference counting library.
*/ */
#ifndef MPD_REFCOUNT_H #ifndef MPD_REFCOUNT_HXX
#define MPD_REFCOUNT_H #define MPD_REFCOUNT_HXX
#include <glib.h> #include <atomic>
#include <stdbool.h>
struct refcount { class RefCount {
gint n; std::atomic_uint n;
};
static inline void public:
refcount_init(struct refcount *r) constexpr RefCount():n(1) {}
{
r->n = 1;
}
static inline void void Increment() {
refcount_inc(struct refcount *r) ++n;
{ }
g_atomic_int_inc(&r->n);
}
/** /**
* @return true if the number of references has been dropped to 0 * @return true if the number of references has been dropped to 0
*/ */
static inline bool bool Decrement() {
refcount_dec(struct refcount *r) return --n == 0;
{ }
return g_atomic_int_dec_and_test(&r->n); };
}
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment