Id.hxx 1.96 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright (C) 2003-2014 The Music Player Daemon Project
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 * http://www.musicpd.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef MPD_THREAD_ID_HXX
#define MPD_THREAD_ID_HXX

23
#include "Compiler.h"
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#ifdef WIN32
#include <windows.h>
#else
#include <pthread.h>
#endif

/**
 * A low-level identification for a thread.  Designed to work with
 * existing threads, such as the main thread.  Mostly useful for
 * debugging code.
 */
class ThreadId {
#ifdef WIN32
	DWORD id;
#else
	pthread_t id;
#endif

public:
	/**
	 * No initialisation.
	 */
	ThreadId() = default;

#ifdef WIN32
	constexpr ThreadId(DWORD _id):id(_id) {}
#else
	constexpr ThreadId(pthread_t _id):id(_id) {}
#endif

	gcc_const
	static ThreadId Null() {
#ifdef WIN32
		return 0;
#else
		static ThreadId null;
		return null;
#endif
	}

	gcc_pure
	bool IsNull() const {
		return *this == Null();
	}

	/**
	 * Return the current thread's id .
	 */
	gcc_pure
	static const ThreadId GetCurrent() {
#ifdef WIN32
		return ::GetCurrentThreadId();
#else
78
		return pthread_self();
79 80 81 82 83 84 85 86
#endif
	}

	gcc_pure
	bool operator==(const ThreadId &other) const {
#ifdef WIN32
		return id == other.id;
#else
87
		return pthread_equal(id, other.id);
88 89 90 91 92 93 94 95 96 97 98 99
#endif
	}

	/**
	 * Check if this thread is the current thread.
	 */
	bool IsInside() const {
		return *this == GetCurrent();
	}
};

#endif