summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorrpj <rpj>1999-03-08 21:02:20 +0000
committerrpj <rpj>1999-03-08 21:02:20 +0000
commit52f7c3f5ef6d9b70ec385fb390bf27962e68ee3d (patch)
tree030c60c1dcddf64c66956490a8b6333e0036a9bd /tests
parent1e9697f3e8f5da2f710a98d9ae8ce3105e61a4a6 (diff)
Resolve merge conflicts; minor comment changes.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile140
-rw-r--r--tests/Template.c34
-rw-r--r--tests/condvar2.c165
-rw-r--r--tests/tryentercs.c70
-rw-r--r--tests/tryentercs2.c59
5 files changed, 301 insertions, 167 deletions
diff --git a/tests/Makefile b/tests/Makefile
index dcbb7e0..e5994f6 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,70 +1,70 @@
-# Makefile for the pthreads test suite.
-# If all of the .pass files can be created, the test suite has passed.
-
-
-CP = copy
-RM = erase
-MKDIR = mkdir
-TOUCH = echo Passed >
-ECHO = @echo
-
-#
-# Mingw32
-#
-CC = gcc
-CFLAGS = -g -O2 -UNDEBUG -Wall -o $@ $^
-BUILD_DIR = ..
-INCLUDES = -I.
-LIBS = ./libpthread32.a
-
-##
-## MSVC
-##
-#CC = cl
-#CFLAGS = /W3 /MT /nologo /Yd /Zi /Fe$@ $^
-#BUILD_DIR = ..
-#INCLUDES = -I.
-#LIBS = pthread.lib
-
-HDR = pthread.h
-LIB = libpthread32.a
-DLL = pthread.dll
-
-# If a test case returns a non-zero exit code to the shell, make will
-# stop.
-
-TESTS = count1 create1 equal1 exit1 exit2 exit3 \
- join1 mutex1 mutex2 mutex3 \
- once1 self1 self2 condvar1 condvar2 condvar3 condvar4 tsd1
-
-PASSES = $(TESTS:%=%.pass)
-
-all: $(PASSES)
- @ $(ECHO) ALL TESTS PASSED! Congratulations!
-
-%.pass: %.exe $(LIB) $(DLL) $(HDR)
- $*
- @$(ECHO) Passed
- @ $(TOUCH) $@
-
-%.exe: %.c
- @ $(CC) $(CFLAGS) $(INCLUDES) $(LIBS)
-
-$(LIB):
- @ $(ECHO) Copying the library
- @ $(CP) $(BUILD_DIR)\$@ .
-
-$(HDR):
- @ $(ECHO) Copying the header file
- @ $(CP) $(BUILD_DIR)\$@ .
-
-$(DLL):
- @ $(ECHO) Copying the DLL
- @ $(CP) $(BUILD_DIR)\$@ .
-
-clean:
- - $(RM) *.dll
- - $(RM) $(LIB)
- - $(RM) $(HDR)
- - $(RM) *.exe
- - $(RM) *.pass
+# Makefile for the pthreads test suite.
+# If all of the .pass files can be created, the test suite has passed.
+
+
+CP = copy
+RM = erase
+MKDIR = mkdir
+TOUCH = echo Passed >
+ECHO = @echo
+
+#
+# Mingw32
+#
+CC = gcc
+CFLAGS = -g -O2 -UNDEBUG -Wall -o $@ $^
+BUILD_DIR = ..
+INCLUDES = -I.
+LIBS = ./libpthread32.a
+
+##
+## MSVC
+##
+#CC = cl
+#CFLAGS = /W3 /MT /nologo /Yd /Zi /Fe$@ $^
+#BUILD_DIR = ..
+#INCLUDES = -I.
+#LIBS = pthread.lib
+
+HDR = pthread.h
+LIB = libpthread32.a
+DLL = pthread.dll
+
+# If a test case returns a non-zero exit code to the shell, make will
+# stop.
+
+TESTS = count1 create1 equal1 exit1 exit2 exit3 \
+ join1 mutex1 mutex2 mutex3 \
+ once1 self1 self2 condvar1 condvar2 condvar3 condvar4 tsd1
+
+PASSES = $(TESTS:%=%.pass)
+
+all: $(PASSES)
+ @ $(ECHO) ALL TESTS PASSED! Congratulations!
+
+%.pass: %.exe $(LIB) $(DLL) $(HDR)
+ $*
+ @$(ECHO) Passed
+ @ $(TOUCH) $@
+
+%.exe: %.c
+ @ $(CC) $(CFLAGS) $(INCLUDES) $(LIBS)
+
+$(LIB):
+ @ $(ECHO) Copying the library
+ @ $(CP) $(BUILD_DIR)\$@ .
+
+$(HDR):
+ @ $(ECHO) Copying the header file
+ @ $(CP) $(BUILD_DIR)\$@ .
+
+$(DLL):
+ @ $(ECHO) Copying the DLL
+ @ $(CP) $(BUILD_DIR)\$@ .
+
+clean:
+ - $(RM) *.dll
+ - $(RM) $(LIB)
+ - $(RM) $(HDR)
+ - $(RM) *.exe
+ - $(RM) *.pass
diff --git a/tests/Template.c b/tests/Template.c
index 0663a85..c98bbac 100644
--- a/tests/Template.c
+++ b/tests/Template.c
@@ -44,18 +44,18 @@
/*
* Create NUMTHREADS threads in addition to the Main thread.
*/
-static enum {
+enum {
NUMTHREADS = 2
};
typedef struct bag_t_ bag_t;
struct bag_t_ {
int threadnum;
- int washere;
- /* Add more pre-thread state variables here */
+ int started;
+ /* Add more per-thread state variables here */
};
-static bag_t threadbag[NUMTHREADS];
+static bag_t threadbag[NUMTHREADS + 1];
void *
mythread(void * arg)
@@ -63,8 +63,8 @@ mythread(void * arg)
bag_t * bag = (bag_t *) arg;
assert(bag == &threadbag[bag->threadnum]);
- assert(bag->washere == 0);
- bag->washere = 1;
+ assert(bag->started == 0);
+ bag->started = 1;
/* ... */
@@ -80,13 +80,18 @@ main()
assert((t[0] = pthread_self()) != NULL);
for (i = 1; i <= NUMTHREADS; i++)
- {
- threadbag[i].washere = 0;
+ {
+ threadbag[i].started = 0;
threadbag[i].threadnum = i;
assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
}
/*
+ * Code to control or munipulate child threads should probably go here.
+ */
+
+
+ /*
* Give threads time to run.
*/
Sleep(NUMTHREADS * 1000);
@@ -96,24 +101,25 @@ main()
*/
for (i = 1; i <= NUMTHREADS; i++)
{
- if (threadbag[i].washere != 1)
+ failed = !threadbag[i].started;
+
+ if (failed)
{
- failed = 1;
- fprintf(stderr, "Thread %d: washere %d\n", i, threadbag[i].washere);
+ fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
}
}
- assert(failed == 0);
+ assert(!failed);
/*
- * Check any results here. Only print ouput and set "failed" on failure.
+ * Check any results here. Set "failed" and only print ouput on failure.
*/
for (i = 1; i <= NUMTHREADS; i++)
{
/* ... */
}
- assert(failed == 0);
+ assert(!failed);
/*
* Success.
diff --git a/tests/condvar2.c b/tests/condvar2.c
index 66f3d7b..09e4576 100644
--- a/tests/condvar2.c
+++ b/tests/condvar2.c
@@ -1,83 +1,82 @@
-/*
- * File: condvar1.c
- *
- * Test Synopsis:
- * - Test timed wait on a CV.
- *
- * Test Method (Validation or Falsification):
- * - Validation
- *
- * Requirements Tested:
- * -
- *
- * Features Tested:
- * -
- *
- * Cases Tested:
- * -
- *
- * Description:
- * - Because the CV is never signaled, we expect the wait to time out.
- *
- * Environment:
- * -
- *
- * Input:
- * - None.
- *
- * Output:
- * - File name, Line number, and failed expression on failure.
- * - No output on success.
- *
- * Assumptions:
- * -
- *
- * Pass Criteria:
- * - pthread_cond_timedwait returns ETIMEDOUT.
- * - Process returns zero exit status.
- *
- * Fail Criteria:
- * - pthread_cond_timedwait does not return ETIMEDOUT.
- * - Process returns non-zero exit status.
- */
-
-#include "test.h"
-#include <sys/timeb.h>
-
-pthread_cond_t cv;
-pthread_mutex_t mutex;
-
-int
-main()
-{
- struct timespec abstime = { 0, 0 };
-#if defined(__MINGW32__)
- struct timeb currSysTime;
-#else
- struct _timeb currSysTime;
-#endif
- const DWORD NANOSEC_PER_MILLISEC = 1000000;
-
- assert(pthread_cond_init(&cv, NULL) == 0);
-
- assert(pthread_mutex_init(&mutex, NULL) == 0);
-
- assert(pthread_mutex_lock(&mutex) == 0);
-
- /* get current system time */
- _ftime(&currSysTime);
-
- abstime.tv_sec = currSysTime.time;
- abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
-
- abstime.tv_sec += 5;
-
- assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == ETIMEDOUT);
-
- assert(pthread_mutex_unlock(&mutex) == 0);
-
- assert(pthread_cond_destroy(&cv) == 0);
-
- return 0;
-}
-
+/*
+ * File: condvar1.c
+ *
+ * Test Synopsis:
+ * - Test timed wait on a CV.
+ *
+ * Test Method (Validation or Falsification):
+ * - Validation
+ *
+ * Requirements Tested:
+ * -
+ *
+ * Features Tested:
+ * -
+ *
+ * Cases Tested:
+ * -
+ *
+ * Description:
+ * - Because the CV is never signaled, we expect the wait to time out.
+ *
+ * Environment:
+ * -
+ *
+ * Input:
+ * - None.
+ *
+ * Output:
+ * - File name, Line number, and failed expression on failure.
+ * - No output on success.
+ *
+ * Assumptions:
+ * -
+ *
+ * Pass Criteria:
+ * - pthread_cond_timedwait returns ETIMEDOUT.
+ * - Process returns zero exit status.
+ *
+ * Fail Criteria:
+ * - pthread_cond_timedwait does not return ETIMEDOUT.
+ * - Process returns non-zero exit status.
+ */
+
+#include "test.h"
+#include <sys/timeb.h>
+
+pthread_cond_t cv;
+pthread_mutex_t mutex;
+
+int
+main()
+{
+ struct timespec abstime = { 0, 0 };
+#if defined(__MINGW32__)
+ struct timeb currSysTime;
+#else
+ struct _timeb currSysTime;
+#endif
+ const DWORD NANOSEC_PER_MILLISEC = 1000000;
+
+ assert(pthread_cond_init(&cv, NULL) == 0);
+
+ assert(pthread_mutex_init(&mutex, NULL) == 0);
+
+ assert(pthread_mutex_lock(&mutex) == 0);
+
+ /* get current system time */
+ _ftime(&currSysTime);
+
+ abstime.tv_sec = currSysTime.time;
+ abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+
+ abstime.tv_sec += 5;
+
+ assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == ETIMEDOUT);
+
+ assert(pthread_mutex_unlock(&mutex) == 0);
+
+ assert(pthread_cond_destroy(&cv) == 0);
+
+ return 0;
+}
diff --git a/tests/tryentercs.c b/tests/tryentercs.c
new file mode 100644
index 0000000..1125611
--- /dev/null
+++ b/tests/tryentercs.c
@@ -0,0 +1,70 @@
+/*
+ * tryentercs.c
+ *
+ * See if we have the TryEnterCriticalSection function.
+ * Does not use any part of pthreads.
+ */
+
+#include <windows.h>
+#include<process.h>
+#include <stdio.h>
+
+/*
+ * Function pointer to TryEnterCriticalSection if it exists
+ * - otherwise NULL
+ */
+BOOL (WINAPI *_try_enter_critical_section)(LPCRITICAL_SECTION) =
+NULL;
+
+/*
+ * Handle to kernel32.dll
+ */
+static HINSTANCE _h_kernel32;
+
+
+int
+main()
+{
+ CRITICAL_SECTION cs;
+
+ SetLastError(0);
+
+ printf("Last Error [main enter] %ld\n", (long) GetLastError());
+
+ /*
+ * Load KERNEL32 and try to get address of TryEnterCriticalSection
+ */
+ _h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL"));
+ _try_enter_critical_section =
+ (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION))
+ GetProcAddress(_h_kernel32,
+ (LPCSTR) "TryEnterCriticalSection");
+
+ if (_try_enter_critical_section != NULL)
+ {
+ InitializeCriticalSection(&cs);
+
+ SetLastError(0);
+
+ if ((*_try_enter_critical_section)(&cs) != 0)
+ {
+ LeaveCriticalSection(&cs);
+ }
+ else
+ {
+ printf("Last Error [try enter] %ld\n", (long) GetLastError());
+
+ _try_enter_critical_section = NULL;
+ }
+ DeleteCriticalSection(&cs);
+ }
+
+ (void) FreeLibrary(_h_kernel32);
+
+ printf("This system %s TryEnterCriticalSection.\n",
+ (_try_enter_critical_section == NULL) ? "DOES NOT SUPPORT" : "SUPPORTS");
+ printf("POSIX Mutexes will be based on Win32 %s.\n",
+ (_try_enter_critical_section == NULL) ? "Mutexes" : "Critical Sections");
+
+ return(0);
+} \ No newline at end of file
diff --git a/tests/tryentercs2.c b/tests/tryentercs2.c
new file mode 100644
index 0000000..adce6df
--- /dev/null
+++ b/tests/tryentercs2.c
@@ -0,0 +1,59 @@
+/*
+ * tryentercs.c
+ *
+ * See if we have the TryEnterCriticalSection function.
+ * Does not use any part of pthreads.
+ */
+
+#include <windows.h>
+#include<process.h>
+#include <stdio.h>
+
+/*
+ * Function pointer to TryEnterCriticalSection if it exists
+ * - otherwise NULL
+ */
+BOOL (WINAPI *_try_enter_critical_section)(LPCRITICAL_SECTION) = NULL;
+
+/*
+ * Handle to kernel32.dll
+ */
+static HINSTANCE _h_kernel32;
+
+
+int
+main()
+{
+ LPCRITICAL_SECTION lpcs = NULL;
+
+ SetLastError(0);
+
+ printf("Last Error [main enter] %ld\n", (long) GetLastError());
+
+ /*
+ * Load KERNEL32 and try to get address of TryEnterCriticalSection
+ */
+ _h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL"));
+ _try_enter_critical_section =
+ (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION))
+ GetProcAddress(_h_kernel32,
+ (LPCSTR) "TryEnterCriticalSection");
+
+ if (_try_enter_critical_section != NULL)
+ {
+ SetLastError(0);
+
+ (*_try_enter_critical_section)(lpcs);
+
+ printf("Last Error [try enter] %ld\n", (long) GetLastError());
+ }
+
+ (void) FreeLibrary(_h_kernel32);
+
+ printf("This system %s TryEnterCriticalSection.\n",
+ (_try_enter_critical_section == NULL) ? "DOES NOT SUPPORT" : "SUPPORTS");
+ printf("POSIX Mutexes will be based on Win32 %s.\n",
+ (_try_enter_critical_section == NULL) ? "Mutexes" : "Critical Sections");
+
+ return(0);
+} \ No newline at end of file