summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2011-12-06 02:52:15 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2011-12-06 02:52:15 (GMT)
commit354adf632e861e3a0e94af461d9d97a38e969484 (patch)
treeaabbca2de6991855c476360149ed674495accbc6
parent8478d450161ed5b52ee0f58873a5596633e3c094 (diff)
downloadhdf5-354adf632e861e3a0e94af461d9d97a38e969484.zip
hdf5-354adf632e861e3a0e94af461d9d97a38e969484.tar.gz
hdf5-354adf632e861e3a0e94af461d9d97a38e969484.tar.bz2
[svn-r21816] Fix for JIRA HDFFV-7780
Updates Windows thread-safe code in H5TS.c to use _beginthread instead of CreateThread. Tested on 64-bit Windows 7 with Visual Studio 2010 using CMake. Both 32- and 64-bit builds were tested.
-rw-r--r--src/H5TS.c13
-rw-r--r--src/H5private.h6
2 files changed, 16 insertions, 3 deletions
diff --git a/src/H5TS.c b/src/H5TS.c
index 5609d33..6f661ad 100644
--- a/src/H5TS.c
+++ b/src/H5TS.c
@@ -393,13 +393,22 @@ H5TS_cancel_count_dec(void)
*--------------------------------------------------------------------------
*/
H5TS_thread_t
-H5TS_create_thread(void * func, H5TS_attr_t * attr, void*udata)
+H5TS_create_thread(void *func, H5TS_attr_t *attr, void *udata)
{
H5TS_thread_t ret_value;
#ifdef H5_HAVE_WIN_THREADS
- ret_value = CreateThread(NULL, 0, func, udata, 0, NULL);
+ /* When calling C runtime functions, you have to use _beginthread or
+ * _beginthreadex instead of CreateThread. Threads created with
+ * CreateThread risk being killed in low-memory situations.
+ * We use _beginthread instead of _begintheadex because the latter
+ * requires a stdcall function (and we don't need the more advanced
+ * features it exposes).
+ *
+ * NOTE: No error checks here! ret_value will be -1L on errors.
+ */
+ ret_value = _beginthread(func, 0 /* stack size */, udata);
#else /* H5_HAVE_WIN_THREADS */
diff --git a/src/H5private.h b/src/H5private.h
index e6ad056..94f7aad 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -151,12 +151,16 @@
#ifdef H5_HAVE_WIN32_API
-#define WIN32_LEAN_AND_MEAN /*Exclude rarely-used stuff from Windows headers */
+#define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */
#ifdef H5_HAVE_WINSOCK_H
#include <winsock2.h>
#endif
+#ifdef H5_HAVE_THREADSAFE
+#include <process.h> /* For _beginthread() */
+#endif
+
#include <windows.h>
#include <direct.h> /* For _getcwd() */