Motr  M0
mutex.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2011-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #include "ut/ut.h"
24 #include "lib/thread.h"
25 #include "lib/mutex.h"
26 #include "lib/assert.h"
27 
28 enum {
29  NR = 255
30 };
31 
32 static int counter;
33 static struct m0_thread t[NR];
34 static struct m0_mutex m[NR];
36 
37 static void t0(int n)
38 {
39  int i;
40 
41  for (i = 0; i < NR; ++i) {
42  m0_mutex_lock(&m[0]);
43  counter += n;
44  m0_mutex_unlock(&m[0]);
45  }
46 }
47 
48 static void t1(int n)
49 {
50  int i;
51  int j;
52 
53  for (i = 0; i < NR; ++i) {
54  for (j = 0; j < NR; ++j)
55  m0_mutex_lock(&m[j]);
56  counter += n;
57  for (j = 0; j < NR; ++j)
58  m0_mutex_unlock(&m[j]);
59  }
60 }
61 
62 static void static_mutex_test(void)
63 {
66 }
67 
68 void test_mutex(void)
69 {
70  int i;
71  int sum;
72  int result;
73 
74  counter = 0;
75 
76  for (sum = i = 0; i < NR; ++i) {
77  m0_mutex_init(&m[i]);
78  result = M0_THREAD_INIT(&t[i], int, NULL, &t0, i, "t0");
79  M0_UT_ASSERT(result == 0);
80  sum += i;
81  }
82 
83  for (i = 0; i < NR; ++i) {
84  m0_thread_join(&t[i]);
85  m0_thread_fini(&t[i]);
86  }
87 
88  M0_UT_ASSERT(counter == sum * NR);
89 
90  counter = 0;
91 
92  for (sum = i = 0; i < NR; ++i) {
93  result = M0_THREAD_INIT(&t[i], int, NULL, &t1, i, "t1");
94  M0_UT_ASSERT(result == 0);
95  sum += i;
96  }
97 
98  for (i = 0; i < NR; ++i) {
99  m0_thread_join(&t[i]);
100  m0_thread_fini(&t[i]);
101  }
102 
103  for (i = 0; i < NR; ++i)
104  m0_mutex_fini(&m[i]);
105 
106  M0_UT_ASSERT(counter == sum * NR);
107 
109 }
110 
111 
112 /*
113  * Local variables:
114  * c-indentation-style: "K&R"
115  * c-basic-offset: 8
116  * tab-width: 8
117  * fill-column: 80
118  * scroll-step: 1
119  * End:
120  */
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
#define NULL
Definition: misc.h:38
int m0_thread_join(struct m0_thread *q)
Definition: kthread.c:169
void test_mutex(void)
Definition: mutex.c:68
static int sum
Definition: rwlock.c:53
static void t0(int n)
Definition: mutex.c:37
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
Definition: thread.h:139
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
static void static_mutex_test(void)
Definition: mutex.c:62
int i
Definition: dir.c:1033
Definition: mutex.c:29
static int counter
Definition: mutex.c:32
void m0_thread_fini(struct m0_thread *q)
Definition: thread.c:92
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
static struct m0_mutex static_m
Definition: mutex.c:35
uint64_t n
Definition: fops.h:107
static struct m0_thread t[NR]
Definition: mutex.c:33
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
static struct m0_mutex m[NR]
Definition: mutex.c:34
#define M0_MUTEX_SINIT(m)
Definition: mutex.h:63
static void t1(int n)
Definition: mutex.c:48
Definition: mutex.h:47
#define M0_UT_ASSERT(a)
Definition: ut.h:46