public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] containers: semctl replaced with semop in sysvipc/sem_comm.c
@ 2015-02-24 17:52 Matus Marhefka
  2015-02-26  9:06 ` Cyril Hrubis
  2015-02-26 12:57 ` [LTP] [PATCH v2] " Matus Marhefka
  0 siblings, 2 replies; 7+ messages in thread
From: Matus Marhefka @ 2015-02-24 17:52 UTC (permalink / raw)
  To: ltp-list

semctl call replaced with semop call for setting up semaphores initial
values because semctl needs non-standard type (not in sys/sem.h).

Signed-off-by: Matus Marhefka <mmarhefk@redhat.com>
---
 testcases/kernel/containers/sysvipc/sem_comm.c | 57 +++++++++++++++++---------
 1 file changed, 38 insertions(+), 19 deletions(-)

diff --git a/testcases/kernel/containers/sysvipc/sem_comm.c b/testcases/kernel/containers/sysvipc/sem_comm.c
index b44be6d..1ac5394 100644
--- a/testcases/kernel/containers/sysvipc/sem_comm.c
+++ b/testcases/kernel/containers/sysvipc/sem_comm.c
@@ -32,14 +32,19 @@
 #include <sys/wait.h>
 #include <stdio.h>
 #include <errno.h>
+#include "usctest.h"
 #include "test.h"
 #include "safe_macros.h"
 #include "libclone.h"
 #include "ipcns_helper.h"
 
+
 #define TESTKEY 124426L
 char *TCID	= "sem_comm";
 int TST_TOTAL	= 1;
+struct tst_checkpoint checkpoint1;
+struct tst_checkpoint checkpoint2;
+
 
 static void cleanup(void)
 {
@@ -51,7 +56,8 @@ static void setup(void)
 	tst_require_root(NULL);
 	check_newipc();
 	tst_tmpdir();
-	TST_CHECKPOINT_INIT(tst_rmdir);
+	TST_CHECKPOINT_CREATE(&checkpoint1);
+	TST_CHECKPOINT_CREATE(&checkpoint2);
 }
 
 int chld1_sem(void *arg)
@@ -59,32 +65,39 @@ int chld1_sem(void *arg)
 	int id;
 	struct sembuf sm;
 
-	id = semget(TESTKEY, 1, IPC_CREAT);
+	id = semget(TESTKEY, 1, IPC_CREAT|S_IRUSR|S_IWUSR|IPC_EXCL);
 	if (id == -1) {
 		perror("semget");
 		return 2;
 	}
 
-	if (semctl(id, 0, SETVAL, 1) == -1) {
-		perror("semctl");
+	sm.sem_num = 0;
+	sm.sem_op = 1;
+	sm.sem_flg = IPC_NOWAIT;
+	if (semop(id, &sm, 1) == -1) {
+		perror("semop");
 		semctl(id, 0, IPC_RMID);
 		return 2;
 	}
 
-	/* tell child2 to continue and wait for it to create the semaphore */
-	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0);
+	/* tell child2 to continue */
+	TST_CHECKPOINT_SIGNAL_CHILD(NULL, &checkpoint1);
+
+	/* wait for child2 to create the semaphore */
+	TST_CHECKPOINT_CHILD_WAIT(&checkpoint2);
 
-	sm.sem_num = 0;
 	sm.sem_op = -1;
-	sm.sem_flg = IPC_NOWAIT;
 	if (semop(id, &sm, 1) == -1) {
 		perror("semop");
 		semctl(id, 0, IPC_RMID);
 		return 2;
 	}
 
-	/* tell child2 to continue and wait for it to lock the semaphore */
-	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0);
+	/* tell child2 to continue */
+	TST_CHECKPOINT_SIGNAL_CHILD(NULL, &checkpoint1);
+
+	/* wait for child2 to lock the semaphore */
+	TST_CHECKPOINT_CHILD_WAIT(&checkpoint2);
 
 	sm.sem_op = 1;
 	semop(id, &sm, 1);
@@ -99,26 +112,32 @@ int chld2_sem(void *arg)
 	struct sembuf sm;
 
 	/* wait for child1 to create the semaphore */
-	TST_SAFE_CHECKPOINT_WAIT(NULL, 0);
+	TST_CHECKPOINT_CHILD_WAIT(&checkpoint1);
 
-	id = semget(TESTKEY, 1, IPC_CREAT);
+	/* IPC_EXCL is excluded because we do not want semget call to fail
+	 * if namespaces logic doesn't work correctly */
+	id = semget(TESTKEY, 1, IPC_CREAT|S_IRUSR|S_IWUSR);
 	if (id == -1) {
 		perror("semget");
 		return 2;
 	}
 
-	if (semctl(id, 0, SETVAL, 1) == -1) {
-		perror("semctl");
+	sm.sem_num = 0;
+	sm.sem_op = 1;
+	sm.sem_flg = IPC_NOWAIT;
+	if (semop(id, &sm, 1) == -1) {
+		perror("semop");
 		semctl(id, 0, IPC_RMID);
 		return 2;
 	}
 
-	/* tell child1 to continue and wait for it to lock the semaphore */
-	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0);
+	/* tell child1 to continue */
+	TST_CHECKPOINT_SIGNAL_CHILD(NULL, &checkpoint2);
+
+	/* wait for child1 to lock the semaphore */
+	TST_CHECKPOINT_CHILD_WAIT(&checkpoint1);
 
-	sm.sem_num = 0;
 	sm.sem_op = -1;
-	sm.sem_flg = IPC_NOWAIT;
 	if (semop(id, &sm, 1) == -1) {
 		if (errno == EAGAIN) {
 			rval = 1;
@@ -130,7 +149,7 @@ int chld2_sem(void *arg)
 	}
 
 	/* tell child1 to continue */
-	TST_SAFE_CHECKPOINT_WAKE(NULL, 0);
+	TST_CHECKPOINT_SIGNAL_CHILD(NULL, &checkpoint2);
 
 	sm.sem_op = 1;
 	semop(id, &sm, 1);
-- 
1.8.3.1


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-04-21 10:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-24 17:52 [LTP] [PATCH] containers: semctl replaced with semop in sysvipc/sem_comm.c Matus Marhefka
2015-02-26  9:06 ` Cyril Hrubis
2015-02-26 12:57 ` [LTP] [PATCH v2] " Matus Marhefka
2015-02-26 13:22   ` Jan Stancek
2015-04-20 10:28     ` Matus Marhefka
2015-04-21  9:21       ` Stanislav Kholmanskikh
2015-04-21 10:12         ` Matus Marhefka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox