1/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 *     Copyright 2016 Couchbase, Inc
4 *
5 *   Licensed under the Apache License, Version 2.0 (the "License");
6 *   you may not use this file except in compliance with the License.
7 *   You may obtain a copy of the License at
8 *
9 *       http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *   Unless required by applicable law or agreed to in writing, software
12 *   distributed under the License is distributed on an "AS IS" BASIS,
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *   See the License for the specific language governing permissions and
15 *   limitations under the License.
16 */
17
18#pragma once
19
20#include <cstdint>
21
22#include "core.h"
23
24#if __APPLE__
25/*
26 * Apple's clang is awkward and disables thread_local keyword support
27 * @todo Fixed in XCode 8 (MacOS 10.11.5 / 10.12 or later)
28 */
29#define THREAD_LOCAL __thread
30#else
31#define THREAD_LOCAL thread_local
32#endif
33
34namespace phosphor {
35    namespace platform {
36
37        /**
38         * Get the system process id for the calling process
39         *
40         * This is a platform abstraction for getting the process id
41         * and will likely require reimplementation for different
42         * platforms.
43         *
44         * @return process id for the calling process
45         */
46        PHOSPHOR_API
47        int getCurrentProcessID();
48
49        /**
50         * Get the system thread id for the calling thread
51         *
52         * This is a platform abstraction for getting the thread id
53         * and will likely require reimplementation for different
54         * platforms.
55         *
56         * @return thread id for the calling thread
57         */
58        PHOSPHOR_API
59        uint32_t getCurrentThreadID();
60
61        /**
62         * Get the cached system thread id for the calling thread
63         *
64         * This is virtually identical to getCurrentThreadID()
65         * except the thread id is cached in a thread local
66         * variable for performance reasons (e.g. to avoid a
67         * syscall in a given platform abstraction).
68         *
69         * This function is inline as it is expected performance
70         * is important if the cached version is used.
71         *
72         * @return thread id for the calling thread
73         */
74        inline uint32_t getCurrentThreadIDCached() {
75            static THREAD_LOCAL uint32_t thread_id;
76
77            if (unlikely(!thread_id)) {
78                thread_id = getCurrentThreadID();
79            }
80
81            return thread_id;
82        }
83    }
84}
85