xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deBlockBuffer.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements C++ Base Library
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Block-based thread-safe queue.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "deBlockBuffer.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deThread.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
28*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include <vector>
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace de
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker using std::vector;
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker namespace BlockBufferBasicTest
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker struct Message
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker     uint32_t data;
43*35238bceSAndroid Build Coastguard Worker 
Messagede::BlockBufferBasicTest::Message44*35238bceSAndroid Build Coastguard Worker     Message(uint16_t threadId, uint16_t payload) : data((threadId << 16) | payload)
45*35238bceSAndroid Build Coastguard Worker     {
46*35238bceSAndroid Build Coastguard Worker     }
47*35238bceSAndroid Build Coastguard Worker 
Messagede::BlockBufferBasicTest::Message48*35238bceSAndroid Build Coastguard Worker     Message(void) : data(0)
49*35238bceSAndroid Build Coastguard Worker     {
50*35238bceSAndroid Build Coastguard Worker     }
51*35238bceSAndroid Build Coastguard Worker 
getThreadIdde::BlockBufferBasicTest::Message52*35238bceSAndroid Build Coastguard Worker     uint16_t getThreadId(void) const
53*35238bceSAndroid Build Coastguard Worker     {
54*35238bceSAndroid Build Coastguard Worker         return (uint16_t)(data >> 16);
55*35238bceSAndroid Build Coastguard Worker     }
getPayloadde::BlockBufferBasicTest::Message56*35238bceSAndroid Build Coastguard Worker     uint16_t getPayload(void) const
57*35238bceSAndroid Build Coastguard Worker     {
58*35238bceSAndroid Build Coastguard Worker         return (uint16_t)(data & 0xffff);
59*35238bceSAndroid Build Coastguard Worker     }
60*35238bceSAndroid Build Coastguard Worker };
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker typedef BlockBuffer<Message> MessageBuffer;
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker class Consumer : public Thread
65*35238bceSAndroid Build Coastguard Worker {
66*35238bceSAndroid Build Coastguard Worker public:
Consumer(MessageBuffer & buffer,int numProducers)67*35238bceSAndroid Build Coastguard Worker     Consumer(MessageBuffer &buffer, int numProducers) : m_buffer(buffer)
68*35238bceSAndroid Build Coastguard Worker     {
69*35238bceSAndroid Build Coastguard Worker         m_lastPayload.resize(numProducers, 0);
70*35238bceSAndroid Build Coastguard Worker         m_payloadSum.resize(numProducers, 0);
71*35238bceSAndroid Build Coastguard Worker     }
72*35238bceSAndroid Build Coastguard Worker 
run(void)73*35238bceSAndroid Build Coastguard Worker     void run(void)
74*35238bceSAndroid Build Coastguard Worker     {
75*35238bceSAndroid Build Coastguard Worker         Random rnd((uint32_t)m_lastPayload.size());
76*35238bceSAndroid Build Coastguard Worker         Message tmpBuf[64];
77*35238bceSAndroid Build Coastguard Worker         bool consume = true;
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker         while (consume)
80*35238bceSAndroid Build Coastguard Worker         {
81*35238bceSAndroid Build Coastguard Worker             int numToRead = rnd.getInt(1, DE_LENGTH_OF_ARRAY(tmpBuf));
82*35238bceSAndroid Build Coastguard Worker             int numRead   = m_buffer.tryRead(numToRead, &tmpBuf[0]);
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < numRead; ndx++)
85*35238bceSAndroid Build Coastguard Worker             {
86*35238bceSAndroid Build Coastguard Worker                 const Message &msg = tmpBuf[ndx];
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker                 uint16_t threadId = msg.getThreadId();
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker                 if (threadId == 0xffff)
91*35238bceSAndroid Build Coastguard Worker                 {
92*35238bceSAndroid Build Coastguard Worker                     /* Feed back rest of messages to buffer (they are end messages) so other consumers wake up. */
93*35238bceSAndroid Build Coastguard Worker                     if (ndx + 1 < numRead)
94*35238bceSAndroid Build Coastguard Worker                     {
95*35238bceSAndroid Build Coastguard Worker                         m_buffer.write(numRead - ndx - 1, &tmpBuf[ndx + 1]);
96*35238bceSAndroid Build Coastguard Worker                         m_buffer.flush();
97*35238bceSAndroid Build Coastguard Worker                     }
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker                     consume = false;
100*35238bceSAndroid Build Coastguard Worker                     break;
101*35238bceSAndroid Build Coastguard Worker                 }
102*35238bceSAndroid Build Coastguard Worker                 else
103*35238bceSAndroid Build Coastguard Worker                 {
104*35238bceSAndroid Build Coastguard Worker                     /* Verify message. */
105*35238bceSAndroid Build Coastguard Worker                     DE_TEST_ASSERT(de::inBounds<int>(threadId, 0, (int)m_lastPayload.size()));
106*35238bceSAndroid Build Coastguard Worker                     DE_TEST_ASSERT((m_lastPayload[threadId] == 0 && msg.getPayload() == 0) ||
107*35238bceSAndroid Build Coastguard Worker                                    m_lastPayload[threadId] < msg.getPayload());
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker                     m_lastPayload[threadId] = msg.getPayload();
110*35238bceSAndroid Build Coastguard Worker                     m_payloadSum[threadId] += (uint32_t)msg.getPayload();
111*35238bceSAndroid Build Coastguard Worker                 }
112*35238bceSAndroid Build Coastguard Worker             }
113*35238bceSAndroid Build Coastguard Worker         }
114*35238bceSAndroid Build Coastguard Worker     }
115*35238bceSAndroid Build Coastguard Worker 
getPayloadSum(uint16_t threadId) const116*35238bceSAndroid Build Coastguard Worker     uint32_t getPayloadSum(uint16_t threadId) const
117*35238bceSAndroid Build Coastguard Worker     {
118*35238bceSAndroid Build Coastguard Worker         return m_payloadSum[threadId];
119*35238bceSAndroid Build Coastguard Worker     }
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker private:
122*35238bceSAndroid Build Coastguard Worker     MessageBuffer &m_buffer;
123*35238bceSAndroid Build Coastguard Worker     vector<uint16_t> m_lastPayload;
124*35238bceSAndroid Build Coastguard Worker     vector<uint32_t> m_payloadSum;
125*35238bceSAndroid Build Coastguard Worker };
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker class Producer : public Thread
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker public:
Producer(MessageBuffer & buffer,uint16_t threadId,int numMessages)130*35238bceSAndroid Build Coastguard Worker     Producer(MessageBuffer &buffer, uint16_t threadId, int numMessages)
131*35238bceSAndroid Build Coastguard Worker         : m_buffer(buffer)
132*35238bceSAndroid Build Coastguard Worker         , m_threadId(threadId)
133*35238bceSAndroid Build Coastguard Worker         , m_numMessages(numMessages)
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker     }
136*35238bceSAndroid Build Coastguard Worker 
run(void)137*35238bceSAndroid Build Coastguard Worker     void run(void)
138*35238bceSAndroid Build Coastguard Worker     {
139*35238bceSAndroid Build Coastguard Worker         // Yield to give main thread chance to start other producers.
140*35238bceSAndroid Build Coastguard Worker         deSleep(1);
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker         Random rnd(m_threadId);
143*35238bceSAndroid Build Coastguard Worker         int msgNdx = 0;
144*35238bceSAndroid Build Coastguard Worker         Message tmpBuf[64];
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker         while (msgNdx < m_numMessages)
147*35238bceSAndroid Build Coastguard Worker         {
148*35238bceSAndroid Build Coastguard Worker             int writeSize = rnd.getInt(1, de::min(m_numMessages - msgNdx, DE_LENGTH_OF_ARRAY(tmpBuf)));
149*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < writeSize; ndx++)
150*35238bceSAndroid Build Coastguard Worker                 tmpBuf[ndx] = Message(m_threadId, (uint16_t)msgNdx++);
151*35238bceSAndroid Build Coastguard Worker 
152*35238bceSAndroid Build Coastguard Worker             m_buffer.write(writeSize, &tmpBuf[0]);
153*35238bceSAndroid Build Coastguard Worker             if (rnd.getBool())
154*35238bceSAndroid Build Coastguard Worker                 m_buffer.flush();
155*35238bceSAndroid Build Coastguard Worker         }
156*35238bceSAndroid Build Coastguard Worker     }
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker private:
159*35238bceSAndroid Build Coastguard Worker     MessageBuffer &m_buffer;
160*35238bceSAndroid Build Coastguard Worker     uint16_t m_threadId;
161*35238bceSAndroid Build Coastguard Worker     int m_numMessages;
162*35238bceSAndroid Build Coastguard Worker };
163*35238bceSAndroid Build Coastguard Worker 
runTest(void)164*35238bceSAndroid Build Coastguard Worker void runTest(void)
165*35238bceSAndroid Build Coastguard Worker {
166*35238bceSAndroid Build Coastguard Worker     const int numIterations = 8;
167*35238bceSAndroid Build Coastguard Worker     for (int iterNdx = 0; iterNdx < numIterations; iterNdx++)
168*35238bceSAndroid Build Coastguard Worker     {
169*35238bceSAndroid Build Coastguard Worker         Random rnd(iterNdx);
170*35238bceSAndroid Build Coastguard Worker         int numBlocks    = rnd.getInt(2, 128);
171*35238bceSAndroid Build Coastguard Worker         int blockSize    = rnd.getInt(1, 16);
172*35238bceSAndroid Build Coastguard Worker         int numProducers = rnd.getInt(1, 16);
173*35238bceSAndroid Build Coastguard Worker         int numConsumers = rnd.getInt(1, 16);
174*35238bceSAndroid Build Coastguard Worker         int dataSize     = rnd.getInt(50, 200);
175*35238bceSAndroid Build Coastguard Worker         MessageBuffer buffer(blockSize, numBlocks);
176*35238bceSAndroid Build Coastguard Worker         vector<Producer *> producers;
177*35238bceSAndroid Build Coastguard Worker         vector<Consumer *> consumers;
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numProducers; i++)
180*35238bceSAndroid Build Coastguard Worker             producers.push_back(new Producer(buffer, (uint16_t)i, dataSize));
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numConsumers; i++)
183*35238bceSAndroid Build Coastguard Worker             consumers.push_back(new Consumer(buffer, numProducers));
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker         // Start consumers.
186*35238bceSAndroid Build Coastguard Worker         for (vector<Consumer *>::iterator i = consumers.begin(); i != consumers.end(); i++)
187*35238bceSAndroid Build Coastguard Worker             (*i)->start();
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker         // Start producers.
190*35238bceSAndroid Build Coastguard Worker         for (vector<Producer *>::iterator i = producers.begin(); i != producers.end(); i++)
191*35238bceSAndroid Build Coastguard Worker             (*i)->start();
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker         // Wait for producers.
194*35238bceSAndroid Build Coastguard Worker         for (vector<Producer *>::iterator i = producers.begin(); i != producers.end(); i++)
195*35238bceSAndroid Build Coastguard Worker             (*i)->join();
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker         // Write end messages for consumers.
198*35238bceSAndroid Build Coastguard Worker         const Message endMsg(0xffff, 0);
199*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numConsumers; i++)
200*35238bceSAndroid Build Coastguard Worker             buffer.write(1, &endMsg);
201*35238bceSAndroid Build Coastguard Worker         buffer.flush();
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker         // Wait for consumers.
204*35238bceSAndroid Build Coastguard Worker         for (vector<Consumer *>::iterator i = consumers.begin(); i != consumers.end(); i++)
205*35238bceSAndroid Build Coastguard Worker             (*i)->join();
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker         // Verify payload sums.
208*35238bceSAndroid Build Coastguard Worker         uint32_t refSum = 0;
209*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < dataSize; i++)
210*35238bceSAndroid Build Coastguard Worker             refSum += (uint32_t)(uint16_t)i;
211*35238bceSAndroid Build Coastguard Worker 
212*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numProducers; i++)
213*35238bceSAndroid Build Coastguard Worker         {
214*35238bceSAndroid Build Coastguard Worker             uint32_t cmpSum = 0;
215*35238bceSAndroid Build Coastguard Worker             for (int j = 0; j < numConsumers; j++)
216*35238bceSAndroid Build Coastguard Worker                 cmpSum += consumers[j]->getPayloadSum((uint16_t)i);
217*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(refSum == cmpSum);
218*35238bceSAndroid Build Coastguard Worker         }
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker         // Free resources.
221*35238bceSAndroid Build Coastguard Worker         for (vector<Producer *>::iterator i = producers.begin(); i != producers.end(); i++)
222*35238bceSAndroid Build Coastguard Worker             delete *i;
223*35238bceSAndroid Build Coastguard Worker         for (vector<Consumer *>::iterator i = consumers.begin(); i != consumers.end(); i++)
224*35238bceSAndroid Build Coastguard Worker             delete *i;
225*35238bceSAndroid Build Coastguard Worker     }
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker } // namespace BlockBufferBasicTest
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker namespace BlockBufferCancelTest
231*35238bceSAndroid Build Coastguard Worker {
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker class Producer : public Thread
234*35238bceSAndroid Build Coastguard Worker {
235*35238bceSAndroid Build Coastguard Worker public:
Producer(BlockBuffer<uint8_t> * buffer,uint32_t seed)236*35238bceSAndroid Build Coastguard Worker     Producer(BlockBuffer<uint8_t> *buffer, uint32_t seed) : m_buffer(buffer), m_seed(seed)
237*35238bceSAndroid Build Coastguard Worker     {
238*35238bceSAndroid Build Coastguard Worker     }
239*35238bceSAndroid Build Coastguard Worker 
run(void)240*35238bceSAndroid Build Coastguard Worker     void run(void)
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         uint8_t tmp[1024];
243*35238bceSAndroid Build Coastguard Worker         Random rnd(m_seed);
244*35238bceSAndroid Build Coastguard Worker 
245*35238bceSAndroid Build Coastguard Worker         deMemset(tmp, 0, DE_LENGTH_OF_ARRAY(tmp));
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker         for (;;)
248*35238bceSAndroid Build Coastguard Worker         {
249*35238bceSAndroid Build Coastguard Worker             int blockSize = rnd.getInt(1, DE_LENGTH_OF_ARRAY(tmp));
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker             try
252*35238bceSAndroid Build Coastguard Worker             {
253*35238bceSAndroid Build Coastguard Worker                 m_buffer->write(blockSize, &tmp[0]);
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker                 if (rnd.getBool())
256*35238bceSAndroid Build Coastguard Worker                     m_buffer->flush();
257*35238bceSAndroid Build Coastguard Worker             }
258*35238bceSAndroid Build Coastguard Worker             catch (const BlockBuffer<uint8_t>::CanceledException &)
259*35238bceSAndroid Build Coastguard Worker             {
260*35238bceSAndroid Build Coastguard Worker                 break;
261*35238bceSAndroid Build Coastguard Worker             }
262*35238bceSAndroid Build Coastguard Worker         }
263*35238bceSAndroid Build Coastguard Worker     }
264*35238bceSAndroid Build Coastguard Worker 
265*35238bceSAndroid Build Coastguard Worker private:
266*35238bceSAndroid Build Coastguard Worker     BlockBuffer<uint8_t> *m_buffer;
267*35238bceSAndroid Build Coastguard Worker     uint32_t m_seed;
268*35238bceSAndroid Build Coastguard Worker };
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker class Consumer : public Thread
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker public:
Consumer(BlockBuffer<uint8_t> * buffer,uint32_t seed)273*35238bceSAndroid Build Coastguard Worker     Consumer(BlockBuffer<uint8_t> *buffer, uint32_t seed) : m_buffer(buffer), m_seed(seed)
274*35238bceSAndroid Build Coastguard Worker     {
275*35238bceSAndroid Build Coastguard Worker     }
276*35238bceSAndroid Build Coastguard Worker 
run(void)277*35238bceSAndroid Build Coastguard Worker     void run(void)
278*35238bceSAndroid Build Coastguard Worker     {
279*35238bceSAndroid Build Coastguard Worker         uint8_t tmp[1024];
280*35238bceSAndroid Build Coastguard Worker         Random rnd(m_seed);
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker         for (;;)
283*35238bceSAndroid Build Coastguard Worker         {
284*35238bceSAndroid Build Coastguard Worker             int blockSize = rnd.getInt(1, DE_LENGTH_OF_ARRAY(tmp));
285*35238bceSAndroid Build Coastguard Worker 
286*35238bceSAndroid Build Coastguard Worker             try
287*35238bceSAndroid Build Coastguard Worker             {
288*35238bceSAndroid Build Coastguard Worker                 m_buffer->read(blockSize, &tmp[0]);
289*35238bceSAndroid Build Coastguard Worker             }
290*35238bceSAndroid Build Coastguard Worker             catch (const BlockBuffer<uint8_t>::CanceledException &)
291*35238bceSAndroid Build Coastguard Worker             {
292*35238bceSAndroid Build Coastguard Worker                 break;
293*35238bceSAndroid Build Coastguard Worker             }
294*35238bceSAndroid Build Coastguard Worker         }
295*35238bceSAndroid Build Coastguard Worker     }
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker private:
298*35238bceSAndroid Build Coastguard Worker     BlockBuffer<uint8_t> *m_buffer;
299*35238bceSAndroid Build Coastguard Worker     uint32_t m_seed;
300*35238bceSAndroid Build Coastguard Worker };
301*35238bceSAndroid Build Coastguard Worker 
runTest(void)302*35238bceSAndroid Build Coastguard Worker void runTest(void)
303*35238bceSAndroid Build Coastguard Worker {
304*35238bceSAndroid Build Coastguard Worker     BlockBuffer<uint8_t> buffer(64, 16);
305*35238bceSAndroid Build Coastguard Worker     const int numIterations = 8;
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker     for (int iterNdx = 0; iterNdx < numIterations; iterNdx++)
308*35238bceSAndroid Build Coastguard Worker     {
309*35238bceSAndroid Build Coastguard Worker         Random rnd(deInt32Hash(iterNdx));
310*35238bceSAndroid Build Coastguard Worker         int numThreads = rnd.getInt(1, 16);
311*35238bceSAndroid Build Coastguard Worker         int sleepMs    = rnd.getInt(1, 200);
312*35238bceSAndroid Build Coastguard Worker         vector<Thread *> threads;
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numThreads; i++)
315*35238bceSAndroid Build Coastguard Worker         {
316*35238bceSAndroid Build Coastguard Worker             if (rnd.getBool())
317*35238bceSAndroid Build Coastguard Worker                 threads.push_back(new Consumer(&buffer, rnd.getUint32()));
318*35238bceSAndroid Build Coastguard Worker             else
319*35238bceSAndroid Build Coastguard Worker                 threads.push_back(new Producer(&buffer, rnd.getUint32()));
320*35238bceSAndroid Build Coastguard Worker         }
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker         // Start threads.
323*35238bceSAndroid Build Coastguard Worker         for (vector<Thread *>::iterator i = threads.begin(); i != threads.end(); i++)
324*35238bceSAndroid Build Coastguard Worker             (*i)->start();
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker         // Sleep for a while.
327*35238bceSAndroid Build Coastguard Worker         deSleep(sleepMs);
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker         // Cancel buffer.
330*35238bceSAndroid Build Coastguard Worker         buffer.cancel();
331*35238bceSAndroid Build Coastguard Worker 
332*35238bceSAndroid Build Coastguard Worker         // Wait for threads to finish.
333*35238bceSAndroid Build Coastguard Worker         for (vector<Thread *>::iterator i = threads.begin(); i != threads.end(); i++)
334*35238bceSAndroid Build Coastguard Worker             (*i)->join();
335*35238bceSAndroid Build Coastguard Worker 
336*35238bceSAndroid Build Coastguard Worker         // Reset buffer.
337*35238bceSAndroid Build Coastguard Worker         buffer.clear();
338*35238bceSAndroid Build Coastguard Worker 
339*35238bceSAndroid Build Coastguard Worker         // Delete threads
340*35238bceSAndroid Build Coastguard Worker         for (vector<Thread *>::iterator thread = threads.begin(); thread != threads.end(); ++thread)
341*35238bceSAndroid Build Coastguard Worker             delete *thread;
342*35238bceSAndroid Build Coastguard Worker     }
343*35238bceSAndroid Build Coastguard Worker }
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker } // namespace BlockBufferCancelTest
346*35238bceSAndroid Build Coastguard Worker 
BlockBuffer_selfTest(void)347*35238bceSAndroid Build Coastguard Worker void BlockBuffer_selfTest(void)
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker     BlockBufferBasicTest::runTest();
350*35238bceSAndroid Build Coastguard Worker     BlockBufferCancelTest::runTest();
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker 
353*35238bceSAndroid Build Coastguard Worker } // namespace de
354