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