/*
 * Copyright (C) 2018 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.
 */

#ifndef BINDER_THREADSTATE_IPC_THREADSTATE_BASE_H
#define BINDER_THREADSTATE_IPC_THREADSTATE_BASE_H

#include <stack>
namespace android {

class IPCThreadStateBase {
public:
    enum CallState {
        HWBINDER,
        BINDER,
        NONE,
    };
    static IPCThreadStateBase* self();
    void pushCurrentState(CallState callState);
    CallState popCurrentState();
    CallState getCurrentBinderCallState();

private:
    IPCThreadStateBase();
    static void threadDestructor(void *st);

    std::stack<CallState> mCallStateStack;
};

}; // namespace android

#endif // BINDER_THREADSTATE_IPC_THREADSTATE_BASE_H
