@@ -1712,6 +1712,8 @@ namespace GEO {
17121712
17131713
17141714 std::string GEOGRAM_API home_directory();
1715+
1716+ std::string GEOGRAM_API documents_directory();
17151717 }
17161718}
17171719
@@ -4007,7 +4009,7 @@ namespace GEO {
40074009 }
40084010
40094011 void LoggerStream::notify(const std::string& str) {
4010- logger_->notify(this, str);
4012+ logger_->notify(this, str);
40114013 }
40124014
40134015
@@ -4257,6 +4259,7 @@ namespace GEO {
42574259 pretty_ = flag;
42584260 }
42594261
4262+
42604263 Logger::Logger() :
42614264 out_(this),
42624265 warn_(this),
@@ -4266,7 +4269,8 @@ namespace GEO {
42664269 current_feature_changed_(false),
42674270 quiet_(true),
42684271 pretty_(true),
4269- minimal_(false)
4272+ minimal_(false),
4273+ notifying_error_(false)
42704274 {
42714275 // Add a default client printing stuff to std::cout
42724276 register_client(new ConsoleLogger());
@@ -4279,7 +4283,8 @@ namespace GEO {
42794283 }
42804284
42814285 Logger* Logger::instance() {
4282- // Do not use geo_assert here: if the instance is nullptr, geo_assert will
4286+ // Do not use geo_assert here:
4287+ // if the instance is nullptr, geo_assert will
42834288 // call the Logger to print the assertion failure, thus ending in a
42844289 // infinite loop.
42854290 if(instance_ == nullptr) {
@@ -4292,33 +4297,42 @@ namespace GEO {
42924297 }
42934298
42944299 std::ostream& Logger::div(const std::string& title) {
4295- return is_initialized() ?
4300+ std::ostream& result = is_initialized() ?
42964301 instance()->div_stream(title) :
42974302 (std::cerr << "=====" << title << std::endl);
4303+ return result;
42984304 }
42994305
43004306 std::ostream& Logger::out(const std::string& feature) {
4301- return is_initialized() ?
4307+ std::ostream& result =
4308+ (is_initialized() && !Process::is_running_threads()) ?
43024309 instance()->out_stream(feature) :
43034310 (std::cerr << " [" << feature << "] ");
4311+ return result;
43044312 }
43054313
43064314 std::ostream& Logger::err(const std::string& feature) {
4307- return is_initialized() ?
4315+ std::ostream& result =
4316+ (is_initialized() && !Process::is_running_threads()) ?
43084317 instance()->err_stream(feature) :
43094318 (std::cerr << "(E)-[" << feature << "] ");
4319+ return result;
43104320 }
43114321
43124322 std::ostream& Logger::warn(const std::string& feature) {
4313- return is_initialized() ?
4323+ std::ostream& result =
4324+ (is_initialized() && !Process::is_running_threads()) ?
43144325 instance()->warn_stream(feature) :
43154326 (std::cerr << "(W)-[" << feature << "] ");
4327+ return result;
43164328 }
43174329
43184330 std::ostream& Logger::status() {
4319- return is_initialized() ?
4331+ std::ostream& result =
4332+ (is_initialized() && !Process::is_running_threads()) ?
43204333 instance()->status_stream() :
43214334 (std::cerr << "[status] ");
4335+ return result;
43224336 }
43234337
43244338 std::ostream& Logger::div_stream(const std::string& title) {
@@ -4399,10 +4413,17 @@ namespace GEO {
43994413 CmdLine::ui_feature(current_feature_, current_feature_changed_)
44004414 + msg;
44014415
4402- for(auto it : clients_) {
4403- it->err(feat_msg);
4404- it->status(msg);
4405- }
4416+ if(notifying_error_) {
4417+ std::cerr << "Error while displaying error (!):"
4418+ << feat_msg << std::endl;
4419+ } else {
4420+ notifying_error_ = true;
4421+ for(auto it : clients_) {
4422+ it->err(feat_msg);
4423+ it->status(msg);
4424+ }
4425+ notifying_error_ = false;
4426+ }
44064427
44074428 current_feature_changed_ = false;
44084429 }
@@ -5100,7 +5121,7 @@ namespace GEO {
51005121 std::string home;
51015122#if defined GEO_OS_WINDOWS
51025123 wchar_t folder[MAX_PATH+1];
5103- HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS , 0, 0, folder);
5124+ HRESULT hr = SHGetFolderPathW(0, CSIDL_PROFILE , 0, 0, folder);
51045125 if (SUCCEEDED(hr)) {
51055126 char result[MAX_PATH+1];
51065127 wcstombs(result, folder, MAX_PATH);
@@ -5118,6 +5139,27 @@ namespace GEO {
51185139 return home;
51195140 }
51205141
5142+ std::string documents_directory() {
5143+ std::string home;
5144+ #if defined GEO_OS_WINDOWS
5145+ wchar_t folder[MAX_PATH+1];
5146+ HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, folder);
5147+ if (SUCCEEDED(hr)) {
5148+ char result[MAX_PATH+1];
5149+ wcstombs(result, folder, MAX_PATH);
5150+ home=std::string(result);
5151+ flip_slashes(home);
5152+ }
5153+ #elif defined GEO_OS_EMSCRIPTEN
5154+ home="/";
5155+ #else
5156+ char* result = getenv("HOME");
5157+ if(result != nullptr) {
5158+ home=result;
5159+ }
5160+ #endif
5161+ return home;
5162+ }
51215163
51225164 }
51235165
@@ -5888,7 +5930,14 @@ namespace GEO {
58885930 }
58895931
58905932 bool is_running_threads() {
5933+ #ifdef GEO_OPENMP
5934+ return (
5935+ omp_in_parallel() ||
5936+ (running_threads_invocations_ > 0)
5937+ );
5938+ #else
58915939 return running_threads_invocations_ > 0;
5940+ #endif
58925941 }
58935942
58945943 bool multithreading_enabled() {
@@ -17665,12 +17714,6 @@ namespace {
1766517714
1766617715#ifdef __AVX2__
1766717716
17668- inline int avx_permute_mask(int a0, int a1, int a2, int a3) {
17669- return a0 | (a1 << 2) | (a2 << 4) | (a3 << 6);
17670- }
17671-
17672- // To be replaced with _MM_SHUFFLE(a3,a2,a1,a0) (note: reverse arg order !)
17673-
1767417717 inline __m256d avx2_vecdet(__m256d A, __m256d B, __m256d C, __m256d D) {
1767517718 __m256d AD = _mm256_mul_pd(A,D);
1767617719 __m256d BC = _mm256_mul_pd(B,C);
@@ -17686,16 +17729,16 @@ namespace {
1768617729 // We develop w.r.t. the first column and
1768717730 // compute the 4 minors simultaneously.
1768817731
17689- __m256d C41 = _mm256_permute4x64_pd(C11, avx_permute_mask(3,0,1,2 ));
17732+ __m256d C41 = _mm256_permute4x64_pd(C11, _MM_SHUFFLE(2,1,0,3 ));
1769017733
17691- __m256d C22 = _mm256_permute4x64_pd(C12, avx_permute_mask(1,2,3,0 ));
17692- __m256d C32 = _mm256_permute4x64_pd(C12, avx_permute_mask(2,3,0,1 ));
17734+ __m256d C22 = _mm256_permute4x64_pd(C12, _MM_SHUFFLE(0,3,2,1 ));
17735+ __m256d C32 = _mm256_permute4x64_pd(C12, _MM_SHUFFLE(1,0,3,2 ));
1769317736
17694- __m256d C23 = _mm256_permute4x64_pd(C13, avx_permute_mask(1,2,3,0 ));
17695- __m256d C33 = _mm256_permute4x64_pd(C13, avx_permute_mask(2,3,0,1 ));
17737+ __m256d C23 = _mm256_permute4x64_pd(C13, _MM_SHUFFLE(0,3,2,1 ));
17738+ __m256d C33 = _mm256_permute4x64_pd(C13, _MM_SHUFFLE(1,0,3,2 ));
1769617739
17697- __m256d C24 = _mm256_permute4x64_pd(C14, avx_permute_mask(1,2,3,0 ));
17698- __m256d C34 = _mm256_permute4x64_pd(C14, avx_permute_mask(2,3,0,1 ));
17740+ __m256d C24 = _mm256_permute4x64_pd(C14, _MM_SHUFFLE(0,3,2,1 ));
17741+ __m256d C34 = _mm256_permute4x64_pd(C14, _MM_SHUFFLE(1,0,3,2 ));
1769917742
1770017743 __m256d M1 = _mm256_mul_pd(C12,avx2_vecdet(C23,C24,C33,C34));
1770117744 __m256d M2 = _mm256_mul_pd(C22,avx2_vecdet(C13,C14,C33,C34));
@@ -17710,7 +17753,7 @@ namespace {
1771017753 M = _mm256_mul_pd(M, C41);
1771117754
1771217755 // Compute -m0 +m1 -m2 +m3
17713- M = _mm256_permute4x64_pd(M, avx_permute_mask(1,3,0,2 ));
17756+ M = _mm256_permute4x64_pd(M, _MM_SHUFFLE(2,0,3,1 ));
1771417757 __m128d M_a = _mm256_extractf128_pd(M, 0);
1771517758 __m128d M_b = _mm256_extractf128_pd(M, 1);
1771617759 __m128d Mab = _mm_sub_pd(M_a,M_b);
@@ -25881,9 +25924,6 @@ namespace GEO {
2588125924 delete W;
2588225925
2588325926 if(debug_mode_) {
25884- // Delaunay3dThread* thread0 =
25885- // static_cast<Delaunay3dThread*>(threads_[0].get());
25886-
2588725927 for(index_t i=0; i<threads_.size(); ++i) {
2588825928 std::cerr << i << " : " <<
2588925929 static_cast<Delaunay3dThread*>(threads_[i].get())
0 commit comments