Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-05-27 12:06:29 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-05-27 12:06:29 +0300
commit9a74b603670cc3fab14d9fcd7be7b3c17731a8ee (patch)
tree0611021c1450e586308d58223353793dcc137afe /source/blender/blenlib
parent474971f3d84e5eacde7e92fc86ef4e10a5e0786c (diff)
parentbc3727a94374d9c56745c943a1e6574627a88510 (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_string.h1
-rw-r--r--source/blender/blenlib/intern/string.c36
-rw-r--r--source/blender/blenlib/intern/threads.c3
3 files changed, 39 insertions, 1 deletions
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 48be9d1842f..faa8dc03615 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -71,6 +71,7 @@ char *BLI_sprintfN(const char *__restrict format, ...) ATTR_WARN_UNUSED_RESULT A
size_t BLI_strescape(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL();
size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL();
+void BLI_str_format_byte_unit(char dst[15], long long int size, const bool base_10) ATTR_NONNULL();
int BLI_strcaseeq(const char *a, const char *b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
char *BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index 1a6fd082e95..49630347032 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -799,6 +799,7 @@ int BLI_str_rstrip_float_zero(char *str, const char pad)
while (end_p != p && *end_p == '0') {
*end_p = pad;
end_p--;
+ totstrip++;
}
}
}
@@ -995,6 +996,41 @@ size_t BLI_str_format_int_grouped(char dst[16], int num)
}
/**
+ * Format a size in bytes using binary units.
+ * 1000 -> 1 KB
+ * Number of decimal places grows with the used unit (e.g. 1.5 MB, 1.55 GB, 1.545 TB).
+ *
+ * \param dst The resulting string. Dimension of 14 to support largest possible value for \a bytes (LLONG_MAX).
+ * \param bytes Number to format
+ * \param base_10 Calculate using base 10 (GB, MB, ...) or 2 (GiB, MiB, ...)
+ */
+void BLI_str_format_byte_unit(char dst[15], long long int bytes, const bool base_10)
+{
+ double bytes_converted = bytes;
+ int order = 0;
+ int decimals;
+ const int base = base_10 ? 1000 : 1024;
+ const char *units_base_10[] = {"B", "KB", "MB", "GB", "TB", "PB"};
+ const char *units_base_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB"};
+ const int tot_units = ARRAY_SIZE(units_base_2);
+
+ BLI_STATIC_ASSERT(ARRAY_SIZE(units_base_2) == ARRAY_SIZE(units_base_10), "array size mismatch");
+
+ while ((ABS(bytes_converted) >= base) && ((order + 1) < tot_units)) {
+ bytes_converted /= base;
+ order++;
+ }
+ decimals = MAX2(order - 1, 0);
+
+ /* Format value first, stripping away floating zeroes. */
+ const size_t dst_len = 15;
+ size_t len = BLI_snprintf_rlen(dst, dst_len, "%.*f", decimals, bytes_converted);
+ len -= (size_t)BLI_str_rstrip_float_zero(dst, '\0');
+ dst[len++] = ' ';
+ BLI_strncpy(dst + len, base_10 ? units_base_10[order] : units_base_2[order], dst_len - len);
+}
+
+/**
* Find the ranges needed to split \a str into its individual words.
*
* \param str: The string to search for words.
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 761f3982e28..e6f5d9839ea 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -488,7 +488,8 @@ void BLI_spin_lock(SpinLock *spin)
#elif defined(_MSC_VER)
while (InterlockedExchangeAcquire(spin, 1)) {
while (*spin) {
- /* pass */
+ /* Spinlock hint for processors with hyperthreading. */
+ YieldProcessor();
}
}
#else