version 1.7, 2025/05/01 21:02:31
|
version 1.8, 2025/05/14 15:28:55
|
Line 24
|
Line 24
|
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* |
* |
* $Log$ |
* $Log$ |
|
* 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 |
* Revision 1.7 2025/05/01 21:02:31 snw |
* Documentation updates |
* Documentation updates |
* |
* |
Line 79 void locktab_init(void)
|
Line 82 void locktab_init(void)
|
|
|
semid_locktab = semget (lt_sk, 1, 0666 | IPC_CREAT); |
semid_locktab = semget (lt_sk, 1, 0666 | IPC_CREAT); |
if (semid_locktab == -1) { |
if (semid_locktab == -1) { |
fprintf (stderr, "locktab_init: failed to create lock table semaphore\r\n"); |
logprintf (FM_LOG_FATAL, "locktab_init: failed to create lock table semaphore"); |
exit (1); |
|
} |
} |
|
|
arg.val = 1; |
arg.val = 1; |
if (semctl (semid_locktab, 0, SETVAL, arg) == -1) { |
if (semctl (semid_locktab, 0, SETVAL, arg) == -1) { |
fprintf (stderr, "locktab_init: failed to initialize lock table semaphore\r\n"); |
logprintf (FM_LOG_FATAL, "locktab_init: failed to initialize lock table semaphore"); |
exit (1); |
|
} |
} |
|
|
} |
} |
Line 94 void locktab_init(void)
|
Line 95 void locktab_init(void)
|
|
|
semid_locktab = semget (lt_sk, 1, 0); |
semid_locktab = semget (lt_sk, 1, 0); |
if (semid_locktab == -1) { |
if (semid_locktab == -1) { |
fprintf (stderr, "locktab_init: could not attach to lock table semaphore\r\n"); |
logprintf (FM_LOG_FATAL, "locktab_init: could not attach to lock table semaphore"); |
exit (1); |
|
} |
} |
|
|
} |
} |
Line 109 short locktab_get_sem(void)
|
Line 109 short locktab_get_sem(void)
|
int tries; |
int tries; |
struct sembuf s = {0, -1, 0}; |
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++) { |
for (tries = 0; tries < 5; tries++) { |
|
|
if (semop (semid_locktab, &s, 1) != -1) { |
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; |
return TRUE; |
} |
} |
printf ("jibjaw\r\n"); |
|
|
logprintf (FM_LOG_INFO, "locktab_get_sem: sleeping for retry [tries = %d; errno = %d; error = %s]", tries, errno, strerror (errno)); |
sleep (1); |
sleep (1); |
|
|
} |
} |
|
logprintf (FM_LOG_ERROR, "locktab_get_sem: failed to acquire job table semaphore"); |
|
|
return FALSE; |
return FALSE; |
} |
} |
Line 126 void locktab_release_sem(void)
|
Line 131 void locktab_release_sem(void)
|
{ |
{ |
struct sembuf s = {0, 1, 0}; |
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)); |
|
} |
|
|
} |
} |
|
|
Line 441 void locktab_unlock_all_by_pid(const pid
|
Line 452 void locktab_unlock_all_by_pid(const pid
|
} |
} |
|
|
|
|
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 (lck->owner_job == target_pid) { |
if (lck->owner_job == target_pid) { |
remove_ct++; |
remove_ct++; |
Line 481 locktab_ent_t *locktab_find(char *key)
|
Line 492 locktab_ent_t *locktab_find(char *key)
|
snprintf (chk_ns, sizeof (chk_ns) - 1, "%s", nsname); |
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)) { |
if ((stcmp (lck->nref, key) == 0) && (strcmp (lck->namespace, chk_ns) == 0)) { |
|
|
Line 525 locktab_ent_t *locktab_insert(char *key)
|
Line 536 locktab_ent_t *locktab_insert(char *key)
|
snprintf (chk_ns, sizeof (chk_ns) - 1, "%s", nsname); |
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 = mref_init (ok, MREF_RT_GLOBAL, ""); |
ok = internal_to_mref (ok, l->nref); |
ok = internal_to_mref (ok, l->nref); |
|
|
Line 579 new_insert:
|
Line 590 new_insert:
|
l->owner_job = pid; |
l->owner_job = pid; |
l->ct = 1; |
l->ct = 1; |
|
|
l->next = shm_config->hdr->locktab_head; |
l->next = SBM(SOA(shm_config->hdr->locktab_head)); |
shm_config->hdr->locktab_head = l; |
shm_config->hdr->locktab_head = SBM(l); |
|
|
ssvn_lock_add (l->nref, l->owner_job, l->ct); |
ssvn_lock_add (l->nref, l->owner_job, l->ct); |
|
|
Line 596 int locktab_count(char *key)
|
Line 607 int locktab_count(char *key)
|
locktab_ent_t *l; |
locktab_ent_t *l; |
int ct = 0; |
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++; |
if (stcmp (l->nref, key) == 0) ct++; |
} |
} |
|
|
Line 623 unsigned long locktab_pages(void)
|
Line 634 unsigned long locktab_pages(void)
|
unsigned long pages = 0; |
unsigned long pages = 0; |
float extra; |
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); |
bytes += sizeof (locktab_ent_t); |
} |
} |
|
|
Line 645 unsigned long locktab_bytes(void)
|
Line 656 unsigned long locktab_bytes(void)
|
unsigned int ct = 0; |
unsigned int ct = 0; |
unsigned long bytes = 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++; |
ct++; |
bytes += sizeof (locktab_ent_t); |
bytes += sizeof (locktab_ent_t); |
} |
} |
Line 672 void locktab_dump(void)
|
Line 683 void locktab_dump(void)
|
printf ("%-20s%-20s%-20s%s\r\n", "NAMESPACE", "PID", "COUNT", "KEY"); |
printf ("%-20s%-20s%-20s%s\r\n", "NAMESPACE", "PID", "COUNT", "KEY"); |
printf ("%-20s%-20s%-20s%s\r\n", "---------", "---", "-----", "---"); |
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"); |
printf ("\r\n*** lock table empty ***\r\n"); |
free (r); |
free (r); |
return; |
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, ""); |
mref_init (r, MREF_RT_GLOBAL, ""); |
internal_to_mref (r, l->nref); |
internal_to_mref (r, l->nref); |