Mercurial > urweb
changeset 2249:c05851bf7861
Merge.
author | Ziv Scully <ziv@mit.edu> |
---|---|
date | Sat, 12 Sep 2015 17:11:33 -0400 |
parents | e09c3dc102ef 010ce27228f1 |
children | c275bbc41194 |
files | src/c/urweb.c src/settings.sml |
diffstat | 12 files changed, 81 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGELOG Sat Aug 15 23:08:37 2015 -0700 +++ b/CHANGELOG Sat Sep 12 17:11:33 2015 -0400 @@ -1,3 +1,14 @@ +======== +20150819 +======== + +- Allow mouse and key events for <body> +- Add HTML 'align' attribute +- Add onChange handler to radioOption +- New literal [_LOC_] that is replaced with textual information on location in source file +- Add a simple 'make test' target +- Bug fixes and documentation improvements + ======== 20150520 ========
--- a/Makefile.am Sat Aug 15 23:08:37 2015 -0700 +++ b/Makefile.am Sat Sep 12 17:11:33 2015 -0400 @@ -119,7 +119,7 @@ TESTPID = /tmp/urweb.pid test: - urweb -dbms sqlite -db $(TESTDB) -demo /Demo demo + bin/urweb -boot -noEmacs -dbms sqlite -db $(TESTDB) -demo /Demo demo rm -f $(TESTDB) sqlite3 $(TESTDB) < demo/demo.sql demo/demo.exe & echo $$! > $(TESTPID)
--- a/configure.ac Sat Aug 15 23:08:37 2015 -0700 +++ b/configure.ac Sat Sep 12 17:11:33 2015 -0400 @@ -1,4 +1,4 @@ -AC_INIT([urweb], [20150520]) +AC_INIT([urweb], [20150819]) WORKING_VERSION=1 AC_USE_SYSTEM_EXTENSIONS
--- a/doc/intro.ur Sat Aug 15 23:08:37 2015 -0700 +++ b/doc/intro.ur Sat Sep 12 17:11:33 2015 -0400 @@ -58,12 +58,15 @@ fact 5 (* end *) -fun isEven n = n = 0 || isOdd (n - 1) -and isOdd n = n = 1 || isEven (n - 1) +fun isEven n = n = 0 || (n > 1 && isOdd (n - 1)) +and isOdd n = n = 1 || (n > 1 && isEven (n - 1)) (* begin eval *) isEven 32 (* end *) +(* begin eval *) +isEven 31 +(* end *) (* Of course we have anonymous functions, too. *)
--- a/doc/manual.tex Sat Aug 15 23:08:37 2015 -0700 +++ b/doc/manual.tex Sat Sep 12 17:11:33 2015 -0400 @@ -2314,7 +2314,7 @@ &&& (E) & \textrm{explicit precedence} \\ \textrm{Nullary operators} & n &::=& \mt{CURRENT\_TIMESTAMP} \\ \textrm{Unary operators} & u &::=& \mt{NOT} \\ - \textrm{Binary operators} & b &::=& \mt{AND} \mid \mt{OR} \mid = \mid \neq \mid < \mid \leq \mid > \mid \geq \\ + \textrm{Binary operators} & b &::=& \mt{AND} \mid \mt{OR} \mid = \mid \neq \mid < \mid \leq \mid > \mid \geq \mid \mt{LIKE} \\ \textrm{Aggregate functions} & a &::=& \mt{COUNT} \mid \mt{AVG} \mid \mt{SUM} \mid \mt{MIN} \mid \mt{MAX} \\ \textrm{Directions} & o &::=& \mt{ASC} \mid \mt{DESC} \mid \{e\} \\ \textrm{SQL integer} & N &::=& n \mid \{e\} \\
--- a/src/c/http.c Sat Aug 15 23:08:37 2015 -0700 +++ b/src/c/http.c Sat Sep 12 17:11:33 2015 -0400 @@ -314,7 +314,7 @@ } static void help(char *cmd) { - printf("Usage: %s [-p <port>] [-a <IP address>] [-t <thread count>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe -T option sets socket recv timeout (0 disables timeout, default is 5 sec)", cmd); + printf("Usage: %s [-p <port>] [-a <IP address>] [-t <thread count>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe '-T' option sets socket recv timeout (0 disables timeout, default is 5 sec).\n", cmd); } static void sigint(int signum) {
--- a/src/c/openssl.c Sat Aug 15 23:08:37 2015 -0700 +++ b/src/c/openssl.c Sat Sep 12 17:11:33 2015 -0400 @@ -1,5 +1,6 @@ #include "config.h" +#include <assert.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> @@ -7,12 +8,17 @@ #include <fcntl.h> #include <stdio.h> #include <string.h> +#include <pthread.h> +#include <openssl/crypto.h> #include <openssl/sha.h> #include <openssl/rand.h> #define PASSSIZE 4 +// OpenSSL locks array. See threads(3SSL). +static pthread_mutex_t *openssl_locks; + int uw_hash_blocksize = 32; static int password[PASSSIZE]; @@ -27,7 +33,41 @@ } } +// OpenSSL callbacks +static void thread_id(CRYPTO_THREADID *const result) { + CRYPTO_THREADID_set_numeric(result, pthread_self()); +} +static void lock_or_unlock(const int mode, const int type, const char *file, + const int line) { + pthread_mutex_t *const lock = &openssl_locks[type]; + if (mode & CRYPTO_LOCK) { + if (pthread_mutex_lock(lock)) { + fprintf(stderr, "Can't take lock at %s:%d\n", file, line); + exit(1); + } + } else { + if (pthread_mutex_unlock(lock)) { + fprintf(stderr, "Can't release lock at %s:%d\n", file, line); + exit(1); + } + } +} + void uw_init_crypto() { + int i; + // Set up OpenSSL. + assert(openssl_locks == NULL); + openssl_locks = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); + if (!openssl_locks) { + perror("malloc"); + exit(1); + } + for (i = 0; i < CRYPTO_num_locks(); ++i) { + pthread_mutex_init(&(openssl_locks[i]), NULL); + } + CRYPTO_THREADID_set_callback(thread_id); + CRYPTO_set_locking_callback(lock_or_unlock); + // Prepare signatures. if (uw_sig_file) { int fd;
--- a/src/c/urweb.c Sat Aug 15 23:08:37 2015 -0700 +++ b/src/c/urweb.c Sat Sep 12 17:11:33 2015 -0400 @@ -169,13 +169,8 @@ void uw_free_client_data(void *); void uw_copy_client_data(void *dst, void *src); -static pthread_mutex_t rand_mutex = PTHREAD_MUTEX_INITIALIZER; - static uw_Basis_int my_rand() { - pthread_mutex_lock(&rand_mutex); int ret, r = RAND_bytes((unsigned char *)&ret, sizeof ret); - pthread_mutex_unlock(&rand_mutex); - if (r) return abs(ret); else
--- a/src/elaborate.sml Sat Aug 15 23:08:37 2015 -0700 +++ b/src/elaborate.sml Sat Sep 12 17:11:33 2015 -0400 @@ -4123,6 +4123,18 @@ val dNew = (L'.DFfiStr (x, n, sgn'), loc) in + case #1 sgn' of + L'.SgnConst sgis => + (case List.find (fn (L'.SgiConAbs _, _) => false + | (L'.SgiCon _, _) => false + | (L'.SgiDatatype _, _) => false + | (L'.SgiVal _, _) => false + | _ => true) sgis of + NONE => () + | SOME sgi => (ErrorMsg.errorAt loc "Disallowed signature item for FFI module"; + epreface ("item", p_sgn_item env sgi))) + | _ => raise Fail "FFI signature isn't SgnConst"; + Option.map (fn tm => ModDb.insert (dNew, tm)) tmo; ([dNew], (env', denv, enD gs' @ gs)) end)
--- a/src/settings.sml Sat Aug 15 23:08:37 2015 -0700 +++ b/src/settings.sml Sat Sep 12 17:11:33 2015 -0400 @@ -887,7 +887,7 @@ if path' = path then () else - ErrorMsg.error ("Two different files requested for URI " ^ Uri) + ErrorMsg.error ("Two different files requested for URI " ^ Uri ^ " ( " ^ path' ^ " vs. " ^ path ^ ")") | NONE => let val inf = BinIO.openIn path