| 744 | } |
| 745 | |
| 746 | void BfCodeGen::DoWriteObjectFile(BfCodeGenRequest* codeGenRequest, const void* ptr, int size, const StringImpl& outFileName, BfCodeGenResult* externResultPtr) |
| 747 | { |
| 748 | codeGenRequest->mData.mVals = (uint8*)ptr; |
| 749 | codeGenRequest->mData.mSize = size; |
| 750 | codeGenRequest->mOutFileName = outFileName; |
| 751 | codeGenRequest->mResult.mType = BfCodeGenResult_NotDone; |
| 752 | codeGenRequest->mResult.mErrorMsgBufLen = 0; |
| 753 | codeGenRequest->mExternResultPtr = externResultPtr; |
| 754 | |
| 755 | int threadIdx = mRequestIdx % mMaxThreadCount; |
| 756 | if (threadIdx >= (int) mThreads.size()) |
| 757 | { |
| 758 | AutoCrit autoCrit(mThreadsCritSect); |
| 759 | BfCodeGenThread* thread = new BfCodeGenThread(); |
| 760 | thread->mThreadIdx = threadIdx; |
| 761 | thread->mCodeGen = this; |
| 762 | mThreads.push_back(thread); |
| 763 | thread->Start(); |
| 764 | } |
| 765 | |
| 766 | auto thread = mThreads[threadIdx]; |
| 767 | |
| 768 | BP_ZONE("WriteObjectFile_CritSect"); |
| 769 | AutoCrit autoCrit(mPendingRequestCritSect); |
| 770 | mPendingRequests.push_back(codeGenRequest); |
| 771 | |
| 772 | #ifdef BF_PLATFORM_WINDOWS |
| 773 | BF_ASSERT(!mRequestEvent.mEvent->mManualReset); // Make sure it's out of the SignalAll state |
| 774 | #endif |
| 775 | mRequestEvent.Set(); |
| 776 | |
| 777 | mRequestIdx++; |
| 778 | } |
| 779 | |
| 780 | void BfCodeGen::SetMaxThreads(int maxThreads) |
| 781 | { |
no test coverage detected