sattypes.h revision b0114cb9f332db144f65291211ae65f7f0e814e6
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2006 Google Inc. All Rights Reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Licensed under the Apache License, Version 2.0 (the "License"); 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// you may not use this file except in compliance with the License. 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// You may obtain a copy of the License at 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// http://www.apache.org/licenses/LICENSE-2.0 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Unless required by applicable law or agreed to in writing, software 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// distributed under the License is distributed on an "AS IS" BASIS, 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// See the License for the specific language governing permissions and 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// limitations under the License. 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef STRESSAPPTEST_SATTYPES_H_ 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define STRESSAPPTEST_SATTYPES_H_ 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <arpa/inet.h> 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <sched.h> 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <stdio.h> 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <stdlib.h> 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <sys/types.h> 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <time.h> 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <string.h> 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <algorithm> 26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <string> 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#ifdef HAVE_CONFIG_H // Built using autoconf 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "stressapptest_config.h" 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing namespace std; 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing namespace __gnu_cxx; 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef signed long long int64; 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef signed int int32; 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef signed short int int16; 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef signed char int8; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef unsigned long long uint64; 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef unsigned int uint32; 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef unsigned short uint16; 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef unsigned char uint8; 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TypeName(const TypeName&); \ 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void operator=(const TypeName&) 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinline const char* Timestamp() { 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return STRESSAPPTEST_TIMESTAMP; 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinline const char* BuildChangelist() { 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return "open source release"; 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const bool kOpenSource = true; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const bool kOpenSource = false; 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #include "googlesattypes.h" 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Workaround to allow 32/64 bit conversion 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// without running into strict aliasing problems. 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochunion datacast_t { 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint64 l64; 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch struct { 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 l; 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 h; 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } l32; 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// File sync'd print to console and log 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid logprintf(int priority, const char *format, ...); 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// We print to stderr ourselves first in case we're in such a bad state that the 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// logger can't work. 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define sat_assert(x) \ 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{\ 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!(x)) {\ 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fprintf(stderr, "Assertion failed at %s:%d\n", __FILE__, __LINE__);\ 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch logprintf(0, "Assertion failed at %s:%d\n", __FILE__, __LINE__);\ 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch exit(1);\ 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }\ 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(CPU_SETSIZE) 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Define type and macros for cpu mask operations 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Note: this code is hacked together to deal with difference 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // function signatures across versions of glibc, ie those that take 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // cpu_set_t versus those that take unsigned long. -johnhuang 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef uint64 cpu_set_t; 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #define CPU_SETSIZE (sizeof(cpu_set_t) * 8) 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #define CPU_ISSET(index, cpu_set_ptr) (*(cpu_set_ptr) & 1ull << (index)) 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #define CPU_SET(index, cpu_set_ptr) (*(cpu_set_ptr) |= 1ull << (index)) 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #define CPU_ZERO(cpu_set_ptr) (*(cpu_set_ptr) = 0) 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch #define CPU_CLR(index, cpu_set_ptr) (*(cpu_set_ptr) &= ~(1ull << (index))) 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline bool cpuset_isequal(const cpu_set_t *c1, const cpu_set_t *c2) { 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < CPU_SETSIZE; ++i) 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((CPU_ISSET(i, c1) != 0) != (CPU_ISSET(i, c2) != 0)) 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline bool cpuset_issubset(const cpu_set_t *c1, const cpu_set_t *c2) { 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < CPU_SETSIZE; ++i) 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CPU_ISSET(i, c1) && !CPU_ISSET(i, c2)) 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline int cpuset_count(const cpu_set_t *cpuset) { 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int count = 0; 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < CPU_SETSIZE; ++i) 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CPU_ISSET(i, cpuset)) 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++count; 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return count; 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline void cpuset_set_ab(cpu_set_t *cpuset, int a, int b) { 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CPU_ZERO(cpuset); 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = a; i < b; ++i) 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CPU_SET(i, cpuset); 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline string cpuset_format(const cpu_set_t *cpuset) { 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch string format; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int digit = 0, last_non_zero_size = 1; 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < CPU_SETSIZE; ++i) { 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CPU_ISSET(i, cpuset)) { 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch digit |= 1 << (i & 3); 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((i & 3) == 3) { 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch format += char(digit <= 9 ? '0' + digit: 'A' + digit - 10); 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (digit) { 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch last_non_zero_size = format.size(); 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch digit = 0; 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (digit) { 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch format += char(digit <= 9 ? '0' + digit: 'A' + digit - 10); 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch last_non_zero_size = format.size(); 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch format.erase(last_non_zero_size); 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch reverse(format.begin(), format.end()); 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return format; 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int32 kUSleepOneSecond = 1000000; 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This is guaranteed not to use signals. 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinline bool sat_usleep(int32 microseconds) { 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch timespec req; 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch req.tv_sec = microseconds / 1000000; 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Convert microseconds argument to nano seconds. 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch req.tv_nsec = (microseconds % 1000000) * 1000; 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return nanosleep(&req, NULL) == 0; 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This is guaranteed not to use signals. 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinline bool sat_sleep(time_t seconds) { 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch timespec req; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch req.tv_sec = seconds; 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch req.tv_nsec = 0; 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return nanosleep(&req, NULL) == 0; 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Get an error code description for use in error messages. 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Args: 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// error_num: an errno error code 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochinline string ErrorString(int error_num) { 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch char buf[256]; 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return string(strerror_r(error_num, buf, sizeof buf)); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Define handy constants here 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const int kTicksPerSec = 100; 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const int kMegabyte = (1024LL*1024LL); 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int kSatDiskPageMax = 32; 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int kSatDiskPage = 8; 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int kSatPageSize = (1024LL*1024LL); 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int kCacheLineSize = 64; 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const uint16_t kNetworkPort = 19996; 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // STRESSAPPTEST_SATTYPES_H_ 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch