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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/ffisub.urp	Sat Sep 12 17:11:33 2015 -0400
@@ -0,0 +1,3 @@
+ffi ffisub
+
+empty
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/ffisub.urs	Sat Sep 12 17:11:33 2015 -0400
@@ -0,0 +1,5 @@
+structure S : sig
+  type t
+end
+
+val x : S.t