summaryrefslogtreecommitdiff
path: root/win32_threads.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2011-11-15 12:01:52 +0100
committerIvan Maidanski <ivmai@mail.ru>2011-11-15 12:52:00 +0100
commit1df91789635037bf316e824ff6e3354416c96c4d (patch)
tree85850889921659a64b36bc77f77a1bc3734c920c /win32_threads.c
parent5651cb612de85c8c84773da02213e8fe3a45754d (diff)
Implement precise value boundary check in GC_is_thread_tsd_valid
* pthread_support.c (GC_is_thread_tsd_valid): Check tsd more correctly using GC_thread and thread_local_freelists declarations; remove FIXME. * win32_threads.c (GC_is_thread_tsd_valid): Likewise.
Diffstat (limited to 'win32_threads.c')
-rw-r--r--win32_threads.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/win32_threads.c b/win32_threads.c
index 0c84110..69817c8 100644
--- a/win32_threads.c
+++ b/win32_threads.c
@@ -572,18 +572,16 @@ GC_INNER unsigned char *GC_check_finalizer_nested(void)
/* This is called from thread-local GC_malloc(). */
GC_bool GC_is_thread_tsd_valid(void *tsd)
{
- char *me;
+ GC_thread me;
DCL_LOCK_STATE;
LOCK();
- me = (char *)GC_lookup_thread_inner(GetCurrentThreadId());
+ me = GC_lookup_thread_inner(GetCurrentThreadId());
UNLOCK();
- /* FIXME: We can check tsd more correctly (since now we have access */
- /* to the right declarations). This old algorithm (moved from */
- /* thread_local_alloc.c) checks only that it's close. */
- return((char *)tsd > me && (char *)tsd < me + 1000);
+ return (char *)tsd >= (char *)&me->tlfs
+ && (char *)tsd < (char *)&me->tlfs + sizeof(me->tlfs);
}
-#endif
+#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */
/* Make sure thread descriptor t is not protected by the VDB */
/* implementation. */