/*
 * 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) {
    // TODO: (b/27870945) Handle socketpair errors.
    int ret = socketpair(AF_UNIX, SOCK_STREAM, 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
