diff options
-rw-r--r-- | CHANGELOG | 8 | ||||
-rw-r--r-- | Makefile.in | 2 | ||||
-rw-r--r-- | doc/manual.tex | 8 | ||||
-rw-r--r-- | include/types.h | 1 | ||||
-rw-r--r-- | src/c/memmem.c | 83 | ||||
-rw-r--r-- | src/compiler.sml | 5 |
6 files changed, 104 insertions, 3 deletions
@@ -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 |