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