2 * @file fres_sharedobj.c
3 * @author Dario Faggioli <faggioli@gandalf.sssup.it>
5 * @brief Implementation of shared objects functions.
10 #include <fres_sharedobj.h>
15 #include <sys/types.h>
19 * Allocates new fres_sharedobj structure. Use fres_sharedobj_destroy to
20 * deallocate the shared object.
22 * @return The new object on succes, NULL on error.
24 struct fres_sharedobj* fres_sharedobj_new(const char *label, int kind)
26 struct fres_sharedobj *s;
30 snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
32 shm_fd = shm_open(shm_path, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG);
33 if (shm_fd < 0) goto err;
34 ret = ftruncate(shm_fd, sizeof(*s));
35 if (ret) goto unlink_err;
37 s = mmap(NULL, sizeof(*s),
38 PROT_READ|PROT_WRITE, MAP_SHARED,
40 if (s == MAP_FAILED) goto unlink_err;
42 memcpy(s->label, label, sizeof(s->label));
43 memcpy(s->path, shm_path, sizeof(shm_path));
44 fosa_mutex_init(&s->mutex, 0);
55 struct fres_sharedobj* fres_sharedobj_get_path(const char *sharedobj_path)
57 struct fres_sharedobj *s = NULL;
60 shm_fd = shm_open(sharedobj_path, O_RDWR, S_IRWXU|S_IRWXG);
61 if (shm_fd < 0) goto out;
63 s = mmap(NULL, sizeof(*s),
64 PROT_READ|PROT_WRITE, MAP_SHARED,
66 if (s == MAP_FAILED) goto out;
72 struct fres_sharedobj* fres_sharedobj_get_label(const char *label)
76 snprintf(shm_path, sizeof(shm_path), "/shared.%s", label);
78 return fres_sharedobj_get_path(shm_path);
81 int fres_sharedobj_put(struct fres_sharedobj *s)
83 return munmap((void*) s, sizeof(*s));
86 int fres_sharedobj_destroy(struct fres_sharedobj *s)
90 if (!s) return EINVAL;
92 /* Since now no new task can mmap the object. */
93 ret = shm_unlink(s->path);
96 ret = fres_sharedobj_put(s);
104 fres_sharedobj_to_string(char *dest,
106 const struct fres_sharedobj *s)
112 ret = snprintf(dest, size, "label: %s\n"
115 s->label, s->path, s->kind);
121 fres_sharedobj_print(char *prefix, const struct fres_sharedobj *s)
123 char sharedobj[1000];
125 fres_sharedobj_to_string(sharedobj, sizeof(sharedobj)-1, s);
126 sharedobj[sizeof(sharedobj)-1] = 0;
127 printf("%s %s", prefix, sharedobj);