/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
/*
 * Implementation of the user-space ashmem API for devices, which have our
 * ashmem-enabled kernel. See ashmem-sim.c for the "fake" tmp-based version,
 * used by the simulator.
 */

#ifndef IPCFUTEXPAGEQUEUE_H
#define IPCFUTEXPAGEQUEUE_H

#include <stdint.h>

// shared memory page layout:
// futex uint32_t
// state word uint32_t
// package size uint32_t
// msg type uint32_t
// types[] uint32_t[]
//
// data  whatever types indicate
// A page queue is composed of m_pagesCount pages
// and will use repeatedly.
class IPCFutexPageQueue {
public:
    IPCFutexPageQueue(void* sharedMemory, size_t s, size_t id);
    ~IPCFutexPageQueue();
    void stepWrite();
    void lockReadPage();
    void unlockReadPageAndStep();
    void spinWaitPeer();
    inline void* getCurrentReadPage() { return sizeof(uint32_t) * 2 + static_cast<char*>(getPage(m_currentRead)); }
    inline void* getCurrentWritePage() { return sizeof(uint32_t) * 2 + static_cast<char*>(getPage(m_currentWrite)); }
    inline size_t getPageSize() const { return m_pageSize - sizeof(uint32_t) * 2; }

    static const size_t ipc_size = 2 * 1024 * 1024;

private:
    void unlock(size_t id);
    void lock(size_t id, bool checkFinish);
    void* getPage(size_t id);
    inline size_t step(size_t s) { return (s + 2) & (m_pagesCount - 1); }
    void setFinishedTag();
    void clearFinishedTag();

    size_t m_currentWrite;
    size_t m_currentRead;
    size_t m_pageSize;
    void* m_sharedMemory;
    int m_tid;
    static const uint32_t m_finishTag = static_cast<uint32_t>(1);
    static const size_t m_pagesCount = 16;
    static const int m_timeoutSec = 32;
};

#endif /* IPCFUTEXPAGEQUEUE_H */
