aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-08-25 17:33:13 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-08-25 17:33:13 -0400
commit87777778aeaee3e1de767499f86bc22789118a69 (patch)
tree0c17c4e2488fadc7daa109118e623a4871c9bdb8
parentf9d6e7f4d4e5f1c01fd10bf82232a938b930147f (diff)
New release
-rw-r--r--CHANGELOG8
-rw-r--r--Makefile.in2
-rw-r--r--doc/manual.tex8
-rw-r--r--include/types.h1
-rw-r--r--src/c/memmem.c83
-rw-r--r--src/compiler.sml5
6 files changed, 104 insertions, 3 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 5eeecef8..c67676f4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,12 @@
========
+20090825
+========
+
+- Many bug fixes
+- Remote procedure calls must be marked with the new 'rpc' function.
+- Some tweaks to enable usage on OSX (suggested by Paul Snively)
+
+========
20090718
========
diff --git a/Makefile.in b/Makefile.in
index 1aca9590..0d8b998a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -14,7 +14,7 @@ all: smlnj mlton c
smlnj: src/urweb.cm
mlton: bin/urweb
-OBJS := urweb request queue http cgi fastcgi
+OBJS := urweb request queue http cgi fastcgi memmem
c: $(OBJS:%=lib/c/%.o)
clean:
diff --git a/doc/manual.tex b/doc/manual.tex
index cb3ce586..f1f9c967 100644
--- a/doc/manual.tex
+++ b/doc/manual.tex
@@ -1795,6 +1795,14 @@ $$\begin{array}{l}
Transactions can be run on the client by including them in attributes like the $\mt{Onclick}$ attribute of $\mt{button}$, and GUI widgets like $\mt{ctextbox}$ have $\mt{Source}$ attributes that can be used to connect them to sources, so that their values can be read by code running because of, e.g., an $\mt{Onclick}$ event.
+\subsubsection{Remote Procedure Calls}
+
+Any function call may be made a client-to-server ``remote procedure call'' if the function being called needs no features that are only available to client code. To make a function call an RPC, pass that function call as the argument to $\mt{Basis.rpc}$:
+
+$$\begin{array}{l}
+ \mt{val} \; \mt{rpc} : \mt{t} ::: \mt{Type} \to \mt{transaction} \; \mt{t} \to \mt{transaction} \; \mt{t}
+\end{array}$$
+
\subsubsection{Asynchronous Message-Passing}
To support asynchronous, ``server push'' delivery of messages to clients, any client that might need to receive an asynchronous message is assigned a unique ID. These IDs may be retrieved both on the client and on the server, during execution of code related to a client.
diff --git a/include/types.h b/include/types.h
index 062888af..19eae5ad 100644
--- a/include/types.h
+++ b/include/types.h
@@ -2,6 +2,7 @@
#define URWEB_TYPES_H
#include <time.h>
+#include <unistd.h>
typedef long long uw_Basis_int;
typedef double uw_Basis_float;
diff --git a/src/c/memmem.c b/src/c/memmem.c
new file mode 100644
index 00000000..e0687a28
--- /dev/null
+++ b/src/c/memmem.c
@@ -0,0 +1,83 @@
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD$");
+#endif /* LIBC_SCCS and not lint */
+
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+#include <assert.h>
+#include <string.h>
+#else
+#include <lib/libkern/libkern.h>
+#define _DIAGASSERT(x) (void)0
+#define NULL ((char *)0)
+#endif
+
+/*
+ * memmem() returns the location of the first occurence of data
+ * pattern b2 of size len2 in memory block b1 of size len1 or
+ * NULL if none is found.
+ */
+void *
+memmem(const void *b1, const void *b2, size_t len1, size_t len2)
+{
+ /* Initialize search pointer */
+ char *sp = (char *) b1;
+
+ /* Initialize pattern pointer */
+ char *pp = (char *) b2;
+
+ /* Intialize end of search address space pointer */
+ char *eos = sp + len1 - len2;
+
+ /* Sanity check */
+ if(!(b1 && b2 && len1 && len2))
+ return NULL;
+
+ while (sp <= eos) {
+ if (*sp == *pp)
+ if (memcmp(sp, pp, len2) == 0)
+ return sp;
+
+ sp++;
+ }
+
+ return NULL;
+}
diff --git a/src/compiler.sml b/src/compiler.sml
index c99c0eeb..b7550fed 100644
--- a/src/compiler.sml
+++ b/src/compiler.sml
@@ -901,11 +901,12 @@ fun compileC {cname, oname, ename, libs, profile, debug, link = link'} =
let
val proto = Settings.currentProtocol ()
val urweb_o = clibFile "urweb.o"
+ val memmem_o = clibFile "memmem.o"
val compile = "gcc " ^ Config.gccArgs ^ " -Wstrict-prototypes -Werror -O3 -I " ^ Config.includ
^ " -c " ^ cname ^ " -o " ^ oname
- val link = "gcc -Werror -O3 -lm -lmhash -pthread " ^ libs ^ " " ^ urweb_o ^ " " ^ oname
- ^ " " ^ #link proto ^ " -o " ^ ename
+ val link = "gcc -Werror -O3 -lm -lmhash -pthread " ^ Config.gccArgs ^ " " ^ libs ^ " " ^ urweb_o ^ " " ^ oname
+ ^ " " ^ memmem_o ^ " " ^ #link proto ^ " -o " ^ ename
val (compile, link) =
if profile then