From: DAN LI <li...@cn...> - 2012-08-02 08:48:28
|
pthread_cond_brodcast/1-2.c try to create as many childrens(thread or process) as possible,however,if current free memoryis exhausted before all childrens are started,the case will timeout and hung since it's stated with program "t0". The patch adjust count of childrens according tojudgement of size of current free memory. Signed-off-by: DAN LI <li...@cn...> --- .../interfaces/pthread_cond_broadcast/1-2.c | 39 +++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c index f6ad9df..14bda10 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c @@ -48,6 +48,7 @@ #include <sys/mman.h> #include <sys/wait.h> #include <semaphore.h> +#include <sys/sysinfo.h> #include "../testfrmw/testfrmw.h" #include "../testfrmw/testfrmw.c" @@ -82,8 +83,8 @@ #endif /* Do not create more than this amount of children: */ -#define MAX_PROCESS_CHILDREN (200) -#define MAX_THREAD_CHILDREN (1000) +int max_process_children = 200; +int max_thread_children = 1000; #define TIMEOUT (180) @@ -243,6 +244,34 @@ void *timer(void *arg) return NULL; /* For compiler */ } +int decide_process_children_count(void) +{ + struct sysinfo sysinforma; + int ret; + int avail_count; + unsigned long memper; + unsigned long min_stack; + + min_stack = sysconf(_SC_THREAD_STACK_MIN); + + ret = sysinfo(&sysinforma); + if (ret != 0) + UNRESOLVED(ret, "Failed to get system infomation."); + + memper = min_stack * max_thread_children; + if (memper > sysinforma.freeram) + UNTESTED("Free ram not enough for test."); + + avail_count = sysinforma.freeram/memper; + if (avail_count < 10) + UNTESTED("Free ram not enough for test."); + + max_process_children = (avail_count<max_process_children ? + avail_count : max_process_children); + + return 0; +} + int main(int argc, char *argv[]) { int ret; @@ -268,6 +297,8 @@ int main(int argc, char *argv[]) output_init(); + decide_process_children_count(); + /* check the system abilities */ pshared = sysconf(_SC_THREAD_PROCESS_SHARED); cs = sysconf(_SC_CLOCK_SELECTION); @@ -476,7 +507,7 @@ int main(int argc, char *argv[]) } else { ret = errno; } - } while ((ret == 0) && (child_count < MAX_THREAD_CHILDREN)); + } while ((ret == 0) && (child_count < max_thread_children)); #if VERBOSE > 2 output("[parent] Created %i children threads\n", child_count); #endif @@ -504,7 +535,7 @@ int main(int argc, char *argv[]) } else { ret = errno; } - } while ((ret == 0) && (child_count < MAX_PROCESS_CHILDREN)); + } while ((ret == 0) && (child_count < max_process_children)); #if VERBOSE > 2 output("[parent] Created %i children processes\n", child_count); #endif -- 1.7.11.rc0 |