|
@@ -22,13 +22,13 @@
|
|
|
|
|
|
#include <sys/resource.h> // for getrlimit()
|
|
|
|
|
|
+#include <sys/mman.h>
|
|
|
+
|
|
|
#ifdef USE_POLL_FOR_SLEEP
|
|
|
#include <poll.h>
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-srv_state s_state = {0};
|
|
|
+
|
|
|
srv_state *p_state = NULL;
|
|
|
|
|
|
|
|
@@ -622,6 +622,74 @@ void term_handler(int s)
|
|
|
}
|
|
|
|
|
|
|
|
|
+srv_state *srv_state_op(xs_str **fname, int op)
|
|
|
+
|
|
|
+{
|
|
|
+ int fd;
|
|
|
+ srv_state *ss = NULL;
|
|
|
+
|
|
|
+ if (*fname == NULL)
|
|
|
+ *fname = xs_fmt("/%s_snac_state", xs_dict_get(srv_config, "host"));
|
|
|
+
|
|
|
+ switch (op) {
|
|
|
+ case 0:
|
|
|
+ if ((fd = shm_open(*fname, O_CREAT | O_RDWR, 0666)) != -1) {
|
|
|
+ ftruncate(fd, sizeof(*ss));
|
|
|
+
|
|
|
+ if ((ss = mmap(0, sizeof(*ss), PROT_READ | PROT_WRITE,
|
|
|
+ MAP_SHARED, fd, 0)) == MAP_FAILED)
|
|
|
+ ss = NULL;
|
|
|
+
|
|
|
+ close(fd);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ss == NULL) {
|
|
|
+
|
|
|
+ srv_log(xs_fmt("warning: shm object error (%s)", strerror(errno)));
|
|
|
+ ss = malloc(sizeof(*ss));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ *ss = (srv_state){0};
|
|
|
+ ss->s_size = sizeof(*ss);
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 1:
|
|
|
+ if ((fd = shm_open(*fname, O_RDONLY, 0666)) != -1) {
|
|
|
+ if ((ss = mmap(0, sizeof(*ss), PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED)
|
|
|
+ ss = NULL;
|
|
|
+
|
|
|
+ close(fd);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ss == NULL) {
|
|
|
+
|
|
|
+ srv_log(xs_fmt("error: shm object error (%s) server not running?", strerror(errno)));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ if (ss->s_size != sizeof(*ss)) {
|
|
|
+ srv_log(xs_fmt("error: struct size mismatch (%d != %d)",
|
|
|
+ ss->s_size, sizeof(*ss)));
|
|
|
+
|
|
|
+ munmap(ss, sizeof(*ss));
|
|
|
+
|
|
|
+ ss = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ if (*fname)
|
|
|
+ shm_unlink(*fname);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ss;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void httpd(void)
|
|
|
|
|
|
{
|
|
@@ -631,12 +699,11 @@ void httpd(void)
|
|
|
pthread_t threads[MAX_THREADS] = {0};
|
|
|
int n;
|
|
|
xs *sem_name = NULL;
|
|
|
+ xs *shm_name = NULL;
|
|
|
sem_t anon_job_sem;
|
|
|
|
|
|
|
|
|
- {
|
|
|
- p_state = &s_state;
|
|
|
- }
|
|
|
+ p_state = srv_state_op(&shm_name, 0);
|
|
|
|
|
|
p_state->srv_start_time = time(NULL);
|
|
|
|
|
@@ -736,6 +803,8 @@ void httpd(void)
|
|
|
sem_close(job_sem);
|
|
|
sem_unlink(sem_name);
|
|
|
|
|
|
+ srv_state_op(&shm_name, 2);
|
|
|
+
|
|
|
xs *uptime = xs_str_time_diff(time(NULL) - p_state->srv_start_time);
|
|
|
|
|
|
srv_log(xs_fmt("httpd%s stop %s:%s (run time: %s)",
|