rsThreadIO.cpp revision af12ac6a08651464f8d823add667c706f993b587
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsThreadIO.h"
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
246b0c00414a532e2ea22f66cf89578cc8c8a45293Alex SakhartchoukThreadIO::ThreadIO() : mUsingSocket(false) {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
27afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukThreadIO::~ThreadIO() {
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
301a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::init(bool useSocket) {
311a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    mUsingSocket = useSocket;
326b0c00414a532e2ea22f66cf89578cc8c8a45293Alex Sakhartchouk    mToCore.init(16 * 1024);
331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
341a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
351a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToClientSocket.init();
361a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToCoreSocket.init();
371a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
381a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToClient.init(1024);
391a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
401a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
411a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ThreadIO::shutdown() {
43af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("shutdown 1");
448c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams    mToCore.shutdown();
45af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("shutdown 2");
468c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams}
478c0ee6567b3c874dd472843eb7918ae68d1b9739Jason Sams
481a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreFlush() {
49af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreFlush 1");
501a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
511a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
521a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToCore.flush();
531a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
54af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreFlush 2");
551a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
561a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
571a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
58af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreHeader %i %i", cmdID, dataLen);
591a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
601a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        CoreCmdHeader hdr;
611a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        hdr.bytes = dataLen;
621a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        hdr.cmdID = cmdID;
631a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToCoreSocket.writeAsync(&hdr, sizeof(hdr));
641a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
651a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mCoreCommandSize = dataLen;
661a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mCoreCommandID = cmdID;
671a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mCoreDataPtr = (uint8_t *)mToCore.reserve(dataLen);
681a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mCoreDataBasePtr = mCoreDataPtr;
691a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
70af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreHeader ret %p", mCoreDataPtr);
711a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    return mCoreDataPtr;
721a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
731a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
741a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreData(const void *data, size_t dataLen) {
75af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreData %p %i", data, dataLen);
761a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    mToCoreSocket.writeAsync(data, dataLen);
77af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreData ret %p", mCoreDataPtr);
781a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
791a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
801a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreCommit() {
81af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreCommit %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
821a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
831a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
841a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
851a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToCore.commit(mCoreCommandID, mCoreCommandSize);
861a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
87af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreCommit ret");
881a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
891a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
901a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreCommitSync() {
91af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreCommitSync %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
921a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
941a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
951a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToCore.commitSync(mCoreCommandID, mCoreCommandSize);
961a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
97af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreCommitSync ret");
981a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
991a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
1001a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::clientShutdown() {
101af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreShutdown 1");
1021a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    mToClient.shutdown();
103af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("coreShutdown 2");
1041a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
1051a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
1061a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreSetReturn(const void *data, size_t dataLen) {
1071a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    rsAssert(dataLen <= sizeof(mToCoreRet));
1081a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    memcpy(&mToCoreRet, data, dataLen);
1091a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
1101a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
1111a4efa363916977ef9aeab756725b3bdc880a15bJason Samsvoid ThreadIO::coreGetReturn(void *data, size_t dataLen) {
1121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    memcpy(data, &mToCoreRet, dataLen);
1131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
1141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
1152382aba4a55c6ae74789c478eead8fbd96593321Jason Samsvoid ThreadIO::setTimoutCallback(void (*cb)(void *), void *dat, uint64_t timeout) {
1162382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    mToCore.setTimoutCallback(cb, dat, timeout);
1172382aba4a55c6ae74789c478eead8fbd96593321Jason Sams}
1182382aba4a55c6ae74789c478eead8fbd96593321Jason Sams
1191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
120e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Samsbool ThreadIO::playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait) {
121a44cb29164726cd9d812117819abdd7b60dfdd93Jason Sams    bool ret = false;
122e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    uint64_t startTime = con->getTime();
123e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams
124afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    while (!mToCore.isEmpty() || waitForCommand) {
12524371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        uint32_t cmdID = 0;
12624371d93cdb6999971c4058f78974da3c3d5fc64Jason Sams        uint32_t cmdSize = 0;
127a44cb29164726cd9d812117819abdd7b60dfdd93Jason Sams        ret = true;
1281fddd90849deaae89b546ff492c345d485bbce42Jason Sams        if (con->props.mLogTimes) {
12976371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato            con->timerSet(Context::RS_TIMER_IDLE);
13076371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato        }
131e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams
132e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        uint64_t delay = 0;
133e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        if (waitForCommand) {
134e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            delay = timeToWait - (con->getTime() - startTime);
135e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            if (delay > timeToWait) {
136e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams                delay = 0;
137e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            }
138e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        }
139e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        const void * data = mToCore.get(&cmdID, &cmdSize, delay);
140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (!cmdSize) {
141e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            // exception or timeout occurred.
142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            return false;
143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
1441fddd90849deaae89b546ff492c345d485bbce42Jason Sams        if (con->props.mLogTimes) {
14576371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato            con->timerSet(Context::RS_TIMER_INTERNAL);
14676371fff76412fd020e24ddb8bf1ddb5c75f0ed1Joe Onorato        }
147732f1c0a29cc468ea271ca3bd654239a0a973fd5Jason Sams        waitForCommand = false;
1486598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        //ALOGV("playCoreCommands 3 %i %i", cmdID, cmdSize);
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
150185b8b01f417488e2fbf6e6c00dfbd3d1d43d98aJason Sams        if (cmdID >= (sizeof(gPlaybackFuncs) / sizeof(void *))) {
151185b8b01f417488e2fbf6e6c00dfbd3d1d43d98aJason Sams            rsAssert(cmdID < (sizeof(gPlaybackFuncs) / sizeof(void *)));
152af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("playCoreCommands error con %p, cmd %i", con, cmdID);
1531dda675ff34a2708b519bea44b33a390712f6a6fJason Sams            mToCore.printDebugData();
154185b8b01f417488e2fbf6e6c00dfbd3d1d43d98aJason Sams        }
1555fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        gPlaybackFuncs[cmdID](con, data, cmdSize << 2);
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mToCore.next();
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
158a44cb29164726cd9d812117819abdd7b60dfdd93Jason Sams    return ret;
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1611a4efa363916977ef9aeab756725b3bdc880a15bJason SamsRsMessageToClientType ThreadIO::getClientHeader(size_t *receiveLen, uint32_t *usrID) {
1621a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
1631a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToClientSocket.read(&mLastClientHeader, sizeof(mLastClientHeader));
1641a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
1651a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        size_t bytesData = 0;
166b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk        const uint32_t *d = (const uint32_t *)mToClient.get(&mLastClientHeader.cmdID, (uint32_t*)&bytesData);
1671a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (bytesData >= sizeof(uint32_t)) {
1681a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mLastClientHeader.userID = d[0];
1691a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mLastClientHeader.bytes = bytesData - sizeof(uint32_t);
1701a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        } else {
1711a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mLastClientHeader.userID = 0;
1721a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mLastClientHeader.bytes = 0;
1731a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
1741a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
1751a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    receiveLen[0] = mLastClientHeader.bytes;
1761a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    usrID[0] = mLastClientHeader.userID;
1771a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    return (RsMessageToClientType)mLastClientHeader.cmdID;
1781a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
1791a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
1801a4efa363916977ef9aeab756725b3bdc880a15bJason SamsRsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen,
1811a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                                uint32_t *usrID, size_t bufferLen) {
1821a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    receiveLen[0] = mLastClientHeader.bytes;
1831a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    usrID[0] = mLastClientHeader.userID;
1841a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (bufferLen < mLastClientHeader.bytes) {
1851a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        return RS_MESSAGE_TO_CLIENT_RESIZE;
1861a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
1871a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
1881a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (receiveLen[0]) {
1891a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mToClientSocket.read(data, receiveLen[0]);
1901a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
1911a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        return (RsMessageToClientType)mLastClientHeader.cmdID;
1921a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
1931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        uint32_t bytesData = 0;
1941a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        uint32_t commandID = 0;
1951a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        const uint32_t *d = (const uint32_t *)mToClient.get(&commandID, &bytesData);
196af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("getMessageToClient 3    %i  %i", commandID, bytesData);
197af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("getMessageToClient  %i %i", commandID, *subID);
1981a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (bufferLen >= receiveLen[0]) {
1991a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            memcpy(data, d+1, receiveLen[0]);
2001a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mToClient.next();
2011a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            return (RsMessageToClientType)commandID;
2021a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
2031a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
2041a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    return RS_MESSAGE_TO_CLIENT_RESIZE;
2051a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
2061a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
2071a4efa363916977ef9aeab756725b3bdc880a15bJason Samsbool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data,
2081a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                            size_t dataLen, bool waitForSpace) {
2091a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    ClientCmdHeader hdr;
2101a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    hdr.bytes = dataLen;
2111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    hdr.cmdID = cmdID;
2121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    hdr.userID = usrID;
2131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    if (mUsingSocket) {
2141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToClientSocket.writeAsync(&hdr, sizeof(hdr));
2151a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (dataLen) {
2161a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            mToClientSocket.writeAsync(data, dataLen);
2171a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
2181a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        return true;
2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    } else {
2201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (!waitForSpace) {
2211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (!mToClient.makeSpaceNonBlocking(dataLen + sizeof(hdr))) {
2221a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                // Not enough room, and not waiting.
2231a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                return false;
2241a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            }
2251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
2261a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
227af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("sendMessageToClient 2");
2281a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        uint32_t *p = (uint32_t *)mToClient.reserve(dataLen + sizeof(usrID));
2291a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        p[0] = usrID;
2301a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (dataLen > 0) {
2311a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            memcpy(p+1, data, dataLen);
2321a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
2331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        mToClient.commit(cmdID, dataLen + sizeof(usrID));
234af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("sendMessageToClient 3");
2351a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        return true;
2361a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    }
2371a4efa363916977ef9aeab756725b3bdc880a15bJason Sams    return false;
2381a4efa363916977ef9aeab756725b3bdc880a15bJason Sams}
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
240