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