version 1.9, 2025/04/13 04:22:43
|
version 1.11, 2025/04/15 18:19:40
|
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.11 2025/04/15 18:19:40 snw |
|
* Further attempts to fix FreeBSD |
|
* |
|
* Revision 1.10 2025/04/15 16:49:36 snw |
|
* Make use of logprintf throughout codebase |
|
* |
* Revision 1.9 2025/04/13 04:22:43 snw |
* Revision 1.9 2025/04/13 04:22:43 snw |
* Fix snprintf calls |
* Fix snprintf calls |
* |
* |
Line 61
|
Line 67
|
#include "shmmgr.h" |
#include "shmmgr.h" |
#include "mref.h" |
#include "mref.h" |
#include "tp_check.h" |
#include "tp_check.h" |
|
#include "log.h" |
|
|
#define FALSE 0 |
#define FALSE 0 |
#define TRUE 1 |
#define TRUE 1 |
Line 75 union semun {
|
Line 82 union semun {
|
}; |
}; |
#endif |
#endif |
|
|
void m_log (int, const char *); |
|
|
|
int semid_tp; |
int semid_tp; |
int tp_committing = FALSE; |
int tp_committing = FALSE; |
int tp_level = 0; |
int tp_level = 0; |
Line 93 void tp_init(void)
|
Line 98 void tp_init(void)
|
if (first_process) { |
if (first_process) { |
|
|
semid_tp = semget (tp_sk, 1, 0666 | IPC_CREAT); |
semid_tp = semget (tp_sk, 1, 0666 | IPC_CREAT); |
|
|
if (semid_tp == -1) { |
if (semid_tp == -1) { |
fprintf (stderr, "tp_init: failed to create transaction processing semaphore [errno %d]\r\n", errno); |
logprintf (FM_LOG_FATAL, "tp_init: failed to create transaction processing semaphore [%s]", strerror (errno)); |
exit (1); |
} |
|
else { |
|
logprintf (FM_LOG_INFO, "tp_init: got semaphore id %d", semid_tp); |
} |
} |
|
|
arg.val = 1; |
arg.val = 1; |
if (semctl (semid_tp, 0, SETVAL, arg) == -1) { |
if (semctl (semid_tp, 0, SETVAL, arg) == -1) { |
fprintf (stderr, "tp_init: failed to initialize transaction processing semaphore\r\n"); |
logprintf (FM_LOG_FATAL, "tp_init: failed to initialize transaction processing semaphore [%s]", strerror (errno)); |
exit (1); |
|
} |
} |
|
|
} |
} |
Line 109 void tp_init(void)
|
Line 116 void tp_init(void)
|
|
|
semid_tp = semget (tp_sk, 1, 0); |
semid_tp = semget (tp_sk, 1, 0); |
if (semid_tp == -1) { |
if (semid_tp == -1) { |
fprintf (stderr, "tp_init: could not attach to transaction processing semaphore [errno %d]\r\n", errno); |
logprintf (FM_LOG_FATAL, "tp_init: could not attach to transaction processing semaphore [%s]", strerror (errno)); |
exit (1); |
|
} |
} |
|
|
} |
} |
Line 126 short tp_get_sem(void)
|
Line 132 short tp_get_sem(void)
|
|
|
char msgbuf[100]; |
char msgbuf[100]; |
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d attempting to acquire transaction processing semaphore", pid); |
logprintf (FM_LOG_INFO, "tp_get_sem: process %d attempting to acquire transaction processing semaphore", pid); |
m_log (1, msgbuf); |
|
|
|
|
|
/* our process already owns the semaphore */ |
/* our process already owns the semaphore */ |
if (shm_config->hdr->tp_owner == pid) { |
if (shm_config->hdr->tp_owner == pid) { |
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d increments transaction processing semaphore counter", pid); |
logprintf (FM_LOG_INFO, "tp_get_sem: process %ld increments transaction processing semaphore counter", pid); |
m_log (1, msgbuf); |
|
|
|
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_get_sem: daemon process increments critical section counter\r\n"); |
logprintf (FM_LOG_INFO, "tp_get_sem: daemon process increments critical section counter"); |
} |
} |
|
|
|
|
Line 148 short tp_get_sem(void)
|
Line 152 short tp_get_sem(void)
|
} |
} |
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_get_sem: daemon process enters critical section\r\n"); |
logprintf (FM_LOG_INFO, "tp_get_sem: daemon process enters critical section"); |
} |
} |
|
|
|
|
Line 158 short tp_get_sem(void)
|
Line 162 short tp_get_sem(void)
|
shm_config->hdr->tp_owner = pid; |
shm_config->hdr->tp_owner = pid; |
shm_config->hdr->tp_semctr = 1; |
shm_config->hdr->tp_semctr = 1; |
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d takes transaction processing semaphore", pid); |
logprintf (FM_LOG_INFO, "tp_get_sem: process %ld takes transaction processing semaphore", pid); |
m_log (1, msgbuf); |
|
|
|
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_get_sem: daemon process takes transaction processing semaphore\r\n"); |
logprintf (FM_LOG_INFO, "tp_get_sem: daemon process takes transaction processing semaphore"); |
} |
} |
|
|
return TRUE; |
return TRUE; |
} |
} |
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d attempting to acquire transaction processing semaphore (tries = %d)", pid, tries); |
logprintf (FM_LOG_WARNING, "tp_get_sem: process %ld retries attempting to acquire transaction processing semaphore (tries = %d)", pid, tries); |
m_log (1, msgbuf); |
|
|
|
|
|
sleep (1); |
sleep (1); |
|
|
Line 191 void tp_release_sem(void)
|
Line 191 void tp_release_sem(void)
|
struct sembuf s = {0, 1, 0}; |
struct sembuf s = {0, 1, 0}; |
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_release_sem: daemon process leaves critical section\r\n"); |
logprintf (FM_LOG_INFO, "tp_release_sem: daemon process leaves critical section"); |
} |
} |
|
|
|
|
Line 199 void tp_release_sem(void)
|
Line 199 void tp_release_sem(void)
|
shm_config->hdr->tp_owner = 0; |
shm_config->hdr->tp_owner = 0; |
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_release_sem: daemon process relinquishes transaction processing semaphore\r\n"); |
logprintf (FM_LOG_INFO, "tp_release_sem: daemon process relinquishes transaction processing semaphore"); |
} |
} |
|
|
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d releases transaction processing semaphore", pid); |
logprintf (FM_LOG_INFO, "tp_get_sem: process %ld releases transaction processing semaphore", pid); |
m_log (1, msgbuf); |
|
|
|
|
|
semop (semid_tp, &s, 1); |
semop (semid_tp, &s, 1); |
|
|
Line 213 void tp_release_sem(void)
|
Line 211 void tp_release_sem(void)
|
else { |
else { |
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
fprintf (stderr, "tp_release_sem: daemon process decrements critical section counter\r\n"); |
logprintf (FM_LOG_INFO, "tp_release_sem: daemon process decrements critical section counter"); |
} |
} |
|
|
snprintf (msgbuf, sizeof (msgbuf) - 1, "tp_get_sem: process %d decrements transaction processing semaphore counter", pid); |
logprintf (FM_LOG_INFO, "tp_get_sem: process %d decrements transaction processing semaphore counter", pid); |
m_log (1, msgbuf); |
|
|
|
shm_config->hdr->tp_semctr--; |
shm_config->hdr->tp_semctr--; |
} |
} |
Line 230 int tp_tstart(char *tp_id, short serial,
|
Line 227 int tp_tstart(char *tp_id, short serial,
|
if (tp_level == TP_MAX_NEST) { |
if (tp_level == TP_MAX_NEST) { |
char m[256]; |
char m[256]; |
|
|
snprintf (m, sizeof (m) - 1, "Attempt to exceed TP_MAX_NEST. Transaction aborted.\r\n\201"); |
logprintf (FM_LOG_ERROR, "Attempt to exceed TP_MAX_NEST. Transaction aborted."); |
write_m (m); |
|
|
|
return FALSE; |
return FALSE; |
} |
} |
Line 254 int tp_tstart(char *tp_id, short serial,
|
Line 250 int tp_tstart(char *tp_id, short serial,
|
|
|
} |
} |
else { |
else { |
fprintf (stderr, "tp_tstart: could not get transaction processing semaphore\r\n"); |
logprintf (FM_LOG_FATAL, "tp_tstart: could not get transaction processing semaphore"); |
exit (1); |
|
} |
} |
|
|
|
|
Line 275 int tp_add_op(short islock, short action
|
Line 270 int tp_add_op(short islock, short action
|
if (transactions[tp_level].opcount == TP_MAX_OPS) { |
if (transactions[tp_level].opcount == TP_MAX_OPS) { |
char m[256]; |
char m[256]; |
|
|
snprintf (m, sizeof (m) - 1, "Attempt to exceed TP_MAX_OPS at transaction level %d. Rolling back.\r\n\201", tp_level); |
logprintf (FM_LOG_ERROR, "attempt to exceed TP_MAX_OPS at transaction level %d; rolling back", tp_level); |
write_m (m); |
|
|
|
free (gr); |
free (gr); |
|
|