/*
 * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 * All Rights Reserved
 *
 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
 *
 * 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.
 *
 */

/*! \addtogroup thread
 *  @{
 * \file thread.c
 */

/*! \file thread.c
 */

#include "config.h"

/* If HAVE_GETTID, then "_GNU_SOURCE" may need to be defined to use gettid() */
#if HAVE_GETTID
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif /* ifndef _GNU_SOURCE */
#endif /* if HAVE_GETTID */
#include <unistd.h>
#include <sys/types.h>

#include <osmocom/core/thread.h>

/*! Wrapper around Linux's gettid() to make it easily accessible on different system versions.
 * If the gettid() API cannot be found, it will use the syscall directly if
 * available. If no syscall is found available, then getpid() is called as
 * fallback. See 'man 2 gettid' for further and details information.
 * \returns This call is always successful and returns returns the thread ID of
 *          the calling thread (or the process ID of the current process if
 *          gettid() or its syscall are unavailable in the system).
 */
pid_t osmo_gettid(void)
{
#if HAVE_GETTID
	return gettid();
#elif defined(LINUX) && defined(__NR_gettid)
	return (pid_t) syscall(__NR_gettid);
#else
	#pragma message ("use pid as tid")
	return getpid();
#endif
}
