From 12d9641b668a7bb144ae56f6c5984a3385c84c48 Mon Sep 17 00:00:00 2001 From: "roberto@silente" Date: Thu, 16 Dec 2010 07:21:51 +0100 Subject: [PATCH] OpenBSD, endianess and clustering fixes --- lock.c | 28 +++++++++++++++++++++++++--- master.c | 14 ++++++++++++++ plugins/http/http.c | 7 ++++++- protocol.c | 3 +++ uwsgi.c | 6 ++++++ 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/lock.c b/lock.c index 7ab6b5a..070179d 100644 --- a/lock.c +++ b/lock.c @@ -134,14 +134,36 @@ void uwsgi_rwunlock(void *lock) { uwsgi_unlock(lock); } #define UWSGI_LOCK_SIZE 8 #define UWSGI_RWLOCK_SIZE 8 -void uwsgi_lock_init(void *lock) {} +static int lock_counter = 0; + +void uwsgi_lock_init(void *lock) { + + char filename[17]; + + if (snprintf(filename, 17, ".uwsgiflock%d", lock_counter) < 0) { + uwsgi_log("unable to create lock %d\n", lock_counter); + } + + int fd = open(filename, O_CREAT|O_RDWR|O_TRUNC); + if (fd < 0) { + uwsgi_error("open()"); + exit(1); + } + + memcpy(lock, &fd, sizeof(int)); +} void uwsgi_lock(void *lock) { - //if (flock((int) *lock, LOCK_EX)) { uwsgi_error("flock()"); } + + int fd; + memcpy(&fd, lock, sizeof(int)); + if (flock(fd, LOCK_EX)) { uwsgi_error("flock()"); } } void uwsgi_unlock(void *lock) { - //if (flock((int) *lock, LOCK_UN)) { uwsgi_error("flock()"); } + int fd; + memcpy(&fd, lock, sizeof(int)); + if (flock(fd, LOCK_UN)) { uwsgi_error("flock()"); } } void uwsgi_rwlock_init(void *lock) { uwsgi_lock_init(lock) ;} diff --git a/master.c b/master.c index eedf5d0..d9d4e63 100644 --- a/master.c +++ b/master.c @@ -245,6 +245,10 @@ void master_loop(char **argv, char **environ) { uh->modifier1 = 99; uh->pktsize = cluster_opt_size - 4; uh->modifier2 = 1; + +#ifdef __BIG_ENDIAN__ + uh->pktsize = uwsgi_swap16(uh->pktsize); +#endif cptrbuf = cluster_opt_buf+4; @@ -593,12 +597,19 @@ void master_loop(char **argv, char **environ) { switch(uwsgi.wsgi_requests[0]->uh.modifier1) { case 95: memset(&nucn, 0, sizeof(struct uwsgi_cluster_node)); + +#ifdef __BIG_ENDIAN__ + uwsgi.wsgi_requests[0]->uh.pktsize = uwsgi_swap16(uwsgi.wsgi_requests[0]->uh.pktsize); +#endif uwsgi_hooked_parse(uwsgi.wsgi_requests[0]->buffer, uwsgi.wsgi_requests[0]->uh.pktsize, manage_cluster_announce, &nucn); if (nucn.name[0] != 0) { uwsgi_cluster_add_node(&nucn, CLUSTER_NODE_DYNAMIC); } break; case 96: +#ifdef __BIG_ENDIAN__ + uwsgi.wsgi_requests[0]->uh.pktsize = uwsgi_swap16(uwsgi.wsgi_requests[0]->uh.pktsize); +#endif uwsgi_log_verbose("%.*s\n", uwsgi.wsgi_requests[0]->uh.pktsize, uwsgi.wsgi_requests[0]->buffer); break; case 98: @@ -614,6 +625,9 @@ void master_loop(char **argv, char **environ) { } break; case 73: +#ifdef __BIG_ENDIAN__ + uwsgi.wsgi_requests[0]->uh.pktsize = uwsgi_swap16(uwsgi.wsgi_requests[0]->uh.pktsize); +#endif uwsgi_log_verbose("[uWSGI cluster %s] new node available: %.*s\n", uwsgi.cluster, uwsgi.wsgi_requests[0]->uh.pktsize, uwsgi.wsgi_requests[0]->buffer); break; } diff --git a/plugins/http/http.c b/plugins/http/http.c index e3e2728..3866a5e 100644 --- a/plugins/http/http.c +++ b/plugins/http/http.c @@ -548,9 +548,10 @@ void http_loop() { continue; } + uhttp_session->timeout = reset_timeout(uhttp_session); + switch(uhttp_session->status) { - uhttp_session->timeout = reset_timeout(uhttp_session); case HTTP_STATUS_RECV: len = recv(uhttp_session->fd, uhttp_session->buffer + uhttp_session->h_pos, UMAX16-uhttp_session->h_pos, 0); @@ -681,6 +682,10 @@ void http_loop() { break; } +#ifdef __BIG_ENDIAN__ + uhttp_session->uh.pktsize = uwsgi_swap16(uhttp_session->uh.pktsize); +#endif + uhttp_session->iov[0].iov_base = &uhttp_session->uh; uhttp_session->iov[0].iov_len = 4; diff --git a/protocol.c b/protocol.c index 7a5665a..45e02c5 100644 --- a/protocol.c +++ b/protocol.c @@ -893,6 +893,9 @@ int uwsgi_string_sendto(int fd, uint8_t modifier1, uint8_t modifier2, struct soc uh->modifier1 = modifier1; uh->pktsize = len; +#ifdef __BIG_ENDIAN__ + uh->pktsize = uwsgi_swap16(uh->pktsize); +#endif uh->modifier2 = modifier2; memcpy(upkt+4, message, len); diff --git a/uwsgi.c b/uwsgi.c index 959797e..9e2aac3 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -1954,10 +1954,12 @@ uwsgi.shared->hooks[UWSGI_MODIFIER_PING] = uwsgi_request_ping; //100 return 1; case LONG_ARGS_CLUSTER: uwsgi.cluster = optarg; + uwsgi.master_process = 1; return 1; case LONG_ARGS_CLUSTER_NODES: uwsgi.cluster = optarg; uwsgi.cluster_nodes = 1; + uwsgi.master_process = 1; return 1; #endif case LONG_ARGS_CHROOT: @@ -2151,7 +2153,11 @@ uwsgi.shared->hooks[UWSGI_MODIFIER_PING] = uwsgi_request_ping; //100 uwsgi.numproc = rl.rlim_max; } else { +#ifdef _SC_NPROCESSORS_ONLN uwsgi.numproc = (sysconf(_SC_NPROCESSORS_ONLN))*2; +#else + uwsgi.numproc = 1; +#endif } } else {