private void TranslateStackedSubs() { while (_threadCount != 0) { _backgroundTranslatorLock.AcquireReaderLock(Timeout.Infinite); if (_backgroundStack.TryPop(out RejitRequest request)) { TranslatedFunction func = Translate(_memory, _jumpTable, request.Address, request.Mode, highCq: true); _funcs.AddOrUpdate(request.Address, func, (key, oldFunc) => { EnqueueForDeletion(key, oldFunc); return(func); }); _jumpTable.RegisterFunction(request.Address, func); if (PtcProfiler.Enabled) { PtcProfiler.UpdateEntry(request.Address, request.Mode, highCq: true); } _backgroundTranslatorLock.ReleaseReaderLock(); } else { _backgroundTranslatorLock.ReleaseReaderLock(); _backgroundTranslatorEvent.WaitOne(); } } _backgroundTranslatorEvent.Set(); // Wake up any other background translator threads, to encourage them to exit. }
private void TranslateQueuedSubs() { while (_threadCount != 0) { if (_backgroundQueue.TryDequeue(out RejitRequest request)) { TranslatedFunction func = Translate(request.Address, request.Mode, highCq: true); _funcs.AddOrUpdate(request.Address, func, (key, oldFunc) => func); _jumpTable.RegisterFunction(request.Address, func); } else { _backgroundTranslatorEvent.WaitOne(); } } _backgroundTranslatorEvent.Set(); // Wake up any other background translator threads, to encourage them to exit. }