--- freem/src/shmmgr.c 2025/04/16 17:36:12 1.13 +++ freem/src/shmmgr.c 2025/05/16 04:25:15 1.18 @@ -1,5 +1,5 @@ /* - * $Id: shmmgr.c,v 1.13 2025/04/16 17:36:12 snw Exp $ + * $Id: shmmgr.c,v 1.18 2025/05/16 04:25:15 snw Exp $ * shared memory manager * * @@ -24,6 +24,21 @@ * along with FreeM. If not, see . * * $Log: shmmgr.c,v $ + * Revision 1.18 2025/05/16 04:25:15 snw + * Make shm seed NULL on ARM + * + * Revision 1.17 2025/05/12 18:18:00 snw + * Further work on shared memory + * + * Revision 1.16 2025/05/12 14:26:15 snw + * Revert bad change in shared memory manager + * + * Revision 1.15 2025/05/09 19:44:50 snw + * Begin shm rework + * + * Revision 1.14 2025/05/08 14:47:26 snw + * Break everything to begin shared memory rewrite + * * Revision 1.13 2025/04/16 17:36:12 snw * Add FreeBSD shm cleanup script * @@ -119,7 +134,7 @@ short shm_init(const size_t seg_size) NULLPTRCHK(shm_config,"shm_init"); /* figure out how many pages we can fit in the segment, accounting for header size */ - shm_config->pgct = (seg_size / pg_size) - sizeof (shm_hdr_t); + shm_config->pgct = (seg_size - sizeof (shm_hdr_t)) / pg_size; /* how big will the alloc map be? */ alloc_map_size = shm_config->pgct * sizeof (shm_page_t); @@ -137,11 +152,7 @@ short shm_init(const size_t seg_size) return SHMS_GET_ERR; } -#if !defined(__arm__) shm_config->dta = shmat (shm_config->seg_id, NULL, 0); -#else - shm_config->dta = shmat (shm_config->seg_id, (void *) 0x1000000, 0); -#endif if (shm_config->dta == (void *) -1) { logprintf (FM_LOG_FATAL, "shm_init: shmat() failed (error code %d [%s])", errno, strerror (errno)); @@ -166,17 +177,11 @@ short shm_init(const size_t seg_size) daemon_chk = kill (shm_config->hdr->first_process, 0); if (daemon_chk == -1 && errno == ESRCH) { - logprintf (FM_LOG_WARNING, "shm_init: recovering from crashed daemon pid %ld", shm_config->hdr->first_process); - first_process = TRUE; - shm_daemon_init (); - } else { - - first_process = FALSE; semid_shm = semget (shm_sk, 1, 0); @@ -184,53 +189,7 @@ short shm_init(const size_t seg_size) logprintf (FM_LOG_FATAL, "shm_init: could not attach to shared memory semaphore [%s]", strerror (errno)); } - /* we are NOT the initial process. if addresses don't match, re-attach! */ - /* (again, borrowed from RSM) */ - if (shm_config->hdr->shmad != shm_config->dta) { - - /* grab the pointers we need */ - void *old_addr = shm_config->dta; - void *new_addr = shm_config->hdr->shmad; - - logprintf (FM_LOG_INFO, "shmmgr: remapping shared memory from virtual address %p to %p", old_addr, new_addr); - - /* detach and reattach */ - if (shmdt (old_addr) == -1) { - logprintf (FM_LOG_FATAL, "shm_init: detach failed during detach/reattach [shmdt error %s]", strerror (errno)); - } - - if ((shm_config->dta = shmat (shm_config->seg_id, new_addr, 0)) == -1) { - switch (errno) { - - case EINVAL: - logprintf (FM_LOG_FATAL, "shm_init: shmat() failed; no matching shared memory segment exists or shared memory address invalid"); - break; - - case ENOMEM: - logprintf (FM_LOG_ERROR, "shm_init: shmat() failed; specified address cannot be used for mapping"); - exit (1); - break; - - case EMFILE: - logprintf (FM_LOG_FATAL, "shm_init: shmat() failed; per-process shared memory segment limit reached; check kernel tuning parameters"); - break; - - default: - logprintf (FM_LOG_FATAL, "shm_init: shmat() failed; error code %d [%s]", errno, strerror (errno)); - break; - - } - } - - shm_config->hdr = (shm_hdr_t *) shm_config->dta; - - /* allocator buffer at the next page-aligned address after the header and allocation map */ - shm_config->buf = SHMALIGN(shm_config->dta + (sizeof (shm_hdr_t) * shm_config->pgct)); - } - else { - shm_config->buf = SHMALIGN(shm_config->dta + (sizeof (shm_hdr_t) * shm_config->pgct)); - } - + shm_config->buf = SHMALIGN(shm_config->dta + (sizeof (shm_hdr_t) * shm_config->pgct)); } }