--- freem/src/locktab.c 2025/04/13 04:22:43 1.6 +++ freem/src/locktab.c 2025/05/14 15:28:55 1.8 @@ -1,5 +1,5 @@ /* - * $Id: locktab.c,v 1.6 2025/04/13 04:22:43 snw Exp $ + * $Id: locktab.c,v 1.8 2025/05/14 15:28:55 snw Exp $ * lock table implementation * * @@ -24,6 +24,12 @@ * along with FreeM. If not, see . * * $Log: locktab.c,v $ + * Revision 1.8 2025/05/14 15:28:55 snw + * Get basic job table and lock table functionality working with new shared memory architecture + * + * Revision 1.7 2025/05/01 21:02:31 snw + * Documentation updates + * * Revision 1.6 2025/04/13 04:22:43 snw * Fix snprintf calls * @@ -49,6 +55,7 @@ #include "shmmgr.h" #include "mref.h" #include "transact.h" +#include "log.h" #if !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__OS2__) union semun { @@ -75,14 +82,12 @@ void locktab_init(void) semid_locktab = semget (lt_sk, 1, 0666 | IPC_CREAT); if (semid_locktab == -1) { - fprintf (stderr, "locktab_init: failed to create lock table semaphore\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "locktab_init: failed to create lock table semaphore"); } arg.val = 1; if (semctl (semid_locktab, 0, SETVAL, arg) == -1) { - fprintf (stderr, "locktab_init: failed to initialize lock table semaphore\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "locktab_init: failed to initialize lock table semaphore"); } } @@ -90,8 +95,7 @@ void locktab_init(void) semid_locktab = semget (lt_sk, 1, 0); if (semid_locktab == -1) { - fprintf (stderr, "locktab_init: could not attach to lock table semaphore\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "locktab_init: could not attach to lock table semaphore"); } } @@ -105,15 +109,20 @@ short locktab_get_sem(void) int tries; struct sembuf s = {0, -1, 0}; + logprintf (FM_LOG_DEBUG, "locktab_get_sem: attempting to acquire lock table semaphore"); + for (tries = 0; tries < 5; tries++) { if (semop (semid_locktab, &s, 1) != -1) { + logprintf (FM_LOG_DEBUG, "locktab_get_sem: acquired semaphore by virtue of calling semop on it"); return TRUE; } + logprintf (FM_LOG_INFO, "locktab_get_sem: sleeping for retry [tries = %d; errno = %d; error = %s]", tries, errno, strerror (errno)); sleep (1); } + logprintf (FM_LOG_ERROR, "locktab_get_sem: failed to acquire job table semaphore"); return FALSE; } @@ -122,7 +131,13 @@ void locktab_release_sem(void) { struct sembuf s = {0, 1, 0}; - semop (semid_locktab, &s, 1); + logprintf (FM_LOG_DEBUG, "locktab_release_sem: trying to release lock table semaphore"); + if(semop (semid_locktab, &s, 1) != - 1) { + logprintf (FM_LOG_DEBUG, "locktab_release_sem: released lock table semaphore by means of semop"); + } + else { + logprintf (FM_LOG_FATAL, "locktab_release_sem: failed to release lock table semaphore (error code %d [%s])", errno, strerror (errno)); + } } @@ -237,6 +252,8 @@ void locktab_increment(char *key, long l } else { + int sigint_ct = 0; + for (;;) { if (locktab_insert (key) != NULL) { @@ -244,6 +261,18 @@ void locktab_increment(char *key, long l return; } else { + if (merr () == INRPT) { + sigint_ct++; + + if (sigint_ct == 1) { + printf ("\r\nlocktab_insert: got Ctrl-C in blocking LOCK; Ctrl-C again to force the process to halt\r\n"); + merr_clear (); + } + else { + printf ("\r\n"); + logprintf (FM_LOG_FATAL, "locktab_insert: blocking LOCK was interrupted; forcing halt"); + } + } sleep (1); } @@ -409,12 +438,25 @@ void locktab_decrement(char *key, long l void locktab_unlock_all(void) { + locktab_unlock_all_by_pid (pid); +} + +void locktab_unlock_all_by_pid(const pid_t target_pid) +{ locktab_ent_t *lck; - - for (lck = shm_config->hdr->locktab_head; lck != NULL; lck = lck->next) { + int remove_ct; + + remove_ct = 0; + if (target_pid != pid) { + logprintf (FM_LOG_INFO, "locktab_unlock_all_by_pid: removing all locks for pid %ld", target_pid); + } - if (lck->owner_job == pid) { + + for (lck = SOA(shm_config->hdr->locktab_head); lck != NULL; lck = SOA(lck->next)) { + if (lck->owner_job == target_pid) { + remove_ct++; + if (tp_level > lck->tp_level) { merr_raise (M41); return; @@ -428,7 +470,12 @@ void locktab_unlock_all(void) } - } + } + + if (target_pid != pid) { + logprintf (FM_LOG_INFO, "locktab_unlock_all_by_pid: removed %ld lock(s) for pid %ld", remove_ct, target_pid); + } + } @@ -445,7 +492,7 @@ locktab_ent_t *locktab_find(char *key) snprintf (chk_ns, sizeof (chk_ns) - 1, "%s", nsname); } - for (lck = shm_config->hdr->locktab_head; lck != NULL; lck = lck->next) { + for (lck = SOA(shm_config->hdr->locktab_head); lck != NULL; lck = SOA(lck->next)) { if ((stcmp (lck->nref, key) == 0) && (strcmp (lck->namespace, chk_ns) == 0)) { @@ -489,7 +536,7 @@ locktab_ent_t *locktab_insert(char *key) snprintf (chk_ns, sizeof (chk_ns) - 1, "%s", nsname); } - for (l = shm_config->hdr->locktab_head; l != NULL; l = l->next) { + for (l = SOA(shm_config->hdr->locktab_head); l != NULL; l = SOA(l->next)) { ok = mref_init (ok, MREF_RT_GLOBAL, ""); ok = internal_to_mref (ok, l->nref); @@ -543,8 +590,8 @@ new_insert: l->owner_job = pid; l->ct = 1; - l->next = shm_config->hdr->locktab_head; - shm_config->hdr->locktab_head = l; + l->next = SBM(SOA(shm_config->hdr->locktab_head)); + shm_config->hdr->locktab_head = SBM(l); ssvn_lock_add (l->nref, l->owner_job, l->ct); @@ -560,7 +607,7 @@ int locktab_count(char *key) locktab_ent_t *l; int ct = 0; - for (l = shm_config->hdr->locktab_head; l != NULL; l = l->next) { + for (l = SOA(shm_config->hdr->locktab_head); l != NULL; l = SOA(l->next)) { if (stcmp (l->nref, key) == 0) ct++; } @@ -587,7 +634,7 @@ unsigned long locktab_pages(void) unsigned long pages = 0; float extra; - for (l = shm_config->hdr->locktab_head; l != NULL; l = l->next) { + for (l = SOA(shm_config->hdr->locktab_head); l != NULL; l = SOA(l->next)) { bytes += sizeof (locktab_ent_t); } @@ -609,7 +656,7 @@ unsigned long locktab_bytes(void) unsigned int ct = 0; unsigned long bytes = 0; - for (l = shm_config->hdr->locktab_head; l != NULL; l = l->next) { + for (l = SOA(shm_config->hdr->locktab_head); l != NULL; l = SOA(l->next)) { ct++; bytes += sizeof (locktab_ent_t); } @@ -636,14 +683,14 @@ void locktab_dump(void) printf ("%-20s%-20s%-20s%s\r\n", "NAMESPACE", "PID", "COUNT", "KEY"); printf ("%-20s%-20s%-20s%s\r\n", "---------", "---", "-----", "---"); - if (shm_config->hdr->locktab_head == NULL) { + if (SOA(shm_config->hdr->locktab_head) == NULL) { printf ("\r\n*** lock table empty ***\r\n"); free (r); return; } - for (l = shm_config->hdr->locktab_head; l != NULL; l = l->next) { + for (l = SOA(shm_config->hdr->locktab_head); l != NULL; l = SOA(l->next)) { mref_init (r, MREF_RT_GLOBAL, ""); internal_to_mref (r, l->nref);