version 1.4, 2025/03/09 19:14:25
|
version 1.7, 2025/05/01 21:02:31
|
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.7 2025/05/01 21:02:31 snw |
|
* Documentation updates |
|
* |
|
* Revision 1.6 2025/04/13 04:22:43 snw |
|
* Fix snprintf calls |
|
* |
|
* Revision 1.5 2025/03/24 02:57:25 snw |
|
* Shared memory compatibility fixes for OS/2 |
|
* |
* Revision 1.4 2025/03/09 19:14:25 snw |
* Revision 1.4 2025/03/09 19:14:25 snw |
* First phase of REUSE compliance and header reformat |
* First phase of REUSE compliance and header reformat |
* |
* |
Line 43
|
Line 52
|
#include "shmmgr.h" |
#include "shmmgr.h" |
#include "mref.h" |
#include "mref.h" |
#include "transact.h" |
#include "transact.h" |
|
#include "log.h" |
|
|
#if !defined(__OpenBSD__) && !defined(__APPLE__) |
#if !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__OS2__) |
union semun { |
union semun { |
int val; /* Value for SETVAL */ |
int val; /* Value for SETVAL */ |
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ |
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ |
Line 104 short locktab_get_sem(void)
|
Line 114 short locktab_get_sem(void)
|
if (semop (semid_locktab, &s, 1) != -1) { |
if (semop (semid_locktab, &s, 1) != -1) { |
return TRUE; |
return TRUE; |
} |
} |
|
printf ("jibjaw\r\n"); |
sleep (1); |
sleep (1); |
|
|
} |
} |
Line 231 void locktab_increment(char *key, long l
|
Line 241 void locktab_increment(char *key, long l
|
|
|
} |
} |
else { |
else { |
|
int sigint_ct = 0; |
|
|
for (;;) { |
for (;;) { |
|
|
if (locktab_insert (key) != NULL) { |
if (locktab_insert (key) != NULL) { |
Line 238 void locktab_increment(char *key, long l
|
Line 250 void locktab_increment(char *key, long l
|
return; |
return; |
} |
} |
else { |
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); |
sleep (1); |
} |
} |
|
|
Line 403 void locktab_decrement(char *key, long l
|
Line 427 void locktab_decrement(char *key, long l
|
|
|
void locktab_unlock_all(void) |
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; |
locktab_ent_t *lck; |
|
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); |
|
} |
|
|
|
|
for (lck = shm_config->hdr->locktab_head; lck != NULL; lck = lck->next) { |
for (lck = shm_config->hdr->locktab_head; lck != NULL; lck = lck->next) { |
|
|
if (lck->owner_job == pid) { |
if (lck->owner_job == target_pid) { |
|
remove_ct++; |
|
|
if (tp_level > lck->tp_level) { |
if (tp_level > lck->tp_level) { |
merr_raise (M41); |
merr_raise (M41); |
return; |
return; |
Line 422 void locktab_unlock_all(void)
|
Line 459 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); |
|
} |
|
|
|
|
} |
} |
|
|
Line 433 locktab_ent_t *locktab_find(char *key)
|
Line 475 locktab_ent_t *locktab_find(char *key)
|
char chk_ns[255]; |
char chk_ns[255]; |
|
|
if (key[1] == '%') { |
if (key[1] == '%') { |
snprintf (chk_ns, 255, "SYSTEM"); |
snprintf (chk_ns, sizeof (chk_ns) - 1, "SYSTEM"); |
} |
} |
else { |
else { |
snprintf (chk_ns, 255, "%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 = shm_config->hdr->locktab_head; lck != NULL; lck = lck->next) { |
Line 477 locktab_ent_t *locktab_insert(char *key)
|
Line 519 locktab_ent_t *locktab_insert(char *key)
|
ik = internal_to_mref (ik, key); |
ik = internal_to_mref (ik, key); |
|
|
if (key[1] == '%') { |
if (key[1] == '%') { |
snprintf (chk_ns, 255, "SYSTEM"); |
snprintf (chk_ns, sizeof (chk_ns) - 1, "SYSTEM"); |
} |
} |
else { |
else { |
snprintf (chk_ns, 255, "%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 = shm_config->hdr->locktab_head; l != NULL; l = l->next) { |
Line 532 new_insert:
|
Line 574 new_insert:
|
} |
} |
|
|
stcpy (l->nref, key); |
stcpy (l->nref, key); |
snprintf (l->namespace, 255, "%s", chk_ns); |
snprintf (l->namespace, sizeof (l->namespace) - 1, "%s", chk_ns); |
|
|
l->owner_job = pid; |
l->owner_job = pid; |
l->ct = 1; |
l->ct = 1; |