12008747941749ad27fe80663d23036ac320e998fJason Sams/*
22008747941749ad27fe80663d23036ac320e998fJason Sams * Copyright (C) 2011 The Android Open Source Project
32008747941749ad27fe80663d23036ac320e998fJason Sams *
42008747941749ad27fe80663d23036ac320e998fJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
52008747941749ad27fe80663d23036ac320e998fJason Sams * you may not use this file except in compliance with the License.
62008747941749ad27fe80663d23036ac320e998fJason Sams * You may obtain a copy of the License at
72008747941749ad27fe80663d23036ac320e998fJason Sams *
82008747941749ad27fe80663d23036ac320e998fJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
92008747941749ad27fe80663d23036ac320e998fJason Sams *
102008747941749ad27fe80663d23036ac320e998fJason Sams * Unless required by applicable law or agreed to in writing, software
112008747941749ad27fe80663d23036ac320e998fJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
122008747941749ad27fe80663d23036ac320e998fJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132008747941749ad27fe80663d23036ac320e998fJason Sams * See the License for the specific language governing permissions and
142008747941749ad27fe80663d23036ac320e998fJason Sams * limitations under the License.
152008747941749ad27fe80663d23036ac320e998fJason Sams */
162008747941749ad27fe80663d23036ac320e998fJason Sams
172008747941749ad27fe80663d23036ac320e998fJason Sams#include "rsFifoSocket.h"
182008747941749ad27fe80663d23036ac320e998fJason Sams#include "utils/Timers.h"
192008747941749ad27fe80663d23036ac320e998fJason Sams#include "utils/StopWatch.h"
202008747941749ad27fe80663d23036ac320e998fJason Sams
212008747941749ad27fe80663d23036ac320e998fJason Sams#include <stdio.h>
222008747941749ad27fe80663d23036ac320e998fJason Sams#include <stdlib.h>
232008747941749ad27fe80663d23036ac320e998fJason Sams#include <ctype.h>
242008747941749ad27fe80663d23036ac320e998fJason Sams#include <unistd.h>
255f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams#include <poll.h>
262008747941749ad27fe80663d23036ac320e998fJason Sams#include <sys/types.h>
272008747941749ad27fe80663d23036ac320e998fJason Sams#include <sys/socket.h>
282008747941749ad27fe80663d23036ac320e998fJason Sams
292008747941749ad27fe80663d23036ac320e998fJason Samsusing namespace android;
302008747941749ad27fe80663d23036ac320e998fJason Samsusing namespace android::renderscript;
312008747941749ad27fe80663d23036ac320e998fJason Sams
322008747941749ad27fe80663d23036ac320e998fJason SamsFifoSocket::FifoSocket() {
335f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    mShutdown = false;
342008747941749ad27fe80663d23036ac320e998fJason Sams}
352008747941749ad27fe80663d23036ac320e998fJason Sams
362008747941749ad27fe80663d23036ac320e998fJason SamsFifoSocket::~FifoSocket() {
372008747941749ad27fe80663d23036ac320e998fJason Sams
382008747941749ad27fe80663d23036ac320e998fJason Sams}
392008747941749ad27fe80663d23036ac320e998fJason Sams
405f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Samsbool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) {
412008747941749ad27fe80663d23036ac320e998fJason Sams    int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
422008747941749ad27fe80663d23036ac320e998fJason Sams    return false;
432008747941749ad27fe80663d23036ac320e998fJason Sams}
442008747941749ad27fe80663d23036ac320e998fJason Sams
452008747941749ad27fe80663d23036ac320e998fJason Samsvoid FifoSocket::shutdown() {
465f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    mShutdown = true;
475f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    uint64_t d = 0;
485f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    ::send(sv[0], &d, sizeof(d), 0);
495f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    ::send(sv[1], &d, sizeof(d), 0);
505f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    close(sv[0]);
515f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    close(sv[1]);
522008747941749ad27fe80663d23036ac320e998fJason Sams}
532008747941749ad27fe80663d23036ac320e998fJason Sams
545f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Samsbool FifoSocket::writeAsync(const void *data, size_t bytes, bool waitForSpace) {
551a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (bytes == 0) {
565f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        return true;
571a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
58af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("writeAsync %p %i", data, bytes);
591a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    size_t ret = ::send(sv[0], data, bytes, 0);
602008747941749ad27fe80663d23036ac320e998fJason Sams    rsAssert(ret == bytes);
61bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams    if (ret != bytes) {
62bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams        ALOGE("writeAsync %p %zu  ret %zu", data, bytes, ret);
63bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams    }
645f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    return true;
652008747941749ad27fe80663d23036ac320e998fJason Sams}
662008747941749ad27fe80663d23036ac320e998fJason Sams
672008747941749ad27fe80663d23036ac320e998fJason Samsvoid FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
685f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    if (mShutdown) {
695f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        return;
705f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    }
715f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
72af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("writeWaitReturn %p %i", retData, retBytes);
735f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    size_t ret = ::recv(sv[0], retData, retBytes, MSG_WAITALL);
74af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("writeWaitReturn %i", ret);
752008747941749ad27fe80663d23036ac320e998fJason Sams    rsAssert(ret == retBytes);
762008747941749ad27fe80663d23036ac320e998fJason Sams}
772008747941749ad27fe80663d23036ac320e998fJason Sams
782008747941749ad27fe80663d23036ac320e998fJason Samssize_t FifoSocket::read(void *data, size_t bytes) {
795f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    if (mShutdown) {
805f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        return 0;
815f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    }
825f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
83af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("read %p %i", data, bytes);
845f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    size_t ret = ::recv(sv[1], data, bytes, MSG_WAITALL);
855f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    rsAssert(ret == bytes || mShutdown);
865f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    //ALOGE("read ret %i  bytes %i", ret, bytes);
875f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    if (mShutdown) {
885f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        ret = 0;
895f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    }
902008747941749ad27fe80663d23036ac320e998fJason Sams    return ret;
912008747941749ad27fe80663d23036ac320e998fJason Sams}
922008747941749ad27fe80663d23036ac320e998fJason Sams
935f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Samsbool FifoSocket::isEmpty() {
945f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    struct pollfd p;
955f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    p.fd = sv[1];
965f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    p.events = POLLIN;
975f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    int r = poll(&p, 1, 0);
985f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    //ALOGE("poll r=%i", r);
995f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    return r == 0;
1002008747941749ad27fe80663d23036ac320e998fJason Sams}
1012008747941749ad27fe80663d23036ac320e998fJason Sams
1022008747941749ad27fe80663d23036ac320e998fJason Sams
1035f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Samsvoid FifoSocket::readReturn(const void *data, size_t bytes) {
1045f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    //ALOGE("readReturn %p %Zu", data, bytes);
1055f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    size_t ret = ::send(sv[1], data, bytes, 0);
1065f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    //ALOGE("readReturn %Zu", ret);
1075f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    //rsAssert(ret == bytes);
1082008747941749ad27fe80663d23036ac320e998fJason Sams}
1092008747941749ad27fe80663d23036ac320e998fJason Sams
1102008747941749ad27fe80663d23036ac320e998fJason Sams
111