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

#include "rsFifoSocket.h"

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>

namespace android {
namespace renderscript {

FifoSocket::FifoSocket() {
    mShutdown = false;
}

FifoSocket::~FifoSocket() {

}

bool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) {
    int ret = socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sv);
    return (ret == 0);
}

void FifoSocket::shutdown() {
    mShutdown = true;
    uint64_t d = 0;
    ::send(sv[0], &d, sizeof(d), 0);
    ::send(sv[1], &d, sizeof(d), 0);
    close(sv[0]);
    close(sv[1]);
}

bool FifoSocket::writeAsync(const void *data, size_t bytes, bool waitForSpace) {
    if (bytes == 0) {
        return true;
    }
    //ALOGE("writeAsync %p %i", data, bytes);
    size_t ret = ::send(sv[0], data, bytes, 0);
    rsAssert(ret == bytes);
    if (ret != bytes) {
        ALOGE("writeAsync %p %zu  ret %zu", data, bytes, ret);
    }
    return true;
}

void FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
    if (mShutdown) {
        return;
    }

    //ALOGE("writeWaitReturn %p %i", retData, retBytes);
    size_t ret = ::recv(sv[0], retData, retBytes, MSG_WAITALL);
    //ALOGE("writeWaitReturn %i", ret);
    rsAssert(ret == retBytes);
}

size_t FifoSocket::read(void *data, size_t bytes) {
    if (mShutdown) {
        return 0;
    }

    //ALOGE("read %p %i", data, bytes);
    size_t ret = ::recv(sv[1], data, bytes, MSG_WAITALL);
    rsAssert(ret == bytes || mShutdown);
    //ALOGE("read ret %i  bytes %i", ret, bytes);
    if (mShutdown) {
        ret = 0;
    }
    return ret;
}

bool FifoSocket::isEmpty() {
    struct pollfd p;
    p.fd = sv[1];
    p.events = POLLIN;
    int r = poll(&p, 1, 0);
    //ALOGE("poll r=%i", r);
    return r == 0;
}


void FifoSocket::readReturn(const void *data, size_t bytes) {
    ::send(sv[1], data, bytes, 0);
}

} // namespace renderscript
} // namespace android
