Home | History | Annotate | Download | only in binder
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "IPCThreadState"
     18 
     19 #include <binder/IPCThreadState.h>
     20 
     21 #include <binder/Binder.h>
     22 #include <binder/BpBinder.h>
     23 #include <cutils/sched_policy.h>
     24 #include <utils/Debug.h>
     25 #include <utils/Log.h>
     26 #include <utils/TextOutput.h>
     27 #include <utils/threads.h>
     28 
     29 #include <private/binder/binder_module.h>
     30 #include <private/binder/Static.h>
     31 
     32 #include <sys/ioctl.h>
     33 #include <signal.h>
     34 #include <errno.h>
     35 #include <stdio.h>
     36 #include <unistd.h>
     37 
     38 #ifdef HAVE_PTHREADS
     39 #include <pthread.h>
     40 #include <sched.h>
     41 #include <sys/resource.h>
     42 #endif
     43 #ifdef HAVE_WIN32_THREADS
     44 #include <windows.h>
     45 #endif
     46 
     47 
     48 #if LOG_NDEBUG
     49 
     50 #define IF_LOG_TRANSACTIONS() if (false)
     51 #define IF_LOG_COMMANDS() if (false)
     52 #define LOG_REMOTEREFS(...)
     53 #define IF_LOG_REMOTEREFS() if (false)
     54 #define LOG_THREADPOOL(...)
     55 #define LOG_ONEWAY(...)
     56 
     57 #else
     58 
     59 #define IF_LOG_TRANSACTIONS() IF_LOG(LOG_VERBOSE, "transact")
     60 #define IF_LOG_COMMANDS() IF_LOG(LOG_VERBOSE, "ipc")
     61 #define LOG_REMOTEREFS(...) LOG(LOG_DEBUG, "remoterefs", __VA_ARGS__)
     62 #define IF_LOG_REMOTEREFS() IF_LOG(LOG_DEBUG, "remoterefs")
     63 #define LOG_THREADPOOL(...) LOG(LOG_DEBUG, "threadpool", __VA_ARGS__)
     64 #define LOG_ONEWAY(...) LOG(LOG_DEBUG, "ipc", __VA_ARGS__)
     65 
     66 #endif
     67 
     68 // ---------------------------------------------------------------------------
     69 
     70 namespace android {
     71 
     72 static const char* getReturnString(size_t idx);
     73 static const char* getCommandString(size_t idx);
     74 static const void* printReturnCommand(TextOutput& out, const void* _cmd);
     75 static const void* printCommand(TextOutput& out, const void* _cmd);
     76 
     77 // This will result in a missing symbol failure if the IF_LOG_COMMANDS()
     78 // conditionals don't get stripped...  but that is probably what we want.
     79 #if !LOG_NDEBUG
     80 static const char *kReturnStrings[] = {
     81     "BR_ERROR",
     82     "BR_OK",
     83     "BR_TRANSACTION",
     84     "BR_REPLY",
     85     "BR_ACQUIRE_RESULT",
     86     "BR_DEAD_REPLY",
     87     "BR_TRANSACTION_COMPLETE",
     88     "BR_INCREFS",
     89     "BR_ACQUIRE",
     90     "BR_RELEASE",
     91     "BR_DECREFS",
     92     "BR_ATTEMPT_ACQUIRE",
     93     "BR_NOOP",
     94     "BR_SPAWN_LOOPER",
     95     "BR_FINISHED",
     96     "BR_DEAD_BINDER",
     97     "BR_CLEAR_DEATH_NOTIFICATION_DONE",
     98     "BR_FAILED_REPLY"
     99 };
    100 
    101 static const char *kCommandStrings[] = {
    102     "BC_TRANSACTION",
    103     "BC_REPLY",
    104     "BC_ACQUIRE_RESULT",
    105     "BC_FREE_BUFFER",
    106     "BC_INCREFS",
    107     "BC_ACQUIRE",
    108     "BC_RELEASE",
    109     "BC_DECREFS",
    110     "BC_INCREFS_DONE",
    111     "BC_ACQUIRE_DONE",
    112     "BC_ATTEMPT_ACQUIRE",
    113     "BC_REGISTER_LOOPER",
    114     "BC_ENTER_LOOPER",
    115     "BC_EXIT_LOOPER",
    116     "BC_REQUEST_DEATH_NOTIFICATION",
    117     "BC_CLEAR_DEATH_NOTIFICATION",
    118     "BC_DEAD_BINDER_DONE"
    119 };
    120 
    121 static const char* getReturnString(size_t idx)
    122 {
    123     if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0]))
    124         return kReturnStrings[idx];
    125     else
    126         return "unknown";
    127 }
    128 
    129 static const char* getCommandString(size_t idx)
    130 {
    131     if (idx < sizeof(kCommandStrings) / sizeof(kCommandStrings[0]))
    132         return kCommandStrings[idx];
    133     else
    134         return "unknown";
    135 }
    136 
    137 static const void* printBinderTransactionData(TextOutput& out, const void* data)
    138 {
    139     const binder_transaction_data* btd =
    140         (const binder_transaction_data*)data;
    141     if (btd->target.handle < 1024) {
    142         /* want to print descriptors in decimal; guess based on value */
    143         out << "target.desc=" << btd->target.handle;
    144     } else {
    145         out << "target.ptr=" << btd->target.ptr;
    146     }
    147     out << " (cookie " << btd->cookie << ")" << endl
    148         << "code=" << TypeCode(btd->code) << ", flags=" << (void*)btd->flags << endl
    149         << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size
    150         << " bytes)" << endl
    151         << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size
    152         << " bytes)";
    153     return btd+1;
    154 }
    155 
    156 static const void* printReturnCommand(TextOutput& out, const void* _cmd)
    157 {
    158     static const size_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]);
    159     const int32_t* cmd = (const int32_t*)_cmd;
    160     int32_t code = *cmd++;
    161     size_t cmdIndex = code & 0xff;
    162     if (code == (int32_t) BR_ERROR) {
    163         out << "BR_ERROR: " << (void*)(*cmd++) << endl;
    164         return cmd;
    165     } else if (cmdIndex >= N) {
    166         out << "Unknown reply: " << code << endl;
    167         return cmd;
    168     }
    169     out << kReturnStrings[cmdIndex];
    170 
    171     switch (code) {
    172         case BR_TRANSACTION:
    173         case BR_REPLY: {
    174             out << ": " << indent;
    175             cmd = (const int32_t *)printBinderTransactionData(out, cmd);
    176             out << dedent;
    177         } break;
    178 
    179         case BR_ACQUIRE_RESULT: {
    180             const int32_t res = *cmd++;
    181             out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
    182         } break;
    183 
    184         case BR_INCREFS:
    185         case BR_ACQUIRE:
    186         case BR_RELEASE:
    187         case BR_DECREFS: {
    188             const int32_t b = *cmd++;
    189             const int32_t c = *cmd++;
    190             out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
    191         } break;
    192 
    193         case BR_ATTEMPT_ACQUIRE: {
    194             const int32_t p = *cmd++;
    195             const int32_t b = *cmd++;
    196             const int32_t c = *cmd++;
    197             out << ": target=" << (void*)b << " (cookie " << (void*)c
    198                 << "), pri=" << p;
    199         } break;
    200 
    201         case BR_DEAD_BINDER:
    202         case BR_CLEAR_DEATH_NOTIFICATION_DONE: {
    203             const int32_t c = *cmd++;
    204             out << ": death cookie " << (void*)c;
    205         } break;
    206 
    207         default:
    208             // no details to show for: BR_OK, BR_DEAD_REPLY,
    209             // BR_TRANSACTION_COMPLETE, BR_FINISHED
    210             break;
    211     }
    212 
    213     out << endl;
    214     return cmd;
    215 }
    216 
    217 static const void* printCommand(TextOutput& out, const void* _cmd)
    218 {
    219     static const size_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]);
    220     const int32_t* cmd = (const int32_t*)_cmd;
    221     int32_t code = *cmd++;
    222     size_t cmdIndex = code & 0xff;
    223 
    224     if (cmdIndex >= N) {
    225         out << "Unknown command: " << code << endl;
    226         return cmd;
    227     }
    228     out << kCommandStrings[cmdIndex];
    229 
    230     switch (code) {
    231         case BC_TRANSACTION:
    232         case BC_REPLY: {
    233             out << ": " << indent;
    234             cmd = (const int32_t *)printBinderTransactionData(out, cmd);
    235             out << dedent;
    236         } break;
    237 
    238         case BC_ACQUIRE_RESULT: {
    239             const int32_t res = *cmd++;
    240             out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
    241         } break;
    242 
    243         case BC_FREE_BUFFER: {
    244             const int32_t buf = *cmd++;
    245             out << ": buffer=" << (void*)buf;
    246         } break;
    247 
    248         case BC_INCREFS:
    249         case BC_ACQUIRE:
    250         case BC_RELEASE:
    251         case BC_DECREFS: {
    252             const int32_t d = *cmd++;
    253             out << ": desc=" << d;
    254         } break;
    255 
    256         case BC_INCREFS_DONE:
    257         case BC_ACQUIRE_DONE: {
    258             const int32_t b = *cmd++;
    259             const int32_t c = *cmd++;
    260             out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
    261         } break;
    262 
    263         case BC_ATTEMPT_ACQUIRE: {
    264             const int32_t p = *cmd++;
    265             const int32_t d = *cmd++;
    266             out << ": desc=" << d << ", pri=" << p;
    267         } break;
    268 
    269         case BC_REQUEST_DEATH_NOTIFICATION:
    270         case BC_CLEAR_DEATH_NOTIFICATION: {
    271             const int32_t h = *cmd++;
    272             const int32_t c = *cmd++;
    273             out << ": handle=" << h << " (death cookie " << (void*)c << ")";
    274         } break;
    275 
    276         case BC_DEAD_BINDER_DONE: {
    277             const int32_t c = *cmd++;
    278             out << ": death cookie " << (void*)c;
    279         } break;
    280 
    281         default:
    282             // no details to show for: BC_REGISTER_LOOPER, BC_ENTER_LOOPER,
    283             // BC_EXIT_LOOPER
    284             break;
    285     }
    286 
    287     out << endl;
    288     return cmd;
    289 }
    290 #endif
    291 
    292 static pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER;
    293 static bool gHaveTLS = false;
    294 static pthread_key_t gTLS = 0;
    295 static bool gShutdown = false;
    296 static bool gDisableBackgroundScheduling = false;
    297 
    298 IPCThreadState* IPCThreadState::self()
    299 {
    300     if (gHaveTLS) {
    301 restart:
    302         const pthread_key_t k = gTLS;
    303         IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
    304         if (st) return st;
    305         return new IPCThreadState;
    306     }
    307 
    308     if (gShutdown) return NULL;
    309 
    310     pthread_mutex_lock(&gTLSMutex);
    311     if (!gHaveTLS) {
    312         if (pthread_key_create(&gTLS, threadDestructor) != 0) {
    313             pthread_mutex_unlock(&gTLSMutex);
    314             return NULL;
    315         }
    316         gHaveTLS = true;
    317     }
    318     pthread_mutex_unlock(&gTLSMutex);
    319     goto restart;
    320 }
    321 
    322 IPCThreadState* IPCThreadState::selfOrNull()
    323 {
    324     if (gHaveTLS) {
    325         const pthread_key_t k = gTLS;
    326         IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
    327         return st;
    328     }
    329     return NULL;
    330 }
    331 
    332 void IPCThreadState::shutdown()
    333 {
    334     gShutdown = true;
    335 
    336     if (gHaveTLS) {
    337         // XXX Need to wait for all thread pool threads to exit!
    338         IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS);
    339         if (st) {
    340             delete st;
    341             pthread_setspecific(gTLS, NULL);
    342         }
    343         gHaveTLS = false;
    344     }
    345 }
    346 
    347 void IPCThreadState::disableBackgroundScheduling(bool disable)
    348 {
    349     gDisableBackgroundScheduling = disable;
    350 }
    351 
    352 sp<ProcessState> IPCThreadState::process()
    353 {
    354     return mProcess;
    355 }
    356 
    357 status_t IPCThreadState::clearLastError()
    358 {
    359     const status_t err = mLastError;
    360     mLastError = NO_ERROR;
    361     return err;
    362 }
    363 
    364 int IPCThreadState::getCallingPid()
    365 {
    366     return mCallingPid;
    367 }
    368 
    369 int IPCThreadState::getCallingUid()
    370 {
    371     return mCallingUid;
    372 }
    373 
    374 int64_t IPCThreadState::clearCallingIdentity()
    375 {
    376     int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid;
    377     clearCaller();
    378     return token;
    379 }
    380 
    381 void IPCThreadState::setStrictModePolicy(int32_t policy)
    382 {
    383     mStrictModePolicy = policy;
    384 }
    385 
    386 int32_t IPCThreadState::getStrictModePolicy() const
    387 {
    388     return mStrictModePolicy;
    389 }
    390 
    391 void IPCThreadState::setLastTransactionBinderFlags(int32_t flags)
    392 {
    393     mLastTransactionBinderFlags = flags;
    394 }
    395 
    396 int32_t IPCThreadState::getLastTransactionBinderFlags() const
    397 {
    398     return mLastTransactionBinderFlags;
    399 }
    400 
    401 void IPCThreadState::restoreCallingIdentity(int64_t token)
    402 {
    403     mCallingUid = (int)(token>>32);
    404     mCallingPid = (int)token;
    405 }
    406 
    407 void IPCThreadState::clearCaller()
    408 {
    409     mCallingPid = getpid();
    410     mCallingUid = getuid();
    411 }
    412 
    413 void IPCThreadState::flushCommands()
    414 {
    415     if (mProcess->mDriverFD <= 0)
    416         return;
    417     talkWithDriver(false);
    418 }
    419 
    420 void IPCThreadState::joinThreadPool(bool isMain)
    421 {
    422     LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid());
    423 
    424     mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
    425 
    426     // This thread may have been spawned by a thread that was in the background
    427     // scheduling group, so first we will make sure it is in the default/foreground
    428     // one to avoid performing an initial transaction in the background.
    429     androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT);
    430 
    431     status_t result;
    432     do {
    433         int32_t cmd;
    434 
    435         // When we've cleared the incoming command queue, process any pending derefs
    436         if (mIn.dataPosition() >= mIn.dataSize()) {
    437             size_t numPending = mPendingWeakDerefs.size();
    438             if (numPending > 0) {
    439                 for (size_t i = 0; i < numPending; i++) {
    440                     RefBase::weakref_type* refs = mPendingWeakDerefs[i];
    441                     refs->decWeak(mProcess.get());
    442                 }
    443                 mPendingWeakDerefs.clear();
    444             }
    445 
    446             numPending = mPendingStrongDerefs.size();
    447             if (numPending > 0) {
    448                 for (size_t i = 0; i < numPending; i++) {
    449                     BBinder* obj = mPendingStrongDerefs[i];
    450                     obj->decStrong(mProcess.get());
    451                 }
    452                 mPendingStrongDerefs.clear();
    453             }
    454         }
    455 
    456         // now get the next command to be processed, waiting if necessary
    457         result = talkWithDriver();
    458         if (result >= NO_ERROR) {
    459             size_t IN = mIn.dataAvail();
    460             if (IN < sizeof(int32_t)) continue;
    461             cmd = mIn.readInt32();
    462             IF_LOG_COMMANDS() {
    463                 alog << "Processing top-level Command: "
    464                     << getReturnString(cmd) << endl;
    465             }
    466 
    467 
    468             result = executeCommand(cmd);
    469         }
    470 
    471         // After executing the command, ensure that the thread is returned to the
    472         // default cgroup before rejoining the pool.  The driver takes care of
    473         // restoring the priority, but doesn't do anything with cgroups so we
    474         // need to take care of that here in userspace.  Note that we do make
    475         // sure to go in the foreground after executing a transaction, but
    476         // there are other callbacks into user code that could have changed
    477         // our group so we want to make absolutely sure it is put back.
    478         androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT);
    479 
    480         // Let this thread exit the thread pool if it is no longer
    481         // needed and it is not the main process thread.
    482         if(result == TIMED_OUT && !isMain) {
    483             break;
    484         }
    485     } while (result != -ECONNREFUSED && result != -EBADF);
    486 
    487     LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n",
    488         (void*)pthread_self(), getpid(), (void*)result);
    489 
    490     mOut.writeInt32(BC_EXIT_LOOPER);
    491     talkWithDriver(false);
    492 }
    493 
    494 void IPCThreadState::stopProcess(bool immediate)
    495 {
    496     //LOGI("**** STOPPING PROCESS");
    497     flushCommands();
    498     int fd = mProcess->mDriverFD;
    499     mProcess->mDriverFD = -1;
    500     close(fd);
    501     //kill(getpid(), SIGKILL);
    502 }
    503 
    504 status_t IPCThreadState::transact(int32_t handle,
    505                                   uint32_t code, const Parcel& data,
    506                                   Parcel* reply, uint32_t flags)
    507 {
    508     status_t err = data.errorCheck();
    509 
    510     flags |= TF_ACCEPT_FDS;
    511 
    512     IF_LOG_TRANSACTIONS() {
    513         TextOutput::Bundle _b(alog);
    514         alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand "
    515             << handle << " / code " << TypeCode(code) << ": "
    516             << indent << data << dedent << endl;
    517     }
    518 
    519     if (err == NO_ERROR) {
    520         LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(),
    521             (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY");
    522         err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
    523     }
    524 
    525     if (err != NO_ERROR) {
    526         if (reply) reply->setError(err);
    527         return (mLastError = err);
    528     }
    529 
    530     if ((flags & TF_ONE_WAY) == 0) {
    531         #if 0
    532         if (code == 4) { // relayout
    533             LOGI(">>>>>> CALLING transaction 4");
    534         } else {
    535             LOGI(">>>>>> CALLING transaction %d", code);
    536         }
    537         #endif
    538         if (reply) {
    539             err = waitForResponse(reply);
    540         } else {
    541             Parcel fakeReply;
    542             err = waitForResponse(&fakeReply);
    543         }
    544         #if 0
    545         if (code == 4) { // relayout
    546             LOGI("<<<<<< RETURNING transaction 4");
    547         } else {
    548             LOGI("<<<<<< RETURNING transaction %d", code);
    549         }
    550         #endif
    551 
    552         IF_LOG_TRANSACTIONS() {
    553             TextOutput::Bundle _b(alog);
    554             alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand "
    555                 << handle << ": ";
    556             if (reply) alog << indent << *reply << dedent << endl;
    557             else alog << "(none requested)" << endl;
    558         }
    559     } else {
    560         err = waitForResponse(NULL, NULL);
    561     }
    562 
    563     return err;
    564 }
    565 
    566 void IPCThreadState::incStrongHandle(int32_t handle)
    567 {
    568     LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle);
    569     mOut.writeInt32(BC_ACQUIRE);
    570     mOut.writeInt32(handle);
    571 }
    572 
    573 void IPCThreadState::decStrongHandle(int32_t handle)
    574 {
    575     LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle);
    576     mOut.writeInt32(BC_RELEASE);
    577     mOut.writeInt32(handle);
    578 }
    579 
    580 void IPCThreadState::incWeakHandle(int32_t handle)
    581 {
    582     LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle);
    583     mOut.writeInt32(BC_INCREFS);
    584     mOut.writeInt32(handle);
    585 }
    586 
    587 void IPCThreadState::decWeakHandle(int32_t handle)
    588 {
    589     LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle);
    590     mOut.writeInt32(BC_DECREFS);
    591     mOut.writeInt32(handle);
    592 }
    593 
    594 status_t IPCThreadState::attemptIncStrongHandle(int32_t handle)
    595 {
    596     LOG_REMOTEREFS("IPCThreadState::attemptIncStrongHandle(%d)\n", handle);
    597     mOut.writeInt32(BC_ATTEMPT_ACQUIRE);
    598     mOut.writeInt32(0); // xxx was thread priority
    599     mOut.writeInt32(handle);
    600     status_t result = UNKNOWN_ERROR;
    601 
    602     waitForResponse(NULL, &result);
    603 
    604 #if LOG_REFCOUNTS
    605     printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n",
    606         handle, result == NO_ERROR ? "SUCCESS" : "FAILURE");
    607 #endif
    608 
    609     return result;
    610 }
    611 
    612 void IPCThreadState::expungeHandle(int32_t handle, IBinder* binder)
    613 {
    614 #if LOG_REFCOUNTS
    615     printf("IPCThreadState::expungeHandle(%ld)\n", handle);
    616 #endif
    617     self()->mProcess->expungeHandle(handle, binder);
    618 }
    619 
    620 status_t IPCThreadState::requestDeathNotification(int32_t handle, BpBinder* proxy)
    621 {
    622     mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION);
    623     mOut.writeInt32((int32_t)handle);
    624     mOut.writeInt32((int32_t)proxy);
    625     return NO_ERROR;
    626 }
    627 
    628 status_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy)
    629 {
    630     mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION);
    631     mOut.writeInt32((int32_t)handle);
    632     mOut.writeInt32((int32_t)proxy);
    633     return NO_ERROR;
    634 }
    635 
    636 IPCThreadState::IPCThreadState()
    637     : mProcess(ProcessState::self()),
    638       mMyThreadId(androidGetTid()),
    639       mStrictModePolicy(0),
    640       mLastTransactionBinderFlags(0)
    641 {
    642     pthread_setspecific(gTLS, this);
    643     clearCaller();
    644     mIn.setDataCapacity(256);
    645     mOut.setDataCapacity(256);
    646 }
    647 
    648 IPCThreadState::~IPCThreadState()
    649 {
    650 }
    651 
    652 status_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags)
    653 {
    654     status_t err;
    655     status_t statusBuffer;
    656     err = writeTransactionData(BC_REPLY, flags, -1, 0, reply, &statusBuffer);
    657     if (err < NO_ERROR) return err;
    658 
    659     return waitForResponse(NULL, NULL);
    660 }
    661 
    662 status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
    663 {
    664     int32_t cmd;
    665     int32_t err;
    666 
    667     while (1) {
    668         if ((err=talkWithDriver()) < NO_ERROR) break;
    669         err = mIn.errorCheck();
    670         if (err < NO_ERROR) break;
    671         if (mIn.dataAvail() == 0) continue;
    672 
    673         cmd = mIn.readInt32();
    674 
    675         IF_LOG_COMMANDS() {
    676             alog << "Processing waitForResponse Command: "
    677                 << getReturnString(cmd) << endl;
    678         }
    679 
    680         switch (cmd) {
    681         case BR_TRANSACTION_COMPLETE:
    682             if (!reply && !acquireResult) goto finish;
    683             break;
    684 
    685         case BR_DEAD_REPLY:
    686             err = DEAD_OBJECT;
    687             goto finish;
    688 
    689         case BR_FAILED_REPLY:
    690             err = FAILED_TRANSACTION;
    691             goto finish;
    692 
    693         case BR_ACQUIRE_RESULT:
    694             {
    695                 LOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT");
    696                 const int32_t result = mIn.readInt32();
    697                 if (!acquireResult) continue;
    698                 *acquireResult = result ? NO_ERROR : INVALID_OPERATION;
    699             }
    700             goto finish;
    701 
    702         case BR_REPLY:
    703             {
    704                 binder_transaction_data tr;
    705                 err = mIn.read(&tr, sizeof(tr));
    706                 LOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY");
    707                 if (err != NO_ERROR) goto finish;
    708 
    709                 if (reply) {
    710                     if ((tr.flags & TF_STATUS_CODE) == 0) {
    711                         reply->ipcSetDataReference(
    712                             reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
    713                             tr.data_size,
    714                             reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
    715                             tr.offsets_size/sizeof(size_t),
    716                             freeBuffer, this);
    717                     } else {
    718                         err = *static_cast<const status_t*>(tr.data.ptr.buffer);
    719                         freeBuffer(NULL,
    720                             reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
    721                             tr.data_size,
    722                             reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
    723                             tr.offsets_size/sizeof(size_t), this);
    724                     }
    725                 } else {
    726                     freeBuffer(NULL,
    727                         reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
    728                         tr.data_size,
    729                         reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
    730                         tr.offsets_size/sizeof(size_t), this);
    731                     continue;
    732                 }
    733             }
    734             goto finish;
    735 
    736         default:
    737             err = executeCommand(cmd);
    738             if (err != NO_ERROR) goto finish;
    739             break;
    740         }
    741     }
    742 
    743 finish:
    744     if (err != NO_ERROR) {
    745         if (acquireResult) *acquireResult = err;
    746         if (reply) reply->setError(err);
    747         mLastError = err;
    748     }
    749 
    750     return err;
    751 }
    752 
    753 status_t IPCThreadState::talkWithDriver(bool doReceive)
    754 {
    755     LOG_ASSERT(mProcess->mDriverFD >= 0, "Binder driver is not opened");
    756 
    757     binder_write_read bwr;
    758 
    759     // Is the read buffer empty?
    760     const bool needRead = mIn.dataPosition() >= mIn.dataSize();
    761 
    762     // We don't want to write anything if we are still reading
    763     // from data left in the input buffer and the caller
    764     // has requested to read the next data.
    765     const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0;
    766 
    767     bwr.write_size = outAvail;
    768     bwr.write_buffer = (long unsigned int)mOut.data();
    769 
    770     // This is what we'll read.
    771     if (doReceive && needRead) {
    772         bwr.read_size = mIn.dataCapacity();
    773         bwr.read_buffer = (long unsigned int)mIn.data();
    774     } else {
    775         bwr.read_size = 0;
    776     }
    777 
    778     IF_LOG_COMMANDS() {
    779         TextOutput::Bundle _b(alog);
    780         if (outAvail != 0) {
    781             alog << "Sending commands to driver: " << indent;
    782             const void* cmds = (const void*)bwr.write_buffer;
    783             const void* end = ((const uint8_t*)cmds)+bwr.write_size;
    784             alog << HexDump(cmds, bwr.write_size) << endl;
    785             while (cmds < end) cmds = printCommand(alog, cmds);
    786             alog << dedent;
    787         }
    788         alog << "Size of receive buffer: " << bwr.read_size
    789             << ", needRead: " << needRead << ", doReceive: " << doReceive << endl;
    790     }
    791 
    792     // Return immediately if there is nothing to do.
    793     if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR;
    794 
    795     bwr.write_consumed = 0;
    796     bwr.read_consumed = 0;
    797     status_t err;
    798     do {
    799         IF_LOG_COMMANDS() {
    800             alog << "About to read/write, write size = " << mOut.dataSize() << endl;
    801         }
    802 #if defined(HAVE_ANDROID_OS)
    803         if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0)
    804             err = NO_ERROR;
    805         else
    806             err = -errno;
    807 #else
    808         err = INVALID_OPERATION;
    809 #endif
    810         IF_LOG_COMMANDS() {
    811             alog << "Finished read/write, write size = " << mOut.dataSize() << endl;
    812         }
    813     } while (err == -EINTR);
    814 
    815     IF_LOG_COMMANDS() {
    816         alog << "Our err: " << (void*)err << ", write consumed: "
    817             << bwr.write_consumed << " (of " << mOut.dataSize()
    818 			<< "), read consumed: " << bwr.read_consumed << endl;
    819     }
    820 
    821     if (err >= NO_ERROR) {
    822         if (bwr.write_consumed > 0) {
    823             if (bwr.write_consumed < (ssize_t)mOut.dataSize())
    824                 mOut.remove(0, bwr.write_consumed);
    825             else
    826                 mOut.setDataSize(0);
    827         }
    828         if (bwr.read_consumed > 0) {
    829             mIn.setDataSize(bwr.read_consumed);
    830             mIn.setDataPosition(0);
    831         }
    832         IF_LOG_COMMANDS() {
    833             TextOutput::Bundle _b(alog);
    834             alog << "Remaining data size: " << mOut.dataSize() << endl;
    835             alog << "Received commands from driver: " << indent;
    836             const void* cmds = mIn.data();
    837             const void* end = mIn.data() + mIn.dataSize();
    838             alog << HexDump(cmds, mIn.dataSize()) << endl;
    839             while (cmds < end) cmds = printReturnCommand(alog, cmds);
    840             alog << dedent;
    841         }
    842         return NO_ERROR;
    843     }
    844 
    845     return err;
    846 }
    847 
    848 status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
    849     int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
    850 {
    851     binder_transaction_data tr;
    852 
    853     tr.target.handle = handle;
    854     tr.code = code;
    855     tr.flags = binderFlags;
    856     tr.cookie = 0;
    857     tr.sender_pid = 0;
    858     tr.sender_euid = 0;
    859 
    860     const status_t err = data.errorCheck();
    861     if (err == NO_ERROR) {
    862         tr.data_size = data.ipcDataSize();
    863         tr.data.ptr.buffer = data.ipcData();
    864         tr.offsets_size = data.ipcObjectsCount()*sizeof(size_t);
    865         tr.data.ptr.offsets = data.ipcObjects();
    866     } else if (statusBuffer) {
    867         tr.flags |= TF_STATUS_CODE;
    868         *statusBuffer = err;
    869         tr.data_size = sizeof(status_t);
    870         tr.data.ptr.buffer = statusBuffer;
    871         tr.offsets_size = 0;
    872         tr.data.ptr.offsets = NULL;
    873     } else {
    874         return (mLastError = err);
    875     }
    876 
    877     mOut.writeInt32(cmd);
    878     mOut.write(&tr, sizeof(tr));
    879 
    880     return NO_ERROR;
    881 }
    882 
    883 sp<BBinder> the_context_object;
    884 
    885 void setTheContextObject(sp<BBinder> obj)
    886 {
    887     the_context_object = obj;
    888 }
    889 
    890 status_t IPCThreadState::executeCommand(int32_t cmd)
    891 {
    892     BBinder* obj;
    893     RefBase::weakref_type* refs;
    894     status_t result = NO_ERROR;
    895 
    896     switch (cmd) {
    897     case BR_ERROR:
    898         result = mIn.readInt32();
    899         break;
    900 
    901     case BR_OK:
    902         break;
    903 
    904     case BR_ACQUIRE:
    905         refs = (RefBase::weakref_type*)mIn.readInt32();
    906         obj = (BBinder*)mIn.readInt32();
    907         LOG_ASSERT(refs->refBase() == obj,
    908                    "BR_ACQUIRE: object %p does not match cookie %p (expected %p)",
    909                    refs, obj, refs->refBase());
    910         obj->incStrong(mProcess.get());
    911         IF_LOG_REMOTEREFS() {
    912             LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj);
    913             obj->printRefs();
    914         }
    915         mOut.writeInt32(BC_ACQUIRE_DONE);
    916         mOut.writeInt32((int32_t)refs);
    917         mOut.writeInt32((int32_t)obj);
    918         break;
    919 
    920     case BR_RELEASE:
    921         refs = (RefBase::weakref_type*)mIn.readInt32();
    922         obj = (BBinder*)mIn.readInt32();
    923         LOG_ASSERT(refs->refBase() == obj,
    924                    "BR_RELEASE: object %p does not match cookie %p (expected %p)",
    925                    refs, obj, refs->refBase());
    926         IF_LOG_REMOTEREFS() {
    927             LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj);
    928             obj->printRefs();
    929         }
    930         mPendingStrongDerefs.push(obj);
    931         break;
    932 
    933     case BR_INCREFS:
    934         refs = (RefBase::weakref_type*)mIn.readInt32();
    935         obj = (BBinder*)mIn.readInt32();
    936         refs->incWeak(mProcess.get());
    937         mOut.writeInt32(BC_INCREFS_DONE);
    938         mOut.writeInt32((int32_t)refs);
    939         mOut.writeInt32((int32_t)obj);
    940         break;
    941 
    942     case BR_DECREFS:
    943         refs = (RefBase::weakref_type*)mIn.readInt32();
    944         obj = (BBinder*)mIn.readInt32();
    945         // NOTE: This assertion is not valid, because the object may no
    946         // longer exist (thus the (BBinder*)cast above resulting in a different
    947         // memory address).
    948         //LOG_ASSERT(refs->refBase() == obj,
    949         //           "BR_DECREFS: object %p does not match cookie %p (expected %p)",
    950         //           refs, obj, refs->refBase());
    951         mPendingWeakDerefs.push(refs);
    952         break;
    953 
    954     case BR_ATTEMPT_ACQUIRE:
    955         refs = (RefBase::weakref_type*)mIn.readInt32();
    956         obj = (BBinder*)mIn.readInt32();
    957 
    958         {
    959             const bool success = refs->attemptIncStrong(mProcess.get());
    960             LOG_ASSERT(success && refs->refBase() == obj,
    961                        "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)",
    962                        refs, obj, refs->refBase());
    963 
    964             mOut.writeInt32(BC_ACQUIRE_RESULT);
    965             mOut.writeInt32((int32_t)success);
    966         }
    967         break;
    968 
    969     case BR_TRANSACTION:
    970         {
    971             binder_transaction_data tr;
    972             result = mIn.read(&tr, sizeof(tr));
    973             LOG_ASSERT(result == NO_ERROR,
    974                 "Not enough command data for brTRANSACTION");
    975             if (result != NO_ERROR) break;
    976 
    977             Parcel buffer;
    978             buffer.ipcSetDataReference(
    979                 reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
    980                 tr.data_size,
    981                 reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
    982                 tr.offsets_size/sizeof(size_t), freeBuffer, this);
    983 
    984             const pid_t origPid = mCallingPid;
    985             const uid_t origUid = mCallingUid;
    986 
    987             mCallingPid = tr.sender_pid;
    988             mCallingUid = tr.sender_euid;
    989 
    990             int curPrio = getpriority(PRIO_PROCESS, mMyThreadId);
    991             if (gDisableBackgroundScheduling) {
    992                 if (curPrio > ANDROID_PRIORITY_NORMAL) {
    993                     // We have inherited a reduced priority from the caller, but do not
    994                     // want to run in that state in this process.  The driver set our
    995                     // priority already (though not our scheduling class), so bounce
    996                     // it back to the default before invoking the transaction.
    997                     setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL);
    998                 }
    999             } else {
   1000                 if (curPrio >= ANDROID_PRIORITY_BACKGROUND) {
   1001                     // We want to use the inherited priority from the caller.
   1002                     // Ensure this thread is in the background scheduling class,
   1003                     // since the driver won't modify scheduling classes for us.
   1004                     // The scheduling group is reset to default by the caller
   1005                     // once this method returns after the transaction is complete.
   1006                     androidSetThreadSchedulingGroup(mMyThreadId,
   1007                                                     ANDROID_TGROUP_BG_NONINTERACT);
   1008                 }
   1009             }
   1010 
   1011             //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
   1012 
   1013             Parcel reply;
   1014             IF_LOG_TRANSACTIONS() {
   1015                 TextOutput::Bundle _b(alog);
   1016                 alog << "BR_TRANSACTION thr " << (void*)pthread_self()
   1017                     << " / obj " << tr.target.ptr << " / code "
   1018                     << TypeCode(tr.code) << ": " << indent << buffer
   1019                     << dedent << endl
   1020                     << "Data addr = "
   1021                     << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer)
   1022                     << ", offsets addr="
   1023                     << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl;
   1024             }
   1025             if (tr.target.ptr) {
   1026                 sp<BBinder> b((BBinder*)tr.cookie);
   1027                 const status_t error = b->transact(tr.code, buffer, &reply, tr.flags);
   1028                 if (error < NO_ERROR) reply.setError(error);
   1029 
   1030             } else {
   1031                 const status_t error = the_context_object->transact(tr.code, buffer, &reply, tr.flags);
   1032                 if (error < NO_ERROR) reply.setError(error);
   1033             }
   1034 
   1035             //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
   1036             //     mCallingPid, origPid, origUid);
   1037 
   1038             if ((tr.flags & TF_ONE_WAY) == 0) {
   1039                 LOG_ONEWAY("Sending reply to %d!", mCallingPid);
   1040                 sendReply(reply, 0);
   1041             } else {
   1042                 LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
   1043             }
   1044 
   1045             mCallingPid = origPid;
   1046             mCallingUid = origUid;
   1047 
   1048             IF_LOG_TRANSACTIONS() {
   1049                 TextOutput::Bundle _b(alog);
   1050                 alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj "
   1051                     << tr.target.ptr << ": " << indent << reply << dedent << endl;
   1052             }
   1053 
   1054         }
   1055         break;
   1056 
   1057     case BR_DEAD_BINDER:
   1058         {
   1059             BpBinder *proxy = (BpBinder*)mIn.readInt32();
   1060             proxy->sendObituary();
   1061             mOut.writeInt32(BC_DEAD_BINDER_DONE);
   1062             mOut.writeInt32((int32_t)proxy);
   1063         } break;
   1064 
   1065     case BR_CLEAR_DEATH_NOTIFICATION_DONE:
   1066         {
   1067             BpBinder *proxy = (BpBinder*)mIn.readInt32();
   1068             proxy->getWeakRefs()->decWeak(proxy);
   1069         } break;
   1070 
   1071     case BR_FINISHED:
   1072         result = TIMED_OUT;
   1073         break;
   1074 
   1075     case BR_NOOP:
   1076         break;
   1077 
   1078     case BR_SPAWN_LOOPER:
   1079         mProcess->spawnPooledThread(false);
   1080         break;
   1081 
   1082     default:
   1083         printf("*** BAD COMMAND %d received from Binder driver\n", cmd);
   1084         result = UNKNOWN_ERROR;
   1085         break;
   1086     }
   1087 
   1088     if (result != NO_ERROR) {
   1089         mLastError = result;
   1090     }
   1091 
   1092     return result;
   1093 }
   1094 
   1095 void IPCThreadState::threadDestructor(void *st)
   1096 {
   1097 	IPCThreadState* const self = static_cast<IPCThreadState*>(st);
   1098 	if (self) {
   1099 		self->flushCommands();
   1100 #if defined(HAVE_ANDROID_OS)
   1101         ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0);
   1102 #endif
   1103 		delete self;
   1104 	}
   1105 }
   1106 
   1107 
   1108 void IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, size_t dataSize,
   1109                                 const size_t* objects, size_t objectsSize,
   1110                                 void* cookie)
   1111 {
   1112     //LOGI("Freeing parcel %p", &parcel);
   1113     IF_LOG_COMMANDS() {
   1114         alog << "Writing BC_FREE_BUFFER for " << data << endl;
   1115     }
   1116     LOG_ASSERT(data != NULL, "Called with NULL data");
   1117     if (parcel != NULL) parcel->closeFileDescriptors();
   1118     IPCThreadState* state = self();
   1119     state->mOut.writeInt32(BC_FREE_BUFFER);
   1120     state->mOut.writeInt32((int32_t)data);
   1121 }
   1122 
   1123 }; // namespace android
   1124