summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/os_posix/os_thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/os_posix/os_thread.c')
-rw-r--r--src/third_party/wiredtiger/src/os_posix/os_thread.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/third_party/wiredtiger/src/os_posix/os_thread.c b/src/third_party/wiredtiger/src/os_posix/os_thread.c
index 9bf36cc2686..18e4c347436 100644
--- a/src/third_party/wiredtiger/src/os_posix/os_thread.c
+++ b/src/third_party/wiredtiger/src/os_posix/os_thread.c
@@ -18,6 +18,13 @@ __wt_thread_create(WT_SESSION_IMPL *session,
{
WT_DECL_RET;
+ /*
+ * Creating a thread isn't a memory barrier, but WiredTiger commonly
+ * sets flags and or state and then expects worker threads to start.
+ * Include a barrier to ensure safety in those cases.
+ */
+ WT_FULL_BARRIER();
+
/* Spawn a new thread of control. */
WT_SYSCALL_RETRY(pthread_create(tidret, NULL, func, arg), ret);
if (ret == 0)
@@ -34,6 +41,13 @@ __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid)
{
WT_DECL_RET;
+ /*
+ * Joining a thread isn't a memory barrier, but WiredTiger commonly
+ * sets flags and or state and then expects worker threads to halt.
+ * Include a barrier to ensure safety in those cases.
+ */
+ WT_FULL_BARRIER();
+
WT_SYSCALL(pthread_join(tid, NULL), ret);
if (ret == 0)
return (0);
@@ -45,7 +59,7 @@ __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid)
* __wt_thread_id --
* Fill in a printable version of the process and thread IDs.
*/
-void
+int
__wt_thread_id(char *buf, size_t buflen)
WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
{
@@ -57,10 +71,10 @@ __wt_thread_id(char *buf, size_t buflen)
*/
self = pthread_self();
#ifdef __sun
- (void)snprintf(buf, buflen,
- "%" PRIuMAX ":%u", (uintmax_t)getpid(), self);
+ return (__wt_snprintf(buf, buflen,
+ "%" PRIuMAX ":%u", (uintmax_t)getpid(), self));
#else
- (void)snprintf(buf, buflen,
- "%" PRIuMAX ":%p", (uintmax_t)getpid(), (void *)self);
+ return (__wt_snprintf(buf, buflen,
+ "%" PRIuMAX ":%p", (uintmax_t)getpid(), (void *)self));
#endif
}