10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2011 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsFifoSocket.h"
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "utils/Timers.h"
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "utils/StopWatch.h"
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <stdio.h>
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <stdlib.h>
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <ctype.h>
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <unistd.h>
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <poll.h>
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <sys/types.h>
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <sys/socket.h>
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesFifoSocket::FifoSocket() {
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mShutdown = false;
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesFifoSocket::~FifoSocket() {
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) {
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return false;
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid FifoSocket::shutdown() {
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mShutdown = true;
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t d = 0;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ::send(sv[0], &d, sizeof(d), 0);
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ::send(sv[1], &d, sizeof(d), 0);
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    close(sv[0]);
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    close(sv[1]);
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool FifoSocket::writeAsync(const void *data, size_t bytes, bool waitForSpace) {
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (bytes == 0) {
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return true;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("writeAsync %p %i", data, bytes);
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t ret = ::send(sv[0], data, bytes, 0);
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("writeAsync ret %i", ret);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(ret == bytes);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return true;
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mShutdown) {
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return;
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("writeWaitReturn %p %i", retData, retBytes);
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t ret = ::recv(sv[0], retData, retBytes, MSG_WAITALL);
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("writeWaitReturn %i", ret);
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(ret == retBytes);
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinessize_t FifoSocket::read(void *data, size_t bytes) {
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mShutdown) {
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return 0;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("read %p %i", data, bytes);
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t ret = ::recv(sv[1], data, bytes, MSG_WAITALL);
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(ret == bytes || mShutdown);
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("read ret %i  bytes %i", ret, bytes);
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mShutdown) {
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ret = 0;
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return ret;
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool FifoSocket::isEmpty() {
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct pollfd p;
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    p.fd = sv[1];
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    p.events = POLLIN;
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int r = poll(&p, 1, 0);
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("poll r=%i", r);
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return r == 0;
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid FifoSocket::readReturn(const void *data, size_t bytes) {
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("readReturn %p %Zu", data, bytes);
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t ret = ::send(sv[1], data, bytes, 0);
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //ALOGE("readReturn %Zu", ret);
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //rsAssert(ret == bytes);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
109