/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.core;

/**
 * Provides synchronization handling for low level Request API tests
 */
public class LowLevelNetRunner extends Thread {

    private int count = 0;

    LowLevelNetRunner() {
    }

    public void incrementRunCount() {
        count++;
    }

    /**
     * Decrement the run count. If this returns to zero notify any
     * test waiting.
     */
    public void decrementRunCount() {
        count--;
        if (count <= 0) {
            synchronized (RequestAPITest.syncObj) {
                RequestAPITest.syncObj.notifyAll();
            }
        }
    }

} /* LowLevelNetRunner*/
