Skip to content

Commit 6d7ecf1

Browse files
PinterfPinterf
authored andcommitted
fix theoretical and debug case cache corruption when readout is slow
1 parent fb35c74 commit 6d7ecf1

File tree

2 files changed

+473
-447
lines changed

2 files changed

+473
-447
lines changed

avs_core/core/Prefetcher.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ int __stdcall Prefetcher::SchedulePrefetch(int current_n, int prefetch_start, IS
178178
PVideoFrame __stdcall Prefetcher::GetFrame(int n, IScriptEnvironment* env)
179179
{
180180
IScriptEnvironment2 *env2 = static_cast<IScriptEnvironment2*>(env);
181-
181+
182182
int pattern = n - _pimpl->LastRequestedFrame;
183183
_pimpl->LastRequestedFrame = n;
184184
if (pattern == 0)
@@ -258,7 +258,9 @@ PVideoFrame __stdcall Prefetcher::GetFrame(int n, IScriptEnvironment* env)
258258
{
259259
try
260260
{
261-
cache_handle.first->value = _pimpl->child->GetFrame(n, env);
261+
result = _pimpl->child->GetFrame(n, env); // P.F. fill result before Commit!
262+
cache_handle.first->value = result;
263+
// cache_handle.first->value = _pimpl->child->GetFrame(n, env); // P.F. before Commit!
262264
#ifdef X86_32
263265
_mm_empty();
264266
#endif
@@ -269,7 +271,7 @@ PVideoFrame __stdcall Prefetcher::GetFrame(int n, IScriptEnvironment* env)
269271
_pimpl->VideoCache->rollback(&cache_handle);
270272
throw;
271273
}
272-
result = cache_handle.first->value;
274+
// result = cache_handle.first->value; // P.F. not after commit!
273275
break;
274276
}
275277
case LRU_LOOKUP_FOUND_AND_READY:

0 commit comments

Comments
 (0)