소스 검색

Robin Getz from blackfin.uclinux.org writes:
Bernd Schmidt found/fixed this problem in uClibc:

http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=882&group_id=17&atid=141

Basically, the uClinux dist includes a few thread demos - thdm and bcdm -
running them simultaneously sometimes causes bus errors.

Bernd wrote:
>They occur in pthread_handle_sigrestart; thread_self returns a bogus value.
>I managed to capture a debugging log, it's attached as bad-log. If you
>look at it you'll notice that the initial stack bounds are bogus: bottom
>of stack is higher than top of stack. This appears to be because of a bug
>in NOMMU_INITIAL_THREAD_BOUNDS(tos,bos): if a new thread has a BOS equal
>to the initial thread's current TOS, it'll munge the initial thread's
>stack bounds. Fixed with the attached patch, which I've committed.
>This should fix the crashes people have seen, but since the bug was always
>hard to reproduce, I can't be 100% certain they are gone. Please retest,
>everyone...

This patch was made against our cvs, which has an older version of uClibc
in it - this code was recently moved from internals.h to descr.h in the
uclibc svn, but it still has the same problem

Mike Frysinger 18 년 전
부모
커밋
021fb898d3
1개의 변경된 파일4개의 추가작업 그리고 1개의 파일을 삭제
  1. 4 1
      libpthread/linuxthreads/descr.h

+ 4 - 1
libpthread/linuxthreads/descr.h

@@ -214,7 +214,10 @@ struct _pthread_descr_struct
 extern char *__pthread_initial_thread_bos;
 #ifndef __ARCH_HAS_MMU__
 extern char *__pthread_initial_thread_tos;
-#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) if ((tos)>=__pthread_initial_thread_bos && (bos)<=__pthread_initial_thread_tos) __pthread_initial_thread_bos = (tos)+1
+#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) \
+    if ((tos)>=__pthread_initial_thread_bos \
+	&& (bos)<__pthread_initial_thread_tos) \
+	__pthread_initial_thread_bos = (tos)+1
 #else
 #define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) /* empty */
 #endif /* __ARCH_HAS_MMU__ */