refcount: convert to C++
This commit is contained in:
		@@ -99,7 +99,6 @@ mpd_headers = \
 | 
			
		||||
	src/poison.h \
 | 
			
		||||
	src/riff.h \
 | 
			
		||||
	src/aiff.h \
 | 
			
		||||
	src/refcount.h \
 | 
			
		||||
	src/replay_gain_config.h \
 | 
			
		||||
	src/replay_gain_info.h \
 | 
			
		||||
	src/replay_gain_ape.h \
 | 
			
		||||
@@ -310,6 +309,7 @@ endif
 | 
			
		||||
# Generic utility library
 | 
			
		||||
 | 
			
		||||
libutil_a_SOURCES = \
 | 
			
		||||
	src/util/RefCount.hxx \
 | 
			
		||||
	src/util/fifo_buffer.c src/util/fifo_buffer.h \
 | 
			
		||||
	src/util/growing_fifo.c src/util/growing_fifo.h \
 | 
			
		||||
	src/util/LazyRandomEngine.cxx src/util/LazyRandomEngine.hxx \
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
#include "InputInternal.hxx"
 | 
			
		||||
#include "InputStream.hxx"
 | 
			
		||||
#include "InputPlugin.hxx"
 | 
			
		||||
#include "refcount.h"
 | 
			
		||||
#include "util/RefCount.hxx"
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
#include "InputInternal.hxx"
 | 
			
		||||
#include "InputStream.hxx"
 | 
			
		||||
#include "InputPlugin.hxx"
 | 
			
		||||
#include "refcount.h"
 | 
			
		||||
#include "util/RefCount.hxx"
 | 
			
		||||
 | 
			
		||||
#include <cdio/cdio.h>
 | 
			
		||||
#include <cdio/iso9660.h>
 | 
			
		||||
@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
#include "InputInternal.hxx"
 | 
			
		||||
#include "InputStream.hxx"
 | 
			
		||||
#include "InputPlugin.hxx"
 | 
			
		||||
#include "refcount.h"
 | 
			
		||||
#include "util/RefCount.hxx"
 | 
			
		||||
 | 
			
		||||
#include <zzip/zzip.h>
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
#include "InputInternal.hxx"
 | 
			
		||||
#include "InputStream.hxx"
 | 
			
		||||
#include "InputPlugin.hxx"
 | 
			
		||||
#include "refcount.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.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
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -33,35 +33,27 @@
 | 
			
		||||
 * A very simple reference counting library.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MPD_REFCOUNT_H
 | 
			
		||||
#define MPD_REFCOUNT_H
 | 
			
		||||
#ifndef MPD_REFCOUNT_HXX
 | 
			
		||||
#define MPD_REFCOUNT_HXX
 | 
			
		||||
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
struct refcount {
 | 
			
		||||
	gint n;
 | 
			
		||||
};
 | 
			
		||||
class RefCount {
 | 
			
		||||
	std::atomic_uint n;
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
refcount_init(struct refcount *r)
 | 
			
		||||
{
 | 
			
		||||
	r->n = 1;
 | 
			
		||||
}
 | 
			
		||||
public:
 | 
			
		||||
	constexpr RefCount():n(1) {}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
refcount_inc(struct refcount *r)
 | 
			
		||||
{
 | 
			
		||||
	g_atomic_int_inc(&r->n);
 | 
			
		||||
}
 | 
			
		||||
	void Increment() {
 | 
			
		||||
		++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);
 | 
			
		||||
}
 | 
			
		||||
	bool Decrement() {
 | 
			
		||||
		return --n == 0;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user