[LTP] [PATCH v3] pthread_cond_brodcast/1-2.c hung when mem left is not enough

DAN LI
2012-08-07T05:57:56Z

.../interfaces/pthread_cond_broadcast/1-2.c | 47 ++++++++++++++++++--
1 files changed, 43 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..69243ea 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)
+static int max_process_children = 200;
+static int max_thread_children = 1000;

#define TIMEOUT (180)

@@ -243,6 +244,42 @@ void *timer(void *arg)
return NULL; /* For compiler */
}

+#ifdef __linux__
+static void 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;
+}
+#else
+static void decide_process_children_count(void)
+{
+ return;
+}
+#endif
+
int main(int argc, char *argv[])
{
int ret;
@@ -268,6 +305,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 +515,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 +543,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.7.6