summaryrefslogtreecommitdiffstats
path: root/nsframework/framework_unified/client/NS_UtilityCenter/src/ns_utility.cpp
blob: d9e6776c8c38fcf423dc7632a8889cabef4d2522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <native_service/ns_utility_if.h>
#include <native_service/ns_utility_sys.hpp>
#include <stdlib.h>
#include <ctime>
#include <cstring>
#include "ns_utility_sys_internal.hpp"
#include "ns_utility_if_internal.h"
// Random functions ////////////////////////////////////////////////////
void utility_sys_seedrand() {  // NOLINT (readability/nolint)
  static bool s_seeded = false;
  if (!s_seeded) {
    s_seeded = true;
    srand48(std::time(NULL));
  }
}

UI_32 utility_sys_rand() {  // NOLINT (readability/nolint)
  utility_sys_seedrand();
  return static_cast< UI_32 >(mrand48());
}

// Lock wrapper implementation /////////////////////////////////////

///////////////////////////////////////////
// Implements locking policy for mutexes //
///////////////////////////////////////////

// CMutex helper function
template< class TErr >
void MutexLock(pthread_mutex_t *mtx) {
  if (EOK != pthread_mutex_lock(mtx)) {
    throw TErr("");
  }
}

CMutex::CMutex() {
  pthread_mutex_t mtx_tmp = PTHREAD_MUTEX_INITIALIZER;
  std::memcpy(&m_mtx, &mtx_tmp, sizeof(m_mtx));
  if (EOK != pthread_mutex_init(&m_mtx, NULL)) {
    throw lock_creation_error();
  }
}

CMutex::~CMutex() {
  pthread_mutex_destroy(&m_mtx);
}

void CMutex::ReadLock() {
  MutexLock< lock_acquireread_error >(&m_mtx);
}

void CMutex::WriteLock() {
  MutexLock< lock_acquirewrite_error >(&m_mtx);
}

void CMutex::Unlock() {
  if (EOK != pthread_mutex_unlock(&m_mtx)) {
    throw lock_release_error("");
  }
}


/////////////////////////////////////////////////////////
// implements locking policy for reader / writer locks //
/////////////////////////////////////////////////////////
CRWLock::CRWLock() {
  pthread_rwlock_t rw_tmp = PTHREAD_RWLOCK_INITIALIZER;
  std::memcpy(&m_rwl, &rw_tmp, sizeof(m_rwl));
  if (EOK != pthread_rwlock_init(&m_rwl, NULL)) {
    throw lock_creation_error();
  }
}

CRWLock::~CRWLock() {
  pthread_rwlock_destroy(&m_rwl);
}

void CRWLock::ReadLock() {
  if (EOK != pthread_rwlock_rdlock(&m_rwl)) {
    throw lock_acquireread_error();
  }
}

void CRWLock::WriteLock() {
  if (EOK != pthread_rwlock_wrlock(&m_rwl)) {
    throw lock_acquirewrite_error();
  }
}

void CRWLock::Unlock() {
  if (EOK != pthread_rwlock_unlock(&m_rwl)) {
    throw lock_release_error();
  }
}

/////////////////////////////////////////////////////////
// implements GNU Builtins for counting leading zeros  //
/////////////////////////////////////////////////////////

// returns the number of leading zeros in a given 16bit value
SI_16 NS_CountLeadingZeros_16Bit(UI_16 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_clz(f_ui_val));  // NOLINT (readability/nolint)
}

// returns the number of leading zeros in a given 32bit value
SI_16 NS_CountLeadingZeros_32Bit(UI_32 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_clzl(f_ui_val));  // NOLINT (readability/nolint)
}

// returns the number of leading zeros in a given 64bit value
SI_16 NS_CountLeadingZeros_64Bit(UI_64 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_clzll(f_ui_val));  // NOLINT (readability/nolint)
}

// returns the number of trailing zeros in a given 16bit value
SI_16 NS_CountTrailingZeros_16Bit(UI_16 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_ctz(f_ui_val));  // NOLINT (readability/nolint)
}

// returns the number of trailing zeros in a given 32bit value
SI_16 NS_CountTrailingZeros_32Bit(UI_32 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_ctzl(f_ui_val));  // NOLINT (readability/nolint)
}

// returns the number of trailing zeros in a given 64bit value
SI_16 NS_CountTrailingZeros_64Bit(UI_64 f_ui_val) {  // NOLINT (readability/nolint)
  return static_cast<SI_16>((f_ui_val == 0) ? NS_INVALID_RETURN : __builtin_ctzll(f_ui_val));  // NOLINT (readability/nolint)
}