/*
 * Copyright (C) 2008 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_MODULE_H_
#define _BINDER_MODULE_H_

#ifdef __cplusplus
namespace android {
#endif

/* obtain structures and constants from the kernel header */

// TODO(b/31559095): bionic on host
#ifndef __ANDROID__
#define __packed __attribute__((__packed__))
#endif

// TODO(b/31559095): bionic on host
#if defined(B_PACK_CHARS) && !defined(_UAPI_LINUX_BINDER_H)
#undef B_PACK_CHARS
#endif

#include <sys/ioctl.h>
#include <linux/android/binder.h>

#ifndef BR_FROZEN_REPLY
// Temporary definition of BR_FROZEN_REPLY. For production
// this will come from UAPI binder.h
#define BR_FROZEN_REPLY _IO('r', 18)
#endif //BR_FROZEN_REPLY

#ifndef BINDER_FREEZE
/*
 * Temporary definitions for freeze support. For the final version
 * these will be defined in the UAPI binder.h file from upstream kernel.
 */
#define BINDER_FREEZE _IOW('b', 14, struct binder_freeze_info)

struct binder_freeze_info {
    //
    // Group-leader PID of process to be frozen
    //
    uint32_t            pid;
    //
    // Enable(1) / Disable(0) freeze for given PID
    //
    uint32_t            enable;
    //
    // Timeout to wait for transactions to drain.
    // 0: don't wait (ioctl will return EAGAIN if not drained)
    // N: number of ms to wait
    uint32_t            timeout_ms;
};
#endif //BINDER_FREEZE

#ifndef BINDER_GET_FROZEN_INFO

#define BINDER_GET_FROZEN_INFO          _IOWR('b', 15, struct binder_frozen_status_info)

struct binder_frozen_status_info {
    //
    // Group-leader PID of process to be queried
    //
    __u32            pid;
    //
    // Indicates whether the process has received any sync calls since last
    // freeze (cleared at freeze/unfreeze)
    //
    __u32            sync_recv;
    //
    // Indicates whether the process has received any async calls since last
    // freeze (cleared at freeze/unfreeze)
    //
    __u32            async_recv;
};
#endif //BINDER_GET_FROZEN_INFO



#ifdef __cplusplus
}   // namespace android
#endif

#endif // _BINDER_MODULE_H_
