Lionel Perrin wrote:
 > Hi,
 > 
 > I got some problems with shared memory.
 > I started from the shm_open example from opengroup.org.
 > When I compile it as non real time tasks, it works properly. But since I 
 > tried to compile it with
 > gcc $(xeno-config --posix-cflags) shm_open.c $(xeno-config 
 > --posix-ldflags) -o xeno_shm_open,
 > i get an EINVAL error from ftruncate that i can fix.
 > 
 > Does shm under xenomai require particular things ?

When applying the attached patch to xenomai (do not forget to rebuild
the kernel), the attached program compiled with the attached Makefile
works here.

-- 


                                            Gilles Chanteperdrix.
Index: ksrc/skins/posix/shm.c
===================================================================
--- ksrc/skins/posix/shm.c      (revision 1143)
+++ ksrc/skins/posix/shm.c      (working copy)
@@ -516,10 +516,8 @@
        is aligned). */
     if (len)
         {
-        len += PAGE_SIZE + xnheap_overhead(len, PAGE_SIZE);
+        len += PAGE_SIZE + PAGE_ALIGN(xnheap_overhead(len, PAGE_SIZE));
         len = PAGE_ALIGN(len);
-        if (len == 2 * PAGE_SIZE)
-            len = 3 * PAGE_SIZE;
         }
 
     err = 0;
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#define MAX_LEN 10000
struct region {        /* Defines "structure" of shared memory */
    int len;
    char buf[MAX_LEN];
};
struct region *rptr;
int fd;



int main(int argc, const char *argv[])
{
    int fd, status;

    mlockall(MCL_CURRENT|MCL_FUTURE);

/* Create shared memory object and set its size */

    fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        perror("shm_open");
        exit(EXIT_FAILURE);
    }
    
    if ((status = ftruncate(fd, sizeof(struct region))) == -1) {
        /* Handle error */;
        perror("ftruncate");
        close(fd);
        status = EXIT_FAILURE;
        goto close_and_unlink;
    }


/* Map shared memory object */
    rptr = (struct region *) mmap(NULL,
                                  sizeof(struct region),
                                  PROT_READ | PROT_WRITE,
                                  MAP_SHARED,
                                  fd,
                                  0);
    if (rptr == MAP_FAILED) {
        /* Handle error */;
        perror("mmap");
        status = EXIT_FAILURE;
        goto close_and_unlink;
    }
    
/* Now we can refer to mapped region using fields of rptr;
   for example, rptr->len */

    munmap(rptr, sizeof(struct region));
  close_and_unlink:
    close(fd);
    shm_unlink("/myregion");

    return status;
}
DESTDIR=/home/gilles/files/perso/dev/build/nestor/inst
XENO_CONFIG=$(DESTDIR)/usr/xenomai/bin/xeno-config

CFLAGS:=$(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --posix-cflags) -g -O2 -Wall 
-W -Werror-implicit-function-declaration
LDFLAGS:=$(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --posix-ldflags)
LOADLIBES=-lpthread_rt

all: test_shm

test_shm: test_shm.o

clean:
        $(RM) foo foo.o test_shm.o test_shm
_______________________________________________
Xenomai-help mailing list
Xenomai-help@gna.org
https://mail.gna.org/listinfo/xenomai-help

Reply via email to