1// Copyright 2006 Google Inc. All Rights Reserved. 2 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6 7// http://www.apache.org/licenses/LICENSE-2.0 8 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// queue.h : simple queue api 16 17// This is an interface to a simple thread safe queue, 18// used to hold data blocks and patterns. 19// The order in which the blocks are returned is random. 20 21#ifndef STRESSAPPTEST_QUEUE_H_ // NOLINT 22#define STRESSAPPTEST_QUEUE_H_ 23 24#include <sys/types.h> 25#include <pthread.h> 26 27// This file must work with autoconf on its public version, 28// so these includes are correct. 29#include "sattypes.h" // NOLINT 30#include "pattern.h" // NOLINT 31 32// Tag indicating no preference. 33static const int kDontCareTag = -1; 34// Tag indicating no preference. 35static const int kInvalidTag = 0xf001; 36 37 38// This describes a block of memory, and the expected fill pattern. 39struct page_entry { 40 uint64 offset; 41 void *addr; 42 uint64 paddr; 43 class Pattern *pattern; 44 int32 tag; // These are tags for use in NUMA affinity or other uses. 45 uint32 touch; // Counter of the number of reads from this page. 46 uint64 ts; // Timestamp of the last read from this page. 47 class Pattern *lastpattern; // Expected Pattern at last read. 48}; 49 50static inline void init_pe(struct page_entry *pe) { 51 pe->offset = 0; 52 pe->addr = NULL; 53 pe->pattern = NULL; 54 pe->tag = kInvalidTag; 55 pe->touch = 0; 56 pe->ts = 0; 57 pe->lastpattern = NULL; 58} 59 60// This is a threadsafe randomized queue of pages for 61// worker threads to use. 62class PageEntryQueue { 63 public: 64 explicit PageEntryQueue(uint64 queuesize); 65 ~PageEntryQueue(); 66 67 // Push a page onto the list. 68 int Push(struct page_entry *pe); 69 // Pop a random page off of the list. 70 int PopRandom(struct page_entry *pe); 71 72 private: 73 struct page_entry *pages_; // Where the pages are held. 74 int64 nextin_; 75 int64 nextout_; 76 int64 q_size_; // Size of the queue. 77 int64 pushed_; // Number of pages pushed, total. 78 int64 popped_; // Number of pages popped, total. 79 pthread_mutex_t q_mutex_; 80 81 DISALLOW_COPY_AND_ASSIGN(PageEntryQueue); 82}; 83 84 85#endif // MILES_TESTS_SAT_QUEUE_H_ NOLINT 86