/* ************************************************************* */
+#ifdef USE_SHMEM
+int hup_shm_idx = -1;
+char *hup_shm_ttyrec_fn = NULL;
+#endif
+
void
catch_sighup (int signum)
{
kill (child, SIGHUP);
sleep (5);
}
+#ifdef USE_SHMEM
+ if (hup_shm_idx != -1) {
+ struct dg_shm *shm_dg_data = NULL;
+ struct dg_shm_game *shm_dg_game = NULL;
+ shm_init(&shm_dg_data, &shm_dg_game);
+
+ shm_sem_wait(shm_dg_data);
+ if (shm_dg_game[hup_shm_idx].in_use &&
+ !strcmp(shm_dg_game[hup_shm_idx].ttyrec_fn, hup_shm_ttyrec_fn) &&
+ (shm_dg_game[hup_shm_idx].nwatchers > 0)) {
+ shm_dg_game[hup_shm_idx].nwatchers--;
+ }
+ shm_sem_post(shm_dg_data);
+ hup_shm_idx = -1;
+ free(hup_shm_ttyrec_fn);
+ }
+#endif
debug_write("catchup sighup");
graceful_exit (2);
}
shm_dg_game[shm_idx].nwatchers++;
games[idx]->nwatchers++;
}
+ hup_shm_idx = shm_idx;
+ hup_shm_ttyrec_fn = strdup(games[idx]->ttyrec_fn);
shm_sem_post(shm_dg_data);
}
#endif
setproctitle("<Anonymous>");
#ifdef USE_SHMEM
if (games[idx]->is_in_shm) {
+ hup_shm_idx = -1;
+ free(hup_shm_ttyrec_fn);
shm_sem_wait(shm_dg_data);
if (shm_dg_game[shm_idx].in_use &&
!strcmp(shm_dg_game[shm_idx].ttyrec_fn, games[idx]->ttyrec_fn) &&
extern struct dg_game **sort_games(struct dg_game **games, int len, dg_sortmode sortmode);
int runmenuloop(struct dg_menu *menu);
+
+extern void shm_sem_wait(struct dg_shm *shm_dg_data);
+extern void shm_sem_post(struct dg_shm *shm_dg_data);
+extern void shm_update(struct dg_shm *shm_dg_data, struct dg_game **games, int len);
+extern void shm_mk_keys(key_t *shm_key, key_t *shm_sem_key);
+extern void shm_init(struct dg_shm **shm_dg_data, struct dg_shm_game **shm_dg_game);
+
extern int dgl_getch(void);
extern void idle_alarm_set_enabled(int enabled);
extern void idle_alarm_reset(void);