/*
 * Copyright (C) 2009 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 ANDROID_RS_THREAD_IO_H
#define ANDROID_RS_THREAD_IO_H

#include "rsUtils.h"
#include "rsLocklessFifo.h"
#include "rsFifoSocket.h"

// ---------------------------------------------------------------------------
namespace android {
namespace renderscript {

class Context;

class ThreadIO {
public:
    ThreadIO();
    ~ThreadIO();

    void init(bool useSocket = false);
    void shutdown();

    // Plays back commands from the client.
    // Returns true if any commands were processed.
    bool playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait);

    void setTimoutCallback(void (*)(void *), void *, uint64_t timeout);
    //LocklessCommandFifo mToCore;



    void coreFlush();
    void * coreHeader(uint32_t, size_t dataLen);
    void coreData(const void *data, size_t dataLen);
    void coreCommit();
    void coreCommitSync();
    void coreSetReturn(const void *data, size_t dataLen);
    void coreGetReturn(void *data, size_t dataLen);


    RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
    RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
    bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
    void clientShutdown();


protected:
    typedef struct CoreCmdHeaderRec {
        uint32_t cmdID;
        uint32_t bytes;
    } CoreCmdHeader;
    typedef struct ClientCmdHeaderRec {
        uint32_t cmdID;
        uint32_t bytes;
        uint32_t userID;
    } ClientCmdHeader;
    ClientCmdHeader mLastClientHeader;

    size_t mCoreCommandSize;
    uint32_t mCoreCommandID;
    uint8_t * mCoreDataPtr;
    uint8_t * mCoreDataBasePtr;

    bool mUsingSocket;
    LocklessCommandFifo mToClient;
    LocklessCommandFifo mToCore;

    FifoSocket mToClientSocket;
    FifoSocket mToCoreSocket;

    intptr_t mToCoreRet;

};


}
}
#endif

