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_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()
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");
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");
{
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,
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)
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:
}
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
$(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)\
)
--- /dev/null
+#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;
+}
{
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,
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),
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)
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:
}
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);
$(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)\
)
--- /dev/null
+#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;
+}
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
wp.vres = vres;
wp.stopper = &stopper;
- pthread_attr_getschedparam(attr, ¶m);
- p = param.sched_priority;
- printf("priority = %d\n", p);
+ if (attr) {
+ pthread_attr_getschedparam(attr, ¶m);
+ p = param.sched_priority;
+ printf("priority = %d\n", p);
+ }
if (p == 0) {
param.sched_priority = 1;
pthread_attr_setschedparam(attr, ¶m);