| 36 | } |
| 37 | |
| 38 | status_t WorkQueue::schedule(WorkUnit* workUnit, size_t backlog) { |
| 39 | AutoMutex _l(mLock); |
| 40 | |
| 41 | if (mFinished || mCanceled) { |
| 42 | return INVALID_OPERATION; |
| 43 | } |
| 44 | |
| 45 | if (mWorkThreads.size() < mMaxThreads |
| 46 | && mIdleThreads < mWorkUnits.size() + 1) { |
| 47 | sp<WorkThread> workThread = new WorkThread(this, mCanCallJava); |
| 48 | status_t status = workThread->run("WorkQueue::WorkThread"); |
| 49 | if (status) { |
| 50 | return status; |
| 51 | } |
| 52 | mWorkThreads.add(workThread); |
| 53 | mIdleThreads += 1; |
| 54 | } else if (backlog) { |
| 55 | while (mWorkUnits.size() >= mMaxThreads * backlog) { |
| 56 | mWorkDequeuedCondition.wait(mLock); |
| 57 | if (mFinished || mCanceled) { |
| 58 | return INVALID_OPERATION; |
| 59 | } |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | mWorkUnits.add(workUnit); |
| 64 | mWorkChangedCondition.broadcast(); |
| 65 | return OK; |
| 66 | } |
| 67 | |
| 68 | status_t WorkQueue::cancel() { |
| 69 | AutoMutex _l(mLock); |
no test coverage detected