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