/** 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>using namespace android;using namespace android::renderscript;FifoSocket::FifoSocket() {mShutdown = false;}FifoSocket::~FifoSocket() {}bool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) {int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);return false;}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) {//ALOGE("readReturn %p %Zu", data, bytes);size_t ret = ::send(sv[1], data, bytes, 0);//ALOGE("readReturn %Zu", ret);//rsAssert(ret == bytes);}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。