19dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel/*
29dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * Copyright (C) 2015 The Android Open Source Project
39dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel *
49dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * Licensed under the Apache License, Version 2.0 (the "License");
59dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * you may not use this file except in compliance with the License.
69dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * You may obtain a copy of the License at
79dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel *
89dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel *      http://www.apache.org/licenses/LICENSE-2.0
99dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel *
109dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * Unless required by applicable law or agreed to in writing, software
119dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * distributed under the License is distributed on an "AS IS" BASIS,
129dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * See the License for the specific language governing permissions and
149dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * limitations under the License.
159dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel */
169dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmelpackage android.surfacecomposition;
179dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel
189dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmelimport android.util.Log;
199dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel
209dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel/**
219dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * This task will simulate CPU activity by consuming memory bandwidth from the system.
229dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel * Note: On most system the CPU and GPU will share the same memory.
239dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel */
249dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmelpublic class MemoryAccessTask {
259dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private final static String TAG = "MemoryAccessTask";
269dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private final static int BUFFER_SIZE = 32 * 1024 * 1024;
279dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private final static int BUFFER_STEP = 256;
289dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private boolean mStopRequested;
299dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private WorkThread mThread;
309dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    private final Object mLock = new Object();
319dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel
329dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    public class WorkThread extends Thread {
339dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        public void run() {
349dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            byte[] memory = new byte[BUFFER_SIZE];
359dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            while (true) {
369dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                synchronized (mLock) {
379dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                    if (mStopRequested) {
389dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                        break;
399dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                    }
409dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                }
419dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                long result = 0;
429dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                for (int index = 0; index < BUFFER_SIZE; index += BUFFER_STEP) {
439dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                    result += ++memory[index];
449dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                }
459dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                Log.v(TAG, "Processing...:" + result);
469dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            }
479dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        }
489dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    }
499dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel
509dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    public void start() {
519dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        if (mThread != null) {
529dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            throw new RuntimeException("Work thread is already started");
539dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        }
549dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        mStopRequested = false;
559dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        mThread = new WorkThread();
569dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        mThread.start();
579dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    }
589dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel
599dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    public void stop() {
609dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        if (mThread != null) {
619dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            synchronized (mLock) {
629dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                mStopRequested = true;
639dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            }
649dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            try {
659dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                mThread.join();
669dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            } catch (InterruptedException e) {
679dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel                e.printStackTrace();
689dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel            }
699dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel        }
709dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel    }
719dbde7b09f2366d2a239b1a4c234d5cf2de51739Yury Khmel}
72