Skip to content

Commit 0aa445d

Browse files
committed
Bump version to 0.2.4. Use hash containers for packages. Parallel clean packages after install.
1 parent 8f2c628 commit 0aa445d

File tree

12 files changed

+94
-39
lines changed

12 files changed

+94
-39
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ project(cppan_client C CXX)
4444
if (NOT DEFINED VERSION_MAJOR)
4545
set(VERSION_MAJOR 0)
4646
set(VERSION_MINOR 2)
47-
set(VERSION_PATCH 3)
47+
set(VERSION_PATCH 4)
4848
endif()
4949

5050
# Output directory settings

src/common/database.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include <boost/nowide/fstream.hpp>
3838
#include <sqlite3.h>
3939

40+
#include <shared_mutex>
41+
4042
#include <primitives/log.h>
4143
DECLARE_STATIC_LOGGER(logger, "db");
4244

@@ -1159,7 +1161,7 @@ IdDependencies PackagesDatabase::findDependencies(const Packages &deps) const
11591161
for (auto &ad : all_deps)
11601162
{
11611163
auto &d = ad.second;
1162-
std::set<ProjectVersionId> ids;
1164+
std::unordered_set<ProjectVersionId> ids;
11631165
for (auto &dd2 : d.db_dependencies)
11641166
ids.insert(dd2.second.id);
11651167
d.setDependencyIds(ids);
@@ -1476,22 +1478,36 @@ PackagesSet PackagesDatabase::getDependentPackages(const PackagesSet &pkgs)
14761478

14771479
PackagesSet PackagesDatabase::getTransitiveDependentPackages(const PackagesSet &pkgs)
14781480
{
1481+
using Retrieved = std::unordered_map<Package, PackagesSet>;
1482+
1483+
static std::shared_mutex m;
1484+
static Retrieved retrieved;
1485+
14791486
auto r = pkgs;
1480-
std::map<Package, bool> retrieved;
14811487
while (1)
14821488
{
14831489
bool changed = false;
14841490

14851491
for (auto &pkg : r)
14861492
{
1487-
if (retrieved[pkg])
1488-
continue;
1493+
{
1494+
std::shared_lock<std::shared_mutex> lk(m);
1495+
auto i = retrieved.find(pkg);
1496+
if (i != retrieved.end())
1497+
{
1498+
r.insert(i->second.begin(), i->second.end());
1499+
continue;
1500+
}
1501+
}
14891502

1490-
retrieved[pkg] = true;
14911503
changed = true;
14921504

14931505
auto dpkgs = getDependentPackages(pkg);
14941506
r.insert(dpkgs.begin(), dpkgs.end());
1507+
{
1508+
std::unique_lock<std::shared_mutex> lk(m);
1509+
retrieved[pkg] = dpkgs;
1510+
}
14951511
break;
14961512
}
14971513

src/common/database.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class ServiceDatabase : public Database
136136
class PackagesDatabase : public Database
137137
{
138138
using Dependencies = DownloadDependency::DbDependencies;
139-
using DependenciesMap = std::map<Package, DownloadDependency>;
139+
using DependenciesMap = std::unordered_map<Package, DownloadDependency>;
140140

141141
public:
142142
PackagesDatabase();

src/common/dependency.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ struct Remote;
2525

2626
struct DownloadDependency : public Package
2727
{
28-
using IdDependencies = std::map<ProjectVersionId, DownloadDependency>;
29-
using DbDependencies = std::map<String, DownloadDependency>;
30-
using Dependencies = std::map<Package, DownloadDependency>;
28+
using IdDependencies = std::unordered_map<ProjectVersionId, DownloadDependency>;
29+
using DbDependencies = std::unordered_map<String, DownloadDependency>;
30+
using Dependencies = std::unordered_map<Package, DownloadDependency>;
3131

3232
// extended data
3333
ProjectVersionId id = 0;
@@ -38,7 +38,7 @@ struct DownloadDependency : public Package
3838
DbDependencies db_dependencies;
3939

4040
public:
41-
void setDependencyIds(const std::set<ProjectVersionId> &ids)
41+
void setDependencyIds(const std::unordered_set<ProjectVersionId> &ids)
4242
{
4343
id_dependencies = ids;
4444
}
@@ -63,7 +63,7 @@ struct DownloadDependency : public Package
6363
}
6464

6565
private:
66-
std::set<ProjectVersionId> id_dependencies;
66+
std::unordered_set<ProjectVersionId> id_dependencies;
6767
Dependencies dependencies;
6868
};
6969

src/common/package.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <boost/nowide/fstream.hpp>
2727

2828
#include <regex>
29+
#include <shared_mutex>
2930

3031
#include <primitives/log.h>
3132
DECLARE_STATIC_LOGGER(logger, "package");
@@ -196,8 +197,8 @@ void cleanPackages(const String &s, int flags)
196197

197198
void cleanPackage(const Package &pkg, int flags)
198199
{
199-
static std::map<Package, int> cleaned_packages;
200-
static shared_mutex m;
200+
static std::unordered_map<Package, int> cleaned_packages;
201+
static std::shared_mutex m;
201202

202203
static const auto cache_dir_bin = enumerate_files(directories.storage_dir_bin);
203204
static const auto cache_dir_exp = enumerate_files(directories.storage_dir_exp);
@@ -208,7 +209,7 @@ void cleanPackage(const Package &pkg, int flags)
208209

209210
// only clean yet uncleaned flags
210211
{
211-
std::shared_lock<shared_mutex> lock(m);
212+
std::shared_lock<std::shared_mutex> lock(m);
212213
auto i = cleaned_packages.find(pkg);
213214
if (i != cleaned_packages.end())
214215
flags = flags & ~i->second;
@@ -285,7 +286,7 @@ void cleanPackage(const Package &pkg, int flags)
285286

286287
// save cleaned packages
287288
{
288-
std::lock_guard<shared_mutex> lock(m);
289+
std::lock_guard<std::shared_mutex> lock(m);
289290
cleaned_packages[pkg] |= flags;
290291
}
291292
}
@@ -296,9 +297,9 @@ void cleanPackages(const PackagesSet &pkgs, int flags)
296297
cleanPackage(pkg, flags);
297298
}
298299

299-
std::map<int, String> CleanTarget::getStringsById()
300+
std::unordered_map<int, String> CleanTarget::getStringsById()
300301
{
301-
static std::map<int, String> m
302+
static std::unordered_map<int, String> m
302303
{
303304
#define ADD(x) { CleanTarget::x, boost::to_lower_copy(String(#x)) }
304305

@@ -314,10 +315,10 @@ std::map<int, String> CleanTarget::getStringsById()
314315
return m;
315316
}
316317

317-
std::map<String, int> CleanTarget::getStrings()
318+
std::unordered_map<String, int> CleanTarget::getStrings()
318319
{
319320
auto m = CleanTarget::getStringsById();
320-
std::map<String, int> m2;
321+
std::unordered_map<String, int> m2;
321322
for (auto &s : m)
322323
m2[s.second] = s.first;
323324
return m2;

src/common/package.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ struct Package
6666
path getDir(const path &p) const;
6767
};
6868

69-
using Packages = std::map<String, Package>;
70-
using PackagesMap = std::map<Package, Package>;
71-
using PackagesSet = std::set<Package>;
69+
using Packages = std::unordered_map<String, Package>;
70+
using PackagesMap = std::unordered_map<Package, Package>;
71+
using PackagesSet = std::unordered_set<Package>;
7272

7373
Package extractFromString(const String &target);
7474

@@ -89,9 +89,20 @@ struct CleanTarget
8989
AllExceptSrc = All & ~Src,
9090
};
9191

92-
static std::map<String, int> getStrings();
93-
static std::map<int, String> getStringsById();
92+
static std::unordered_map<String, int> getStrings();
93+
static std::unordered_map<int, String> getStringsById();
9494
};
9595

9696
void cleanPackages(const String &s, int flags = CleanTarget::All);
9797
void cleanPackages(const PackagesSet &pkgs, int flags);
98+
99+
namespace std
100+
{
101+
template<> struct hash<Package>
102+
{
103+
size_t operator()(const Package& p) const
104+
{
105+
return std::hash<ProjectPath>()(p.ppath) ^ std::hash<Version>()(p.version);
106+
}
107+
};
108+
}

src/common/package_store.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ void PackageStore::check_deps_changed()
215215
// now refresh dependencies database only for remote packages
216216
// this file (local,current,root) packages will be refreshed anyway
217217
auto &sdb = getServiceDatabase();
218+
std::unordered_set<String> clean_pkgs;
218219
for (auto &cc : *this)
219220
{
220221
Hasher h;
@@ -227,10 +228,19 @@ void PackageStore::check_deps_changed()
227228
// clear exports for this project, so it will be regenerated
228229
auto p = Printer::create(Settings::get_local_settings().printerType);
229230
p->clear_export(cc.first.getDirObj());
230-
cleanPackages(cc.first.target_name, CleanTarget::Lib | CleanTarget::Bin);
231+
clean_pkgs.insert(cc.first.target_name);
231232
sdb.setPackageDependenciesHash(cc.first, h.hash);
232233
}
233234
}
235+
236+
auto &e = getExecutor();
237+
std::vector<Future<void>> fs;
238+
for (auto &p : clean_pkgs)
239+
fs.push_back(e.push([&p] {cleanPackages(p, CleanTarget::Lib | CleanTarget::Bin); }));
240+
for (auto &f : fs)
241+
f.wait();
242+
for (auto &f : fs)
243+
f.get();
234244
}
235245

236246
PackageStore::iterator PackageStore::begin()
@@ -315,7 +325,7 @@ Config *PackageStore::add_local_config(const Config &co)
315325
return cp;
316326
}
317327

318-
std::tuple<std::set<Package>, Config, String>
328+
std::tuple<PackagesSet, Config, String>
319329
PackageStore::read_packages_from_file(path p, const String &config_name, bool direct_dependency)
320330
{
321331
download_file(p);
@@ -487,7 +497,7 @@ PackageStore::read_packages_from_file(path p, const String &config_name, bool di
487497
conf.setPackage(pkg);
488498
}
489499

490-
std::set<Package> packages;
500+
PackagesSet packages;
491501
auto configs = conf.split();
492502

493503
// batch resolve of deps first; merge flags?
@@ -582,7 +592,7 @@ PackageStore::read_packages_from_file(path p, const String &config_name, bool di
582592
// do not remove
583593
rd.write_index();
584594

585-
return std::tuple<std::set<Package>, Config, String>{ packages, conf, sname };
595+
return std::tuple<PackagesSet, Config, String>{ packages, conf, sname };
586596
}
587597

588598
bool PackageStore::has_local_package(const ProjectPath &ppath) const

src/common/package_store.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ class PackageStore
3030
Config *config;
3131
Packages dependencies;
3232
};
33-
using PackageConfigs = std::map<Package, PackageConfig>;
33+
using PackageConfigs = std::unordered_map<Package, PackageConfig>;
3434

3535
using iterator = PackageConfigs::iterator;
3636
using const_iterator = PackageConfigs::const_iterator;
3737

3838
public:
3939
void resolve_dependencies(const Config &c);
40-
std::tuple<std::set<Package>, Config, String>
40+
std::tuple<PackagesSet, Config, String>
4141
read_packages_from_file(path p, const String &config_name = String(), bool direct_dependency = false);
4242
bool has_local_package(const ProjectPath &ppath) const;
4343
path get_local_package_dir(const ProjectPath &ppath) const;
@@ -70,8 +70,8 @@ class PackageStore
7070
PackageConfigs packages;
7171
std::set<std::unique_ptr<Config>> config_store;
7272

73-
std::map<Package, Package> resolved_packages;
74-
std::map<ProjectPath, path> local_packages;
73+
std::unordered_map<Package, Package> resolved_packages;
74+
std::unordered_map<ProjectPath, path> local_packages;
7575

7676
bool processing = false;
7777
int downloads = 0;

src/common/project.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ void Project::findSources(path p)
611611
return std::regex(s + e);
612612
};
613613

614-
std::map<String, std::regex> rgxs, rgxs_exclude;
614+
std::unordered_map<String, std::regex> rgxs, rgxs_exclude;
615615

616616
for (auto &e : sources)
617617
rgxs[e] = create_regex(e);
@@ -791,7 +791,7 @@ std::optional<ProjectPath> Project::load_local_dependency(const String &name)
791791
std::optional<ProjectPath> pp;
792792
if (allow_local_dependencies && (fs::exists(name) || isUrl(name)))
793793
{
794-
std::set<Package> pkgs;
794+
PackagesSet pkgs;
795795
Config c;
796796
String n;
797797
std::tie(pkgs, c, n) = rd.read_packages_from_file(name);

src/common/project_path.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ namespace std
156156
{
157157
size_t operator()(const ProjectPath& ppath) const
158158
{
159-
size_t r = 0;
159+
size_t h = 0;
160160
for (const auto &e : ppath.path_elements)
161-
r ^= std::hash<String>()(e);
162-
return r;
161+
h ^= std::hash<String>()(e);
162+
return h;
163163
}
164164
};
165165
}

0 commit comments

Comments
 (0)