add a few testcases where destroy is called as first function,
and test failure if the state is a non-standard initializer.

Signed-off-by: Norbert Lange <norbert.la...@andritz.com>
---
 testsuite/smokey/posix-cond/posix-cond.c   | 14 +++++++
 testsuite/smokey/posix-mutex/posix-mutex.c | 47 ++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/testsuite/smokey/posix-cond/posix-cond.c 
b/testsuite/smokey/posix-cond/posix-cond.c
index 153c64599..ad915c724 100644
--- a/testsuite/smokey/posix-cond/posix-cond.c
+++ b/testsuite/smokey/posix-cond/posix-cond.c
@@ -198,6 +198,19 @@ static void *cond_signaler(void *cookie)
        return NULL;
 }
 
+static void autoinit_simple_conddestroy(void)
+{
+       pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+       pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
+       unsigned invalmagic = ~0x86860505; // ~COBALT_COND_MAGIC
+
+       memcpy((char *)&cond2 + sizeof(cond2) - sizeof(invalmagic), 
&invalmagic, sizeof(invalmagic));
+
+       smokey_trace("%s", __func__);
+       check("cond_destroy", cond_destroy(&cond), 0);
+       check("cond_destroy invalid", cond_destroy(&cond2), -EINVAL);
+}
+
 static void autoinit_simple_condwait(void)
 {
        pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
@@ -731,6 +744,7 @@ int run_posix_cond(struct smokey_test *t, int argc, char 
*const argv[])
        sparam.sched_priority = 2;
        pthread_setschedparam(pthread_self(), SCHED_FIFO, &sparam);
 
+       autoinit_simple_conddestroy();
        autoinit_simple_condwait();
        simple_condwait();
        relative_condwait();
diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c 
b/testsuite/smokey/posix-mutex/posix-mutex.c
index 182f8c0e5..a42c52033 100644
--- a/testsuite/smokey/posix-mutex/posix-mutex.c
+++ b/testsuite/smokey/posix-mutex/posix-mutex.c
@@ -296,6 +296,28 @@ static int do_contend(pthread_mutex_t *mutex, int type)
        return 0;
 }
 
+static int do_destroy(pthread_mutex_t *mutex, pthread_mutex_t *invalmutex, int 
type)
+{
+       int ret;
+       if (!__T(ret, pthread_mutex_destroy(mutex)))
+               return ret;
+       if (!__F(ret, pthread_mutex_destroy(invalmutex)) &&
+               __Tassert(ret == -EINVAL))
+               return -1;
+       return 0;
+}
+
+static int static_init_normal_destroy(void)
+{
+       pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+       pthread_mutex_t invalmutex = PTHREAD_MUTEX_INITIALIZER;
+
+       unsigned invalmagic = ~0x86860303; // ~COBALT_MUTEX_MAGIC
+
+       memcpy((char *)&invalmutex + sizeof(invalmutex) - sizeof(invalmagic), 
&invalmagic, sizeof(invalmagic));
+       return do_destroy(&mutex, &invalmutex, PTHREAD_MUTEX_NORMAL);
+}
+
 static int static_init_normal_contend(void)
 {
        pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -320,6 +342,17 @@ static int dynamic_init_normal_contend(void)
        return __dynamic_init_contend(PTHREAD_MUTEX_NORMAL);
 }
 
+static int static_init_recursive_destroy(void)
+{
+       pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+       pthread_mutex_t invalmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+
+       unsigned invalmagic = ~0x86860303; // ~COBALT_MUTEX_MAGIC
+
+       memcpy((char *)&invalmutex + sizeof(invalmutex) - sizeof(invalmagic), 
&invalmagic, sizeof(invalmagic));
+       return do_destroy(&mutex, &invalmutex, PTHREAD_MUTEX_RECURSIVE);
+}
+
 static int static_init_recursive_contend(void)
 {
        pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
@@ -332,6 +365,17 @@ static int dynamic_init_recursive_contend(void)
        return __dynamic_init_contend(PTHREAD_MUTEX_RECURSIVE);
 }
 
+static int static_init_errorcheck_destroy(void)
+{
+       pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+       pthread_mutex_t invalmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+
+       unsigned invalmagic = ~0x86860303; // ~COBALT_MUTEX_MAGIC
+
+       memcpy((char *)&invalmutex + sizeof(invalmutex) - sizeof(invalmagic), 
&invalmagic, sizeof(invalmagic));
+       return do_destroy(&mutex, &invalmutex, PTHREAD_MUTEX_ERRORCHECK);
+}
+
 static int static_init_errorcheck_contend(void)
 {
        pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
@@ -991,10 +1035,13 @@ static int run_posix_mutex(struct smokey_test *t, int 
argc, char *const argv[])
                                            SCHED_FIFO, &param)))
                return ret;
 
+       do_test(static_init_normal_destroy, MAX_100_MS);
        do_test(static_init_normal_contend, MAX_100_MS);
        do_test(dynamic_init_normal_contend, MAX_100_MS);
+       do_test(static_init_recursive_destroy, MAX_100_MS);
        do_test(static_init_recursive_contend, MAX_100_MS);
        do_test(dynamic_init_recursive_contend, MAX_100_MS);
+       do_test(static_init_errorcheck_destroy, MAX_100_MS);
        do_test(static_init_errorcheck_contend, MAX_100_MS);
        do_test(dynamic_init_errorcheck_contend, MAX_100_MS);
        do_test(timed_contend, MAX_100_MS);
-- 
2.20.1


Reply via email to