|
|
| version 1.8, 2025/04/30 20:03:09 | version 1.12, 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.12 2025/05/14 15:28:55 snw | |
| * Get basic job table and lock table functionality working with new shared memory architecture | |
| * | |
| * Revision 1.11 2025/05/14 12:22:04 snw | |
| * Further work on shared memory | |
| * | |
| * Revision 1.10 2025/05/12 18:18:00 snw | |
| * Further work on shared memory | |
| * | |
| * Revision 1.9 2025/05/01 21:02:31 snw | |
| * Documentation updates | |
| * | |
| * Revision 1.8 2025/04/30 20:03:09 snw | * Revision 1.8 2025/04/30 20:03:09 snw |
| * Work on entryref parser | * Work on entryref parser |
| * | * |
| Line 112 short jobtab_get_sem(void) | Line 124 short jobtab_get_sem(void) |
| int tries; | int tries; |
| struct sembuf s = {0, -1, IPC_NOWAIT}; | struct sembuf s = {0, -1, IPC_NOWAIT}; |
| logprintf (FM_LOG_DEBUG, "jobtab_get_sem: attempting to acquire job table semaphore"); | |
| if (have_jobtab_sem) { | if (have_jobtab_sem) { |
| logprintf (FM_LOG_DEBUG, "jobtab_get_sem: acquired semaphore by virtue of already owning it"); | |
| return TRUE; | return TRUE; |
| } | } |
| for (tries = 0; tries < 5; tries++) { | for (tries = 0; tries < 5; tries++) { |
| if (semop (semid_jobtab, &s, 1) != -1) { | if (semop (semid_jobtab, &s, 1) != -1) { |
| logprintf (FM_LOG_DEBUG, "jobtab_get_sem: acquired semaphore by virtue of calling semop on it"); | |
| have_jobtab_sem = TRUE; | have_jobtab_sem = TRUE; |
| return TRUE; | return TRUE; |
| } | } |
| logprintf (FM_LOG_INFO, "jobtab_get_sem: sleeping for retry [tries = %d]", tries); | logprintf (FM_LOG_INFO, "jobtab_get_sem: sleeping for retry [tries = %d; errno = %d; error = %s]", tries, errno, strerror (errno)); |
| sleep (1); | sleep (1); |
| } | } |
| logprintf (FM_LOG_ERROR, "jobtab_get_sem: failed to acquire job table semaphore"); | logprintf (FM_LOG_ERROR, "jobtab_get_sem: failed to acquire job table semaphore"); |
| have_jobtab_sem = FALSE; | have_jobtab_sem = FALSE; |
| return FALSE; | return FALSE; |
| } | } |
| Line 137 void jobtab_release_sem(void) | Line 153 void jobtab_release_sem(void) |
| { | { |
| struct sembuf s = {0, 1, 0}; | struct sembuf s = {0, 1, 0}; |
| semop (semid_jobtab, &s, 1); | logprintf (FM_LOG_DEBUG, "jobtab_release_sem: trying to release job table semaphore"); |
| if (semop (semid_jobtab, &s, 1) != -1) { | |
| have_jobtab_sem = FALSE; | logprintf (FM_LOG_DEBUG, "jobtab_release_sem: released job table semaphore by means of semop"); |
| have_jobtab_sem = FALSE; | |
| } | |
| else { | |
| logprintf (FM_LOG_FATAL, "jobtab_release_sem: failed to release job table semaphore (error code %d [%s])", errno, strerror (errno)); | |
| } | |
| } | } |
| Line 152 job_slot_t *job_init(short is_fmadm) | Line 173 job_slot_t *job_init(short is_fmadm) |
| logprintf (FM_LOG_FATAL, "job_init: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_init: failed to get job table semaphore"); |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (((s->flags & JFLG_DEFUNCT) == JFLG_DEFUNCT) || (s->pid == pid)) { | if (((s->flags & JFLG_DEFUNCT) == JFLG_DEFUNCT) || (s->pid == pid)) { |
| goto skip_alloc; | goto skip_alloc; |
| Line 184 skip_alloc: | Line 205 skip_alloc: |
| } | } |
| } | } |
| s->next = shm_config->hdr->jobtab_head; | s->next = SBM(SOA(shm_config->hdr->jobtab_head)); |
| shm_config->hdr->jobtab_head = s; | shm_config->hdr->jobtab_head = SBM(s); |
| jobtab_release_sem (); | jobtab_release_sem (); |
| Line 196 skip_alloc: | Line 217 skip_alloc: |
| void job_remove(const pid_t pid) | void job_remove(const pid_t pid) |
| { | { |
| job_slot_t *t = shm_config->hdr->jobtab_head; | job_slot_t *t = SOM(shm_config->hdr->jobtab_head); |
| job_slot_t *p = NULL; | job_slot_t *p = NULL; |
| if (jobtab_get_sem () == FALSE) { | if (jobtab_get_sem () == FALSE) { |
| logprintf (FM_LOG_FATAL, "job_remove: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_remove: failed to get job table semaphore"); |
| exit (1); | |
| } | } |
| if ((t != (job_slot_t *) NULL) && (t->pid == pid)) { | if ((t != (job_slot_t *) NULL) && (t->pid == pid)) { |
| shm_config->hdr->jobtab_head = t->next; | shm_config->hdr->jobtab_head = SBM(SOA(t->next)); |
| shm_free (t); | shm_free (t); |
| jobtab_release_sem (); | jobtab_release_sem (); |
| Line 217 void job_remove(const pid_t pid) | Line 237 void job_remove(const pid_t pid) |
| while ((t != NULL) && (t->pid != pid)) { | while ((t != NULL) && (t->pid != pid)) { |
| p = t; | p = t; |
| t = t->next; | t = SOA(t->next); |
| } | } |
| if (t == NULL) { | if (t == NULL) { |
| Line 225 void job_remove(const pid_t pid) | Line 245 void job_remove(const pid_t pid) |
| return; | return; |
| } | } |
| p->next = t->next; | p->next = SBA(t->next); |
| shm_free (t); | shm_free (t); |
| jobtab_release_sem (); | jobtab_release_sem (); |
| locktab_unlock_all_by_pid (pid); | |
| } | } |
| void job_request_stop(const pid_t target_pid) | void job_request_stop(const pid_t target_pid) |
| Line 241 void job_request_stop(const pid_t target | Line 262 void job_request_stop(const pid_t target |
| logprintf (FM_LOG_FATAL, "job_request_stop: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_request_stop: failed to get job table semaphore"); |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (s->pid == target_pid) { | if (s->pid == target_pid) { |
| s->stop_requested = pid; | s->stop_requested = pid; |
| Line 267 void job_set_ecode(const pid_t target_pi | Line 288 void job_set_ecode(const pid_t target_pi |
| logprintf (FM_LOG_FATAL, "job_set_ecode: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_set_ecode: failed to get job table semaphore"); |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (s->pid == target_pid) { | if (s->pid == target_pid) { |
| strncpy (s->last_ecode, ecode, 20); | strncpy (s->last_ecode, ecode, 20); |
| Line 286 pid_t job_stop_requested (const pid_t ta | Line 307 pid_t job_stop_requested (const pid_t ta |
| job_slot_t *s; | job_slot_t *s; |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (s->pid == target_pid) { | if (s->pid == target_pid) { |
| return s->stop_requested; | return s->stop_requested; |
| } | } |
| Line 302 void job_request_all_stop(void) | Line 323 void job_request_all_stop(void) |
| job_slot_t *s; | job_slot_t *s; |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if ((s->flags & JFLG_DAEMON) != JFLG_DAEMON) { | if ((s->flags & JFLG_DAEMON) != JFLG_DAEMON) { |
| job_request_stop (s->pid); | job_request_stop (s->pid); |
| Line 318 void job_signal_all(const int sig) | Line 339 void job_signal_all(const int sig) |
| job_slot_t *s; | job_slot_t *s; |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if ((s->flags & JFLG_DAEMON) != JFLG_DAEMON) { | if ((s->flags & JFLG_DAEMON) != JFLG_DAEMON) { |
| kill (s->pid, sig); | kill (s->pid, sig); |
| Line 335 int job_count(void) | Line 356 int job_count(void) |
| job_slot_t *s; | job_slot_t *s; |
| int ct = 0; | int ct = 0; |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if ((s->flags & JFLG_DEFUNCT) != JFLG_DEFUNCT) { | if ((s->flags & JFLG_DEFUNCT) != JFLG_DEFUNCT) { |
| ct++; | ct++; |
| Line 356 job_slot_t *job_set_status(const pid_t t | Line 377 job_slot_t *job_set_status(const pid_t t |
| logprintf (FM_LOG_FATAL, "job_set_status: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_set_status: failed to get job table semaphore"); |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (s->pid == target_pid) { | if (s->pid == target_pid) { |
| s->status = status; | s->status = status; |
| Line 382 void job_gc_mark(void) | Line 403 void job_gc_mark(void) |
| logprintf (FM_LOG_FATAL, "job_gc_mark: failed to get job table semaphore"); | logprintf (FM_LOG_FATAL, "job_gc_mark: failed to get job table semaphore"); |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| logprintf (FM_LOG_WARNING, "job_gc_mark looking at pid %ld", s->pid); | |
| if ((jobstat = kill (s->pid, 0)) != 0) { | if ((jobstat = kill (s->pid, 0)) != 0) { |
| switch (jobstat) { | switch (jobstat) { |
| Line 436 void job_gc_sweep(void) | Line 457 void job_gc_sweep(void) |
| } | } |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if ((s->flags & JFLG_DEFUNCT) == JFLG_DEFUNCT) { | if ((s->flags & JFLG_DEFUNCT) == JFLG_DEFUNCT) { |
| Line 476 ipc_slot_t *job_send_ipc(const pid_t rec | Line 497 ipc_slot_t *job_send_ipc(const pid_t rec |
| } | } |
| for (j = shm_config->hdr->jobtab_head; j != NULL; j = j->next) { | for (j = SOA(shm_config->hdr->jobtab_head); j != NULL; j = SOA(j->next)) { |
| if (j->pid == receiver_pid) { | if (j->pid == receiver_pid) { |
| Line 508 job_slot_t *job_get(const pid_t target_p | Line 529 job_slot_t *job_get(const pid_t target_p |
| job_slot_t *s; | job_slot_t *s; |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| if (s->pid == target_pid) return s; | if (s->pid == target_pid) return s; |
| } | } |
| Line 530 void job_dump(void) | Line 551 void job_dump(void) |
| printf ("%-10s%-15s%-20s%-22s%s\r\n", "PID", "STATUS", "LAST ECODE", "STARTED", "FLAGS"); | printf ("%-10s%-15s%-20s%-22s%s\r\n", "PID", "STATUS", "LAST ECODE", "STARTED", "FLAGS"); |
| printf ("%-10s%-15s%-20s%-22s%s\r\n", "---", "------", "----------", "-------", "-----"); | printf ("%-10s%-15s%-20s%-22s%s\r\n", "---", "------", "----------", "-------", "-----"); |
| for (s = shm_config->hdr->jobtab_head; s != NULL; s = s->next) { | for (s = SOA(shm_config->hdr->jobtab_head); s != NULL; s = SOA(s->next)) { |
| strftime (time_buf, 20, "%Y-%m-%d %H:%M:%S", localtime (&(s->start_time))); | strftime (time_buf, 20, "%Y-%m-%d %H:%M:%S", localtime (&(s->start_time))); |