]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Testcase and bugfixes for synchronization and shared objects.
authorDario Faggioli <faggioli@gandalf.sssup.it>
Thu, 26 Feb 2009 15:15:54 +0000 (16:15 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 1 Mar 2009 19:04:14 +0000 (20:04 +0100)
Testcases have been added for FRES synchronization and shared objects.
Thanks to them, a couple of glaring bugs in the code have been found and
fixed.

Higher (FRSH) level test programs will come in the next commits.

fres/contract/tests/contract.c
fres/sharedobj/fres_sharedobj.c
fres/sharedobj/fres_sharedobj.h
fres/sharedobj/tests/Makefile.omk
fres/sharedobj/tests/fres_sharedobj.c [new file with mode: 0644]
fres/synchobj/fres_synchobj.c
fres/synchobj/fres_synchobj.h
fres/synchobj/tests/Makefile.omk
fres/synchobj/tests/fres_synchobj.c [new file with mode: 0644]
frsh_api/tests/Makefile.omk
resources/cpucg/lib/frsh_cpucg.c

index 21e252ab9d449f7cc72fb7d9a06c39d68d7886fc..3476ab0bf765b19cc53d45de5eb7bb0fad649f97 100644 (file)
@@ -28,6 +28,11 @@ void cmp(struct fres_contract *c1, struct fres_contract *c2, const char *msg)
                     fres_contract_get_timing_reqs(c2),
                     sizeof(fres_block_timing_reqs));
        if (ret) error(1, 0, "%s: timing_reqs cmp failed %d", msg, ret);
+
+       /*ret = memcmp(fres_contract_get_csects(c1),
+                    fres_contract_get_csects(c2),
+                    sizeof(fres_block_csects));
+       if (ret) error(1, 0, "%s: critical_sects cmp failed %d", msg, ret);*/
 }
 
 int main()
@@ -38,6 +43,7 @@ int main()
        fres_block_resource *resource;
        fres_block_basic *basic;
        fres_block_timing_reqs *timing_reqs;
+       fres_block_csects *critical_sects;
 
        c = fres_contract_new();
        if (!c) error(1, errno, "fres_contract_new");
@@ -71,6 +77,12 @@ int main()
        ret = fres_contract_add_timing_reqs(c, timing_reqs);
        if (ret) error(1, errno, "fres_contract_add_timing_reqs");
 
+       critical_sects = malloc(sizeof(*critical_sects));
+       if (!critical_sects) error(1, errno, "cannot allocate memory for critical_sects");
+       //criticacl_sects->;
+       ret = fres_contract_add_csects(c, critical_sects);
+       if (ret) error(1, errno, "fres_contract_add_csects");
+
        c2 = fres_contract_duplicate(c);
        cmp(c, c2, "cmp after fres_contract_duplicate");
 
index 4eeb9b517f8fbd413fbde4433c895a9fee093c78..0536894bb5cc9770bc515c8a0b3c0475ea6adf58 100644 (file)
@@ -25,12 +25,14 @@ struct fres_sharedobj* fres_sharedobj_new(const char *label, int kind)
 {
        struct fres_sharedobj *s;
        char shm_path[108];
-       int shm_fd;
+       int ret, shm_fd;
 
-       snprintf(shm_path, sizeof(shm_path), "/tmp/shared.%s", label);
+       snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
 
        shm_fd = shm_open(shm_path, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG);
        if (shm_fd < 0) goto err;
+       ret = ftruncate(shm_fd, sizeof(*s));
+       if (ret) goto unlink_err;
 
        s = mmap(NULL, sizeof(*s),
                 PROT_READ|PROT_WRITE, MAP_SHARED,
@@ -69,22 +71,16 @@ out:
 
 struct fres_sharedobj* fres_sharedobj_get_label(const char *label)
 {
-       struct fres_sharedobj *s = NULL;
        char shm_path[108];
-       int shm_fd;
 
-       snprintf(shm_path, sizeof(shm_path), "/tmp/sync.%s", s->label);
+       snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
 
-       shm_fd = shm_open(shm_path, O_RDWR, S_IRWXU|S_IRWXG);
-       if (shm_fd < 0) goto out;
-
-       s = mmap(NULL, sizeof(*s),
-                PROT_READ|PROT_WRITE, MAP_SHARED,
-                shm_fd, 0);
-       if (s == MAP_FAILED) goto out;
+       return fres_sharedobj_get_path(shm_path);
+}
 
-out:
-       return s;
+int fres_sharedobj_put(struct fres_sharedobj *s)
+{
+       return munmap((void*) s, sizeof(*s));
 }
 
 int fres_sharedobj_destroy(struct fres_sharedobj *s)
@@ -97,7 +93,7 @@ int fres_sharedobj_destroy(struct fres_sharedobj *s)
        ret = shm_unlink(s->path);
        if (ret) goto out;
 
-       ret = munmap((void*) s, sizeof(*s));
+       ret = fres_sharedobj_put(s);
        if (ret) goto out;
 
 out:
index 2a8c9e8b3f216d1f05e8a178f2ba4f5403d23ed7..718b86fdc29d146313bb2a3b408515d72afce742 100644 (file)
@@ -47,8 +47,9 @@ static inline char *fres_sharedobj_id_to_string(char *dest,
 }
 
 struct fres_sharedobj *fres_sharedobj_new(const char *label, int kind);
-struct fres_sharedobj* fres_sharedobj_get_path(const char sharedobj_path[]);
-struct fres_sharedobj* fres_sharedobj_get_label(const char sharedobj_label[]);
+struct fres_sharedobj *fres_sharedobj_get_path(const char sharedobj_path[]);
+struct fres_sharedobj *fres_sharedobj_get_label(const char sharedobj_label[]);
+int fres_sharedobj_put(struct fres_sharedobj *s);
 int fres_sharedobj_destroy(struct fres_sharedobj *sharedobj);
 
 void
index 3b0564ab1e196e47b92f21a85d37bcaab8d9ebbf..b8a81428373c8a308dc60241823d8124906ae852 100644 (file)
@@ -2,5 +2,5 @@ test_PROGRAMS:=$(basename $(notdir $(wildcard $(SOURCES_DIR)/*.c)))
 
 $(foreach t,$(test_PROGRAMS),\
 $(eval $(t)_SOURCES = $(t).c)\
-$(eval $(t)_LIBS = fosa m contract rt forb ulut)\
+$(eval $(t)_LIBS = fosa m contract sharedobj rt forb ulut)\
 )
diff --git a/fres/sharedobj/tests/fres_sharedobj.c b/fres/sharedobj/tests/fres_sharedobj.c
new file mode 100644 (file)
index 0000000..33530d3
--- /dev/null
@@ -0,0 +1,64 @@
+#include <fosa.h>
+#include <fres_sharedobj.h>
+#include <error.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <forb/cdr.h>
+
+void cmp(struct fres_sharedobj *s1, struct fres_sharedobj *s2, const char *msg)
+{
+       int ret;
+
+       ret = strncmp(s1->path, s2->path, sizeof(s1->path));
+       if (ret) error(1, 0, "%s: path cmp failed %d", msg, ret);
+
+       ret = memcmp(&s1->mutex, &s2->mutex, sizeof(fosa_mutex_t));
+       if (ret) error(1, 0, "%s: mutex var. cmp failed %d", msg, ret);
+
+       ret = memcmp(&s1->wcet_timer,
+                    &s2->wcet_timer,
+                    sizeof(fosa_timer_id_t));
+       if (ret) error(1, 0, "%s: timer cmp failed %d", msg, ret);
+
+       ret = memcmp(&s1->context,
+                    &s2->context,
+                    sizeof(fosa_long_jump_context_t));
+       if (ret) error(1, 0, "%s: context cmp failed %d", msg, ret);
+
+       ret = strncmp(s1->label, s2->label, sizeof(s1->label));
+       if (ret) error(1, 0, "%s: label cmp failed %d", msg, ret);
+
+       ret = s1->kind == s2->kind;
+       if (!ret) error(1, 0, "%s: kind cmp failed %d", msg, ret);
+}
+
+int main()
+{
+       int ret;
+       struct fres_sharedobj *s, *s2;
+
+       s = fres_sharedobj_new("SHAREDOBJ_0", 0);
+       if (!s) error(1, errno, "fres_sharedobj_new");
+
+       fres_sharedobj_print("print new sharedobj:\n", s);
+
+       s2 = fres_sharedobj_get_label("SHAREDOBJ_0");
+       if (!s2) error(1, errno, "fres_sharedobj_get_label");
+       cmp(s, s2, "cmp after fres_sharedobj_get_label");
+       ret = fres_sharedobj_put(s2);
+       if (ret) error(1, errno, "fres_sharedobj_put after get_label");
+
+       s2 = fres_sharedobj_get_path(s->path);
+       if (!s2) error(1, errno, "fres_sharedobj_get_path");
+       cmp(s, s2, "cmp after fres_sharedobj_get_path");
+       ret = fres_sharedobj_put(s2);
+       if (ret) error(1, errno, "fres_sharedobj_put after get_path");
+
+       ret = fres_sharedobj_destroy(s);
+       if (ret) error(1, errno, "frsh_sharedobj_destroy");
+
+       printf("OK\n");
+
+       return 0;
+}
index e9eec8dcfc97f7a1f910dc10952ce7ba8ab8098f..1f01d8b511d98afbce2a93f22b15ab6407e8c78a 100644 (file)
@@ -25,15 +25,17 @@ struct fres_synchobj* fres_synchobj_new()
 {
        struct fres_synchobj *s;
        fres_synchobj_id_t id;
-       char shm_path[108];
-       int shm_fd;
+       char shm_path[108], str_id[65];
+       int ret, shm_fd;
 
        forb_uuid_generate((forb_uuid_t*) &id);
-       sprintf(shm_path, "/tmp/sync.%s",
-               fres_synchobj_id_to_string(shm_path, &id, sizeof(shm_path)));
+       sprintf(shm_path, "/sync.%s",
+               fres_synchobj_id_to_string(str_id, &id, sizeof(str_id)));
 
        shm_fd = shm_open(shm_path, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG);
        if (shm_fd < 0) goto err;
+       ret = ftruncate(shm_fd, sizeof(*s));
+       if (ret) goto unlink_err;
 
        s = mmap(NULL, sizeof(*s),
                 PROT_READ|PROT_WRITE, MAP_SHARED,
@@ -57,16 +59,12 @@ err:
        return NULL;
 }
 
-struct fres_synchobj* fres_synchobj_get(const fres_synchobj_id_t *id)
+struct fres_synchobj* fres_synchobj_get_path(const char synchobj_path[])
 {
        struct fres_synchobj *s = NULL;
-       char shm_path[108];
        int shm_fd;
 
-       sprintf(shm_path, "/tmp/sync.%s",
-               fres_synchobj_id_to_string(shm_path, id, sizeof(shm_path)));
-
-       shm_fd = shm_open(shm_path, O_RDWR, S_IRWXU|S_IRWXG);
+       shm_fd = shm_open(synchobj_path, O_RDWR, S_IRWXU|S_IRWXG);
        if (shm_fd < 0) goto out;
 
        s = mmap(NULL, sizeof(*s),
@@ -78,21 +76,19 @@ out:
        return s;
 }
 
-struct fres_synchobj* fres_synchobj_get_path(const char synchobj_path[])
+struct fres_synchobj* fres_synchobj_get(const fres_synchobj_id_t *id)
 {
-       struct fres_synchobj *s = NULL;
-       int shm_fd;
+       char shm_path[108], str_id[65];
 
-       shm_fd = shm_open(synchobj_path, O_RDWR, S_IRWXU|S_IRWXG);
-       if (shm_fd < 0) goto out;
+       sprintf(shm_path, "/sync.%s",
+               fres_synchobj_id_to_string(str_id, id, sizeof(str_id)));
 
-       s = mmap(NULL, sizeof(*s),
-                PROT_READ|PROT_WRITE, MAP_SHARED,
-                shm_fd, 0);
-       if (s == MAP_FAILED) goto out;
+       return fres_synchobj_get_path(shm_path);
+}
 
-out:
-       return s;
+int fres_synchobj_put(struct fres_synchobj *s)
+{
+       return munmap((void*) s, sizeof(*s));
 }
 
 int fres_synchobj_destroy(struct fres_synchobj *s)
@@ -115,7 +111,7 @@ int fres_synchobj_destroy(struct fres_synchobj *s)
        s->nr_waiting = -1;
        fosa_mutex_unlock(&s->mutex);
 
-       ret = munmap((void*) s, sizeof(*s));
+       ret = fres_synchobj_put(s);
        if (ret) goto out;
 
 out:
index 0fb7921e6eaf8874d29a3f9f69147bb9e5de7b17..39a0a32220e2324ead2e7d9c8661d20ea3e52117 100644 (file)
@@ -47,8 +47,9 @@ static inline char *fres_synchobj_id_to_string(char *dest,
 }
 
 struct fres_synchobj *fres_synchobj_new(void);
-struct fres_synchobj* fres_synchobj_get_path(const char synchobj_path[]);
-struct fres_synchobj* fres_synchobj_get(const fres_synchobj_id_t *id);
+struct fres_synchobj *fres_synchobj_get_path(const char synchobj_path[]);
+struct fres_synchobj *fres_synchobj_get(const fres_synchobj_id_t *id);
+int fres_synchobj_put(struct fres_synchobj *s);
 int fres_synchobj_destroy(struct fres_synchobj *synchobj);
 
 int fres_synchobj_signal(struct fres_synchobj *s);
index 3b0564ab1e196e47b92f21a85d37bcaab8d9ebbf..061d89cb088d5bf2b4966ac4450d1498cb418a46 100644 (file)
@@ -2,5 +2,5 @@ test_PROGRAMS:=$(basename $(notdir $(wildcard $(SOURCES_DIR)/*.c)))
 
 $(foreach t,$(test_PROGRAMS),\
 $(eval $(t)_SOURCES = $(t).c)\
-$(eval $(t)_LIBS = fosa m contract rt forb ulut)\
+$(eval $(t)_LIBS = fosa m synchobj rt forb ulut)\
 )
diff --git a/fres/synchobj/tests/fres_synchobj.c b/fres/synchobj/tests/fres_synchobj.c
new file mode 100644 (file)
index 0000000..4562715
--- /dev/null
@@ -0,0 +1,87 @@
+#include <fosa.h>
+#include <fres_synchobj.h>
+#include <error.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <forb/cdr.h>
+
+void cmp(struct fres_synchobj *s1, struct fres_synchobj *s2, const char *msg)
+{
+       int ret;
+
+       ret = fres_synchobj_id_cmp(&s1->id, &s2->id);
+       if (ret) error(1, 0, "%s: id cmp failed %d", msg, ret);
+
+       ret = strncmp(s1->path, s2->path, sizeof(s1->path));
+       if (ret) error(1, 0, "%s: path cmp failed %d", msg, ret);
+
+       ret = memcmp(&s1->cond, &s2->cond, sizeof(fosa_cond_t));
+       if (ret) error(1, 0, "%s: condition var. cmp failed %d", msg, ret);
+
+       ret = memcmp(&s1->mutex, &s2->mutex, sizeof(fosa_mutex_t));
+       if (ret) error(1, 0, "%s: mutex cmp failed %d", msg, ret);
+
+       ret = s1->nr_waiting == s2->nr_waiting;
+       if (!ret) error(1, 0, "%s: nr_waiting cmp failed %d", msg, ret);
+
+       ret = s1->queued_signal == s2->queued_signal;
+       if (!ret) error(1, 0, "%s: queued_signal cmp failed %d", msg, ret);
+}
+
+int main()
+{
+       int ret;
+       struct fres_synchobj *s, *s2;
+       fosa_abs_time_t timeout;
+
+       s = fres_synchobj_new();
+       if (!s) error(1, errno, "fres_synchobj_new");
+
+       fres_synchobj_print("print new synchobj:\n", s);
+
+       s2 = fres_synchobj_get_path(s->path);
+       if (!s2) error(1, errno, "fres_synchobj_get_path");
+       cmp(s, s2, "cmp after fres_synchobj_get_path");
+       ret = fres_synchobj_put(s2);
+       if (ret) error(1, errno, "fres_synchobj_put after get_path");
+
+       s2 = fres_synchobj_get(&s->id);
+       if (!s2) error(1, errno, "fres_synchobj_get");
+       cmp(s, s2, "cmp after fres_synchobj_get");
+       ret = fres_synchobj_put(s2);
+       if (ret) error(1, errno, "fres_synchobj_put after get");
+
+       timeout = fosa_msec_to_abs_time(1000);
+       ret = fres_synchobj_wait_with_timeout(s, &timeout);
+       if (ret != ETIMEDOUT) error(1, errno, "fres_synchobj_wait_with_timeout");
+
+       ret = fres_synchobj_signal(s);
+       if (ret) error(1, errno, "fres_synchobj_signal");
+
+       ret = fres_synchobj_wait_with_timeout(s, NULL);
+       if (ret) error(1, errno, "wait with NULL timeout and queued signal");
+
+       /*{
+               FORB_CDR_Codec codec;
+               CORBA_boolean cb;
+               FORB_CDR_codec_init_static(&codec, NULL);
+               cb = FORB_CDR_buffer_init(&codec, 4000, 0);
+               if (!cb) error(1, errno, "CDR_buffer_init");
+               
+               cb = fres_synchobj_id_t_serialize(&codec, &s);
+               if (!cb) error(1, 0, "fres_synchobj_serialize failed");
+               cb = fres_synchobj_id_t_deserialize(&codec, &s2);
+               if (!cb) error(1, 0, "fres_synchobj_deserialize failed");
+
+               cmp(s, s2, "cmp after serialize/desearialize");
+               
+       }*/
+
+       ret = fres_synchobj_destroy(s);
+       if (ret) error(1, errno, "frsh_synchobj_destroy");
+       
+       printf("OK\n");
+
+       return 0;
+}
index 5b377851b4e2799453b854ed7c7380e57b0e6930..7526a6ae70989222f2e7b63b36669d19f01c05b2 100644 (file)
@@ -3,6 +3,10 @@ test_PROGRAMS += negotiation
 negotiation_SOURCES = negotiation.c
 lib_LOADLIBES += pthread rt frsh 
 
+test_PROGRAMS += frsh_synchobj
+frsh_synchobj_SOURCES += frsh_synchobj.c
+lib_LOADLIBES += pthread rt frsh
+
 ifeq ($(CONFIG_FWP),y)
 SUBDIRS= fwptest
 
index ec905fca2ac0dad687a0f418002ee5c4b7267748..0ff04742f60d5a676aadc3883aa0bab1b94a8614 100644 (file)
@@ -305,9 +305,11 @@ int frsh_thread_create_and_bind(const frsh_vres_id_t vres,
        wp.vres = vres;
        wp.stopper = &stopper;
 
-       pthread_attr_getschedparam(attr, &param);
-       p = param.sched_priority;
-       printf("priority = %d\n", p);
+       if (attr) {
+               pthread_attr_getschedparam(attr, &param);
+               p = param.sched_priority;
+               printf("priority = %d\n", p);
+       }
        if (p == 0) {
                param.sched_priority = 1;
                pthread_attr_setschedparam(attr, &param);