MCPcopy Create free account
hub / github.com/corosync/corosync / memory_map

Function memory_map

lib/cpg.c:866–945  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

864}
865
866static int
867memory_map (char *path, const char *file, void **buf, size_t bytes)
868{
869 int32_t fd;
870 void *addr;
871 int32_t res;
872 char *buffer;
873 int32_t i;
874 size_t written;
875 size_t page_size;
876 long int sysconf_page_size;
877 mode_t old_umask;
878
879 snprintf (path, PATH_MAX, "/dev/shm/%s", file);
880
881 old_umask = umask(CPG_MEMORY_MAP_UMASK);
882 fd = mkstemp (path);
883 (void)umask(old_umask);
884 if (fd == -1) {
885 snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
886 old_umask = umask(CPG_MEMORY_MAP_UMASK);
887 fd = mkstemp (path);
888 (void)umask(old_umask);
889 if (fd == -1) {
890 return (-1);
891 }
892 }
893
894 res = ftruncate (fd, bytes);
895 if (res == -1) {
896 goto error_close_unlink;
897 }
898 sysconf_page_size = sysconf(_SC_PAGESIZE);
899 if (sysconf_page_size <= 0) {
900 goto error_close_unlink;
901 }
902 page_size = sysconf_page_size;
903 buffer = malloc (page_size);
904 if (buffer == NULL) {
905 goto error_close_unlink;
906 }
907 memset (buffer, 0, page_size);
908 for (i = 0; i < (bytes / page_size); i++) {
909retry_write:
910 written = write (fd, buffer, page_size);
911 if (written == -1 && errno == EINTR) {
912 goto retry_write;
913 }
914 if (written != page_size) {
915 free (buffer);
916 goto error_close_unlink;
917 }
918 }
919 free (buffer);
920
921 addr = mmap (NULL, bytes, PROT_READ | PROT_WRITE,
922 MAP_SHARED, fd, 0);
923

Callers 1

cpg_zcb_allocFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected