RemoteMemoryIntArrayService.java revision 74c9983e80d8224bbe1de7c37e8f6ac4a76df11d
104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov/* 204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Copyright (C) 2016 The Android Open Source Project 304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * 404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * you may not use this file except in compliance with the License. 604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * You may obtain a copy of the License at 704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * 804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * 1004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software 1104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 1204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * See the License for the specific language governing permissions and 1404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * limitations under the License. 1504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov */ 1604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 1704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovpackage android.util; 1804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 1904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.app.Service; 2004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.content.Intent; 2104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.os.IBinder; 2204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 2304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport java.io.IOException; 2404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 2504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov/** 2604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Service to interact with a {@link MemoryIntArray} in another process. 2704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov */ 2804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovpublic class RemoteMemoryIntArrayService extends Service { 2904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov private final Object mLock = new Object(); 3004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 3104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov private MemoryIntArray mArray; 3204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 3304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 3404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public IBinder onBind(Intent intent) { 3504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return new android.util.IRemoteMemoryIntArray.Stub() { 3604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 3704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 3874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov public void create(int size) { 3904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 4004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov try { 4174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov mArray = new MemoryIntArray(size); 4204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } catch (IOException e) { 4304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov throw new IllegalStateException(e); 4404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 4504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 4604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 4704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 4804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 4904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public MemoryIntArray peekInstance() { 5004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 5104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return mArray; 5204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 5304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 5404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 5504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 5604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public boolean isWritable() { 5704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 5804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return mArray.isWritable(); 5904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 6004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 6104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 6204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 6304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public int get(int index) { 6404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 6504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov try { 6604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return mArray.get(index); 6704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } catch (IOException e) { 6804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov throw new IllegalStateException(e); 6904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 7004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 7104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 7204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 7304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 7404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public void set(int index, int value) { 7504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 7604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov try { 7704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov mArray.set(index, value); 7804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } catch (IOException e) { 7904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov throw new IllegalStateException(e); 8004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 8104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 8204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 8304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 8404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 8504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public int size() { 8604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 8704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov try { 8804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return mArray.size(); 8904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } catch (IOException e) { 9004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov throw new IllegalStateException(e); 9104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 9204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 9304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 9404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 9504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 9604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public void close() { 9704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 9804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov try { 9904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov mArray.close(); 10004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } catch (IOException e) { 10104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov throw new IllegalStateException(e); 10204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 10304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 10404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 10504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov 10604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov @Override 10704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov public boolean isClosed() { 10804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov synchronized (mLock) { 10904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov return mArray.isClosed(); 11004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 11104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 11274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 11374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov @Override 11474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov public void accessLastElementInRemoteProcess(MemoryIntArray array) { 11574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov try { 11674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov array.get(array.size() - 1); 11774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } catch (IOException e) { 11874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov throw new IllegalStateException(e); 11974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 12074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 12104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov }; 12204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov } 12304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov} 124