refcount: convert to C++
This commit is contained in:
		@@ -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
 | 
				
			|||||||
# 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 @@
 | 
				
			|||||||
#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 @@
 | 
				
			|||||||
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,
 | 
				
			|||||||
	: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 @@
 | 
				
			|||||||
#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 @@
 | 
				
			|||||||
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 {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Unref() {
 | 
						void Unref() {
 | 
				
			||||||
		if (refcount_dec(&ref))
 | 
							if (ref.Decrement())
 | 
				
			||||||
			delete this;
 | 
								delete this;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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 @@
 | 
				
			|||||||
#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 @@
 | 
				
			|||||||
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 {
 | 
				
			|||||||
		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 @@
 | 
				
			|||||||
#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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * 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 @@
 | 
				
			|||||||
 * 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
					#endif
 | 
				
			||||||
		Reference in New Issue
	
	Block a user