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