[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / BackgroundInfoLoader.cpp
blobde3d5a3a9eeaf69cbd5b6c6bace317236af5008e
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "BackgroundInfoLoader.h"
11 #include "FileItem.h"
12 #include "FileItemList.h"
13 #include "URL.h"
14 #include "threads/Thread.h"
15 #include "utils/log.h"
17 #include <mutex>
19 CBackgroundInfoLoader::CBackgroundInfoLoader() = default;
21 CBackgroundInfoLoader::~CBackgroundInfoLoader()
23 StopThread();
26 void CBackgroundInfoLoader::Reset()
28 m_pVecItems = nullptr;
29 m_vecItems.clear();
30 m_bIsLoading = false;
33 void CBackgroundInfoLoader::Run()
35 try
37 if (!m_vecItems.empty())
39 OnLoaderStart();
41 // Stage 1: All "fast" stuff we have already cached
42 for (std::vector<CFileItemPtr>::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter)
44 const CFileItemPtr& pItem = *iter;
46 // Ask the callback if we should abort
47 if ((m_pProgressCallback && m_pProgressCallback->Abort()) || m_bStop)
48 break;
50 try
52 if (LoadItemCached(pItem.get()) && m_pObserver)
53 m_pObserver->OnItemLoaded(pItem.get());
55 catch (...)
57 CLog::Log(LOGERROR,
58 "CBackgroundInfoLoader::LoadItemCached - Unhandled exception for item {}",
59 CURL::GetRedacted(pItem->GetPath()));
63 // Stage 2: All "slow" stuff that we need to lookup
64 for (std::vector<CFileItemPtr>::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter)
66 const CFileItemPtr& pItem = *iter;
68 // Ask the callback if we should abort
69 if ((m_pProgressCallback && m_pProgressCallback->Abort()) || m_bStop)
70 break;
72 try
74 if (LoadItemLookup(pItem.get()) && m_pObserver)
75 m_pObserver->OnItemLoaded(pItem.get());
77 catch (...)
79 CLog::Log(LOGERROR,
80 "CBackgroundInfoLoader::LoadItemLookup - Unhandled exception for item {}",
81 CURL::GetRedacted(pItem->GetPath()));
86 OnLoaderFinish();
88 catch (...)
90 CLog::Log(LOGERROR, "{} - Unhandled exception", __FUNCTION__);
93 Reset();
96 void CBackgroundInfoLoader::Load(CFileItemList& items)
98 StopThread();
100 if (items.IsEmpty())
101 return;
103 std::unique_lock<CCriticalSection> lock(m_lock);
105 for (int nItem=0; nItem < items.Size(); nItem++)
106 m_vecItems.push_back(items[nItem]);
108 m_pVecItems = &items;
109 m_bStop = false;
110 m_bIsLoading = true;
112 m_thread = new CThread(this, "BackgroundLoader");
113 m_thread->Create();
114 m_thread->SetPriority(ThreadPriority::BELOW_NORMAL);
117 void CBackgroundInfoLoader::StopAsync()
119 m_bStop = true;
123 void CBackgroundInfoLoader::StopThread()
125 StopAsync();
127 if (m_thread)
129 m_thread->StopThread();
130 delete m_thread;
131 m_thread = NULL;
133 Reset();
136 bool CBackgroundInfoLoader::IsLoading()
138 return m_bIsLoading;
141 void CBackgroundInfoLoader::SetObserver(IBackgroundLoaderObserver* pObserver)
143 m_pObserver = pObserver;
146 void CBackgroundInfoLoader::SetProgressCallback(IProgressCallback* pCallback)
148 m_pProgressCallback = pCallback;