From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Nala Ginrut Newsgroups: gmane.lisp.guile.bugs Subject: bug#27782: mmap for guile Date: Sat, 25 Nov 2017 00:22:14 +0800 Message-ID: References: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="94eb2c061e16aad101055ebcf4cd" X-Trace: blaine.gmane.org 1511540593 31149 195.159.176.226 (24 Nov 2017 16:23:13 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 24 Nov 2017 16:23:13 +0000 (UTC) Cc: 27782@debbugs.gnu.org To: Matt Wette Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Fri Nov 24 17:23:07 2017 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eIGks-0007gD-Us for guile-bugs@m.gmane.org; Fri, 24 Nov 2017 17:23:07 +0100 Original-Received: from localhost ([::1]:50041 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eIGkz-0002zA-Vy for guile-bugs@m.gmane.org; Fri, 24 Nov 2017 11:23:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33331) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eIGkr-0002ws-OE for bug-guile@gnu.org; Fri, 24 Nov 2017 11:23:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eIGko-0000ox-8T for bug-guile@gnu.org; Fri, 24 Nov 2017 11:23:05 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:47476) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eIGko-0000mI-1J for bug-guile@gnu.org; Fri, 24 Nov 2017 11:23:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1eIGkn-0003D3-RH for bug-guile@gnu.org; Fri, 24 Nov 2017 11:23:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Nala Ginrut Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Fri, 24 Nov 2017 16:23:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 27782 X-GNU-PR-Package: guile X-GNU-PR-Keywords: Original-Received: via spool by 27782-submit@debbugs.gnu.org id=B27782.151154054312273 (code B ref 27782); Fri, 24 Nov 2017 16:23:01 +0000 Original-Received: (at 27782) by debbugs.gnu.org; 24 Nov 2017 16:22:23 +0000 Original-Received: from localhost ([127.0.0.1]:56157 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eIGkA-0003Bs-KB for submit@debbugs.gnu.org; Fri, 24 Nov 2017 11:22:23 -0500 Original-Received: from mail-yb0-f176.google.com ([209.85.213.176]:34521) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eIGk8-0003Bg-Uq for 27782@debbugs.gnu.org; Fri, 24 Nov 2017 11:22:21 -0500 Original-Received: by mail-yb0-f176.google.com with SMTP id k40so8430722ybj.1 for <27782@debbugs.gnu.org>; Fri, 24 Nov 2017 08:22:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=V4cNgaurF9cbLgMRZmHUoQM3RX8Y/QYV84MN32xzCsg=; b=JF6Z0JXdPdLp1Q/h0DbzxezfuaVWKxWWL9CNto/+dsXm0bFuF/CveYxUqDZ3tf7fgY xnqvHFplgJhQheWEzgy5s6fQR1ZssK5ZHKKi+j7HQFvF4le8Ihjz98MX/TW3xDEKjegJ K5LwCREhVjOdrPAc7IslTFSLqfyNVX/bzQBrhfnE1ecKih3QwZ5TGlY0rY6QXHyLC02C PbuSryUJcGU7h5VIx8UWOdNMYERNNSWabl0i9X3jEibe/k4TycA3DH19tz5Fu9yF4Q2d YWLXDO8ZbZozqj1NFw0fZp4v5slejLOpwi2MNj2IsG1HuPUQ5nIfevpOncEunobqSX9W 9bLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=V4cNgaurF9cbLgMRZmHUoQM3RX8Y/QYV84MN32xzCsg=; b=rtLFBL53x64mbJSImLw+/zn20sD4aIv9tOQxR1w/pL7zetuPIGxriHZHLWQF1BYAD6 E9/fEXAt5a0R70tcYrv+7sndWUTz0rkBaAT3T1sWTGygWIMFZl4c+6Jq7P6OCPvtLfex LbHQD99PFyd+d/R3/QPXRyCzX7nBYCnv5DuulDHMWp/5u1ggKXjCtOuaX6ndb/XxtK/S hhtiC/+7zt8Fd77qLMrh3kdW3JEZeN6K/rT4tOHg23EgVRoV8vV3rN3huhEtee2K6fzZ 5WTD0vgoN1oW5olEgoV5ZwCpA/Mb80v45EhI79nz+fIyp1OrqHAhy3JazoHTQL33Y8c5 zMtw== X-Gm-Message-State: AJaThX4AoQCqh33kISUfW0lB+POTmort75K0QOcZBpPfEndLIlaUQK4i God0CAlFy5W+ZrSFA9jOY1uErIx9XMhtLiRfIb4= X-Google-Smtp-Source: AGs4zMbCRjNdA9OtECYp6MNvDlHrXJtASZYja55UYJ+XS9LvRKi2ce+vlQkPhvTVh6ZWUDb/r5aTwoQ+7ASamgUAXTk= X-Received: by 10.37.216.137 with SMTP id p131mr17613971ybg.397.1511540535249; Fri, 24 Nov 2017 08:22:15 -0800 (PST) Original-Received: by 10.37.45.94 with HTTP; Fri, 24 Nov 2017 08:22:14 -0800 (PST) Original-Received: by 10.37.45.94 with HTTP; Fri, 24 Nov 2017 08:22:14 -0800 (PST) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Original-Sender: "bug-guile" Xref: news.gmane.org gmane.lisp.guile.bugs:8912 Archived-At: --94eb2c061e16aad101055ebcf4cd Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the work! Could you please add MAP_POPULATE too? 2017=E5=B9=B411=E6=9C=8824=E6=97=A5 =E4=B8=8B=E5=8D=8811:55=EF=BC=8C"Matt W= ette" =E5=86=99=E9=81=93=EF=BC=9A > > > > > > I did a little more on this. Here is the latest. > It provides mmap (not searched) and mmap/search (searched for pointers to > GC). > > > --- libguile/filesys.c.orig 2017-03-01 10:54:31.000000000 -0800 > +++ libguile/filesys.c 2017-10-28 10:05:10.000000000 -0700 > @@ -1828,9 +1828,14 @@ > > > > +#include "mman.c" > + > void > scm_init_filesys () > { > +#ifdef HAVE_SYS_MMAN_H > + init_mman(); > +#endif > #ifdef HAVE_POSIX > scm_tc16_dir =3D scm_make_smob_type ("directory", 0); > scm_set_smob_free (scm_tc16_dir, scm_dir_free); > --- libguile/mman.c.orig 2017-10-28 10:05:10.000000000 -0700 > +++ libguile/mman.c 2017-11-04 09:23:35.000000000 -0700 > @@ -0,0 +1,199 @@ > +// mman.c - v171104a > +#ifdef HAVE_CONFIG_H > +# include > +#endif > + > +#ifdef HAVE_SYS_MMAN_H > +# include > +# include > +#endif > + > +#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MAP_ANONYMOUS) > + > +#include "libguile/_scm.h" > +#include "libguile/smob.h" > +#include "libguile/fdes-finalizers.h" > +#include "libguile/feature.h" > + > +SCM_API SCM scm_mmap_search (SCM addr, SCM len, SCM prot, SCM flags, SCM > fd, > + SCM offset); > +SCM_API SCM scm_mmap (SCM addr, SCM len, SCM prot, SCM flags, SCM fd, > + SCM offset); > +SCM_API SCM scm_munmap (SCM bvec); > +void init_mman(void); > +static void mmap_finalizer (void *ptr, void *data); > + > +SCM_DEFINE (scm_mmap_search, "mmap/search", 2, 4, 0, > + (SCM addr, SCM len, SCM prot, SCM flags, SCM fd, SCM offset)= , > + "mmap addr len [prot [flags [fd [offset]]]]" > + "See the unix man page for mmap. Returns a bytevector." > + "Note that the region allocated will be searched by the > garbage" > + "collector for pointers. \n" > + " Defaults:\n" > + " PROT (logior PROT_READ PROT_WRITE)\n" > + " FLAGS (logior MAP_ANON MAP_PRIVATE)\n" > + " FD -1\n" > + " OFFSET 0\n" > + "@example\n(define reg (mmap/search %null-pointer #x1000)\n" > + "@end example" > + ) > +#define FUNC_NAME s_scm_mmap_search > +{ > + void *c_mem, *c_addr; > + size_t c_len; > + int c_prot, c_flags, c_fd; > + scm_t_off c_offset; > + SCM pointer, bvec; > + > + if (SCM_POINTER_P (addr)) > + c_addr =3D SCM_POINTER_VALUE (addr); > + else if (scm_is_integer (addr)) > + c_addr =3D (void*) scm_to_uintptr_t (addr); > + else > + SCM_MISC_ERROR("bad addr", addr); > + > + c_len =3D scm_to_size_t (len); > + > + if (SCM_UNBNDP (prot)) > + c_prot =3D PROT_READ | PROT_WRITE; > + else > + c_prot =3D scm_to_int (prot); > + > + if (SCM_UNBNDP (flags)) > + c_flags =3D MAP_ANON | MAP_PRIVATE; > + else > + c_flags =3D scm_to_int (flags); > + > + if (SCM_UNBNDP (fd)) > + c_fd =3D -1; > + else > + c_fd =3D scm_to_int (fd); > + > + if (SCM_UNBNDP (fd)) > + c_offset =3D 0; > + else > + c_offset =3D scm_to_off_t (offset); > + > + c_mem =3D mmap(c_addr, c_len, c_prot, c_flags, c_fd, c_offset); > + if (c_mem =3D=3D MAP_FAILED) > + SCM_SYSERROR; /* errno set */ > + > + pointer =3D scm_cell (scm_tc7_pointer, (scm_t_bits) c_mem); > + bvec =3D scm_c_take_typed_bytevector((signed char *) c_mem + c_offset, > c_len, > + SCM_ARRAY_ELEMENT_TYPE_VU8, pointer)= ; > + /* if sizeof(void*) < sizeof(size_t) we are in trouble: */ > + scm_i_set_finalizer (SCM2PTR (bvec), mmap_finalizer, (void*) c_len); > + return bvec; > +} > +#undef FUNC_NAME > + > +SCM_DEFINE (scm_mmap, "mmap", 2, 4, 0, > + (SCM addr, SCM len, SCM prot, SCM flags, SCM fd, SCM offset)= , > + "mmap addr len [prot [flags [fd [offset]]]]" > + "See the man page. Returns a bytevector." > + "Note that the region returned by mmap will NOT be searched " > + "by the garbage collector for pointers.\n" > + "Defaults:\n" > + " PROT (logior PROT_READ PROT_WRITE)\n" > + " FLAGS (logior MAP_ANON MAP_PRIVATE)\n" > + " FD -1\n" > + " OFFSET 0\n" > + "@example\n" > + "(define bvec-1MB (mmap 0 #x100000)\n" > + "@end example" > + ) > +#define FUNC_NAME s_scm_mmap > +{ > + SCM bvec; > + void *c_mem; > + size_t c_len; > + > + bvec =3D scm_mmap_search(addr, len, prot, flags, fd, offset); > + c_mem =3D SCM_BYTEVECTOR_CONTENTS(bvec); > + c_len =3D SCM_BYTEVECTOR_LENGTH(bvec); > + > + /* tell GC not to scan for pointers */ > + GC_exclude_static_roots(c_mem, (char*) c_mem + c_len); > + > + return bvec; > +} > +static void > +mmap_finalizer (void *ptr, void *data) > +{ > + void *c_addr; > + intptr_t c_len; > + int res; > + > + c_addr =3D (void *) SCM_POINTER_VALUE (SCM_PACK_POINTER (ptr)); > + c_len =3D (intptr_t) data; > + res =3D munmap(c_addr, c_len); > + if (res !=3D 0) SCM_SYSERROR; > +} > +#undef FUNC_NAME > + > +SCM_DEFINE (scm_munmap, "munmap", 1, 0, 0, > + (SCM bvec), > + "See the man page. Given bytevector unmap." > + ) > +#define FUNC_NAME s_scm_munmap > +{ > + void *c_addr; > + size_t c_len; > + int c_res; > + > + SCM_VALIDATE_BYTEVECTOR (1, bvec); > + > + c_addr =3D (void *) SCM_BYTEVECTOR_CONTENTS (bvec); > + c_len =3D SCM_BYTEVECTOR_LENGTH (bvec); > + > + c_res =3D munmap(c_addr, c_len); > + if (c_res =3D=3D -1) > + SCM_SYSERROR; /* errno set */ > + > + // TODO: clean up bytevector > + return SCM_UNSPECIFIED; > +} > +#undef FUNC_NAME > + > +void init_mman(void) { > +#ifdef PROT_NONE > + scm_c_define ("PROT_NONE", scm_from_int (PROT_NONE)); > +#endif > +#ifdef PROT_ > + scm_c_define ("PROT_READ", scm_from_int (PROT_READ)); > +#endif > +#ifdef PROT_ > + scm_c_define ("PROT_WRITE", scm_from_int (PROT_WRITE)); > +#endif > +#ifdef PROT_ > + scm_c_define ("PROT_EXEC", scm_from_int (PROT_EXEC)); > +#endif > + > +#ifdef MAP_ANONYMOUS > + scm_c_define ("MAP_ANONYMOUS", scm_from_int (MAP_ANONYMOUS)); > +#endif > +#ifdef MAP_ANON > + scm_c_define ("MAP_ANON", scm_from_int (MAP_ANON)); > +#endif > +#ifdef MAP_FILE > + scm_c_define ("MAP_FILE", scm_from_int (MAP_FILE)); > +#endif > +#ifdef MAP_FIXED > + scm_c_define ("MAP_FIXED", scm_from_int (MAP_FIXED)); > +#endif > +#ifdef MAP_HASSEMAPHORE > + scm_c_define ("MAP_HASSEMAPHORE", scm_from_int (MAP_HASSEMAPHORE)); > +#endif > +#ifdef MAP_PRIVATE > + scm_c_define ("MAP_PRIVATE", scm_from_int (MAP_PRIVATE)); > +#endif > +#ifdef MAP_SHARED > + scm_c_define ("MAP_SHARED", scm_from_int (MAP_SHARED)); > +#endif > +#ifdef MAP_NOCACHE > + scm_c_define ("MAP_NOCACHE", scm_from_int (MAP_NOCACHE)); > +#endif > + scm_c_define ("PAGE_SIZE", scm_from_int (getpagesize())); > +} > + > +#endif /* HAVE_SYS_MMAN_H */ > > > > > --94eb2c061e16aad101055ebcf4cd Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks for the work! Could you please add=C2=A0MAP_POPULATE too?

2017=E5=B9=B411=E6=9C=8824=E6=97=A5 =E4=B8=8B=E5=8D= =8811:55=EF=BC=8C"Matt Wette" <matt.wette@gmail.com>=E5=86=99=E9=81=93=EF=BC=9A





I did a little more on this.=C2=A0 Here is the latest.
It provides mmap (not searched) and mmap/search (searched for pointers to G= C).


--- libguile/filesys.c.orig=C2=A0 =C2=A0 =C2=A02017-03-01 10:54:31.00000000= 0 -0800
+++ libguile/filesys.c=C2=A0 2017-10-28 10:05:10.000000000 -0700
@@ -1828,9 +1828,14 @@



+#include "mman.c"
+
=C2=A0void
=C2=A0scm_init_filesys ()
=C2=A0{
+#ifdef HAVE_SYS_MMAN_H
+=C2=A0 init_mman();
+#endif
=C2=A0#ifdef HAVE_POSIX
=C2=A0 =C2=A0scm_tc16_dir =3D scm_make_smob_type ("directory", 0)= ;
=C2=A0 =C2=A0scm_set_smob_free (scm_tc16_dir, scm_dir_free);
--- libguile/mman.c.orig=C2=A0 =C2=A0 =C2=A0 =C2=A0 2017-10-28 10:05:10.000= 000000 -0700
+++ libguile/mman.c=C2=A0 =C2=A0 =C2=A02017-11-04 09:23:35.000000000 -0700<= br> @@ -0,0 +1,199 @@
+// mman.c - v171104a
+#ifdef HAVE_CONFIG_H
+#=C2=A0 include <config.h>
+#endif
+
+#ifdef HAVE_SYS_MMAN_H
+#=C2=A0 include <sys/mman.h>
+#=C2=A0 include <errno.h>
+#endif
+
+#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MAP_ANONYMOUS)
+
+#include "libguile/_scm.h"
+#include "libguile/smob.h"
+#include "libguile/fdes-finalizers.h"
+#include "libguile/feature.h"
+
+SCM_API SCM scm_mmap_search (SCM addr, SCM len, SCM prot, SCM flags, SCM f= d,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 SCM offset);
+SCM_API SCM scm_mmap (SCM addr, SCM len, SCM prot, SCM flags, SCM fd,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0SCM offset);
+SCM_API SCM scm_munmap (SCM bvec);
+void init_mman(void);
+static void mmap_finalizer (void *ptr, void *data);
+
+SCM_DEFINE (scm_mmap_search, "mmap/search", 2, 4, 0,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SCM addr, SCM len, SCM prot, SC= M flags, SCM fd, SCM offset),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"mmap addr len [prot [flags = [fd [offset]]]]"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"See the unix man page for m= map.=C2=A0 Returns a bytevector."
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"Note that the region alloca= ted will be searched by the garbage"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"collector for pointers.=C2= =A0 \n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0" Defaults:\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 PROT=C2=A0 =C2=A0(lo= gior PROT_READ PROT_WRITE)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 FLAGS=C2=A0 (logior = MAP_ANON MAP_PRIVATE)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 FD=C2=A0 =C2=A0 =C2= =A0-1\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 OFFSET 0\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"@example\n(define reg (mmap= /search %null-pointer #x1000)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"@end example"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0)
+#define FUNC_NAME s_scm_mmap_search
+{
+=C2=A0 void *c_mem, *c_addr;
+=C2=A0 size_t c_len;
+=C2=A0 int c_prot, c_flags, c_fd;
+=C2=A0 scm_t_off c_offset;
+=C2=A0 SCM pointer, bvec;
+
+=C2=A0 if (SCM_POINTER_P (addr))
+=C2=A0 =C2=A0 c_addr =3D SCM_POINTER_VALUE (addr);
+=C2=A0 else if (scm_is_integer (addr))
+=C2=A0 =C2=A0 c_addr =3D (void*) scm_to_uintptr_t (addr);
+=C2=A0 else
+=C2=A0 =C2=A0 SCM_MISC_ERROR("bad addr", addr);
+
+=C2=A0 c_len =3D scm_to_size_t (len);
+
+=C2=A0 if (SCM_UNBNDP (prot))
+=C2=A0 =C2=A0 c_prot =3D PROT_READ | PROT_WRITE;
+=C2=A0 else
+=C2=A0 =C2=A0 c_prot =3D scm_to_int (prot);
+
+=C2=A0 if (SCM_UNBNDP (flags))
+=C2=A0 =C2=A0 c_flags =3D MAP_ANON | MAP_PRIVATE;
+=C2=A0 else
+=C2=A0 =C2=A0 c_flags =3D scm_to_int (flags);
+
+=C2=A0 if (SCM_UNBNDP (fd))
+=C2=A0 =C2=A0 c_fd =3D -1;
+=C2=A0 else
+=C2=A0 =C2=A0 c_fd =3D scm_to_int (fd);
+
+=C2=A0 if (SCM_UNBNDP (fd))
+=C2=A0 =C2=A0 c_offset =3D 0;
+=C2=A0 else
+=C2=A0 =C2=A0 c_offset =3D scm_to_off_t (offset);
+
+=C2=A0 c_mem =3D mmap(c_addr, c_len, c_prot, c_flags, c_fd, c_offset);
+=C2=A0 if (c_mem =3D=3D MAP_FAILED)
+=C2=A0 =C2=A0 SCM_SYSERROR;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* errno set */
+
+=C2=A0 pointer =3D scm_cell (scm_tc7_pointer, (scm_t_bits) c_mem);
+=C2=A0 bvec =3D scm_c_take_typed_bytevector((signed char *) c_mem + c= _offset, c_len,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 SCM_ARRAY_ELEMENT_TYPE= _VU8, pointer);
+=C2=A0 /* if sizeof(void*) < sizeof(size_t) we are in trouble: */
+=C2=A0 scm_i_set_finalizer (SCM2PTR (bvec), mmap_finalizer, (void*) c_len)= ;
+=C2=A0 return bvec;
+}
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_mmap, "mmap", 2, 4, 0,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SCM addr, SCM len, SCM prot, SC= M flags, SCM fd, SCM offset),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"mmap addr len [prot [flags = [fd [offset]]]]"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"See the man page.=C2=A0 Ret= urns a bytevector."
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"Note that the region return= ed by mmap will NOT be searched "
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"by the garbage collector fo= r pointers.\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"Defaults:\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 PROT=C2=A0 =C2=A0(lo= gior PROT_READ PROT_WRITE)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 FLAGS=C2=A0 (logior = MAP_ANON MAP_PRIVATE)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 FD=C2=A0 =C2=A0 =C2= =A0-1\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"=C2=A0 OFFSET 0\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"@example\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"(define bvec-1MB (mmap 0 #x= 100000)\n"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"@end example"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0)
+#define FUNC_NAME s_scm_mmap
+{
+=C2=A0 SCM bvec;
+=C2=A0 void *c_mem;
+=C2=A0 size_t c_len;
+
+=C2=A0 bvec =3D scm_mmap_search(addr, len, prot, flags, fd, offset);
+=C2=A0 c_mem =3D SCM_BYTEVECTOR_CONTENTS(bvec);
+=C2=A0 c_len =3D SCM_BYTEVECTOR_LENGTH(bvec);
+
+=C2=A0 /* tell GC not to scan for pointers */
+=C2=A0 GC_exclude_static_roots(c_mem, (char*) c_mem + c_len);
+
+=C2=A0 return bvec;
+}
+static void
+mmap_finalizer (void *ptr, void *data)
+{
+=C2=A0 void *c_addr;
+=C2=A0 intptr_t c_len;
+=C2=A0 int res;
+
+=C2=A0 c_addr =3D (void *) SCM_POINTER_VALUE (SCM_PACK_POINTER (ptr));
+=C2=A0 c_len =3D (intptr_t) data;
+=C2=A0 res =3D munmap(c_addr, c_len);
+=C2=A0 if (res !=3D 0) SCM_SYSERROR;
+}
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_munmap, "munmap", 1, 0, 0,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SCM bvec),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"See the man page. Given byt= evector unmap."
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0)
+#define FUNC_NAME s_scm_munmap
+{
+=C2=A0 void *c_addr;
+=C2=A0 size_t c_len;
+=C2=A0 int c_res;
+
+=C2=A0 SCM_VALIDATE_BYTEVECTOR (1, bvec);
+
+=C2=A0 c_addr =3D (void *) SCM_BYTEVECTOR_CONTENTS (bvec);
+=C2=A0 c_len =3D SCM_BYTEVECTOR_LENGTH (bvec);
+
+=C2=A0 c_res =3D munmap(c_addr, c_len);
+=C2=A0 if (c_res =3D=3D -1)
+=C2=A0 =C2=A0 SCM_SYSERROR;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* errno set */
+
+=C2=A0 // TODO: clean up bytevector
+=C2=A0 return SCM_UNSPECIFIED;
+}
+#undef FUNC_NAME
+
+void init_mman(void) {
+#ifdef PROT_NONE
+=C2=A0 scm_c_define ("PROT_NONE", scm_from_int (PROT_NONE));
+#endif
+#ifdef PROT_
+=C2=A0 scm_c_define ("PROT_READ", scm_from_int (PROT_READ));
+#endif
+#ifdef PROT_
+=C2=A0 scm_c_define ("PROT_WRITE", scm_from_int (PROT_WRITE)); +#endif
+#ifdef PROT_
+=C2=A0 scm_c_define ("PROT_EXEC", scm_from_int (PROT_EXEC));
+#endif
+
+#ifdef MAP_ANONYMOUS
+=C2=A0 scm_c_define ("MAP_ANONYMOUS", scm_from_int (MAP_ANONYMOU= S));
+#endif
+#ifdef MAP_ANON
+=C2=A0 scm_c_define ("MAP_ANON", scm_from_int (MAP_ANON));
+#endif
+#ifdef MAP_FILE
+=C2=A0 scm_c_define ("MAP_FILE", scm_from_int (MAP_FILE));
+#endif
+#ifdef MAP_FIXED
+=C2=A0 scm_c_define ("MAP_FIXED", scm_from_int (MAP_FIXED));
+#endif
+#ifdef MAP_HASSEMAPHORE
+=C2=A0 scm_c_define ("MAP_HASSEMAPHORE", scm_from_int (MAP_HASSE= MAPHORE));
+#endif
+#ifdef MAP_PRIVATE
+=C2=A0 scm_c_define ("MAP_PRIVATE", scm_from_int (MAP_PRIVATE));=
+#endif
+#ifdef MAP_SHARED
+=C2=A0 scm_c_define ("MAP_SHARED", scm_from_int (MAP_SHARED)); +#endif
+#ifdef MAP_NOCACHE
+=C2=A0 scm_c_define ("MAP_NOCACHE", scm_from_int (MAP_NOCACHE));=
+#endif
+=C2=A0 scm_c_define ("PAGE_SIZE", scm_from_int (getpagesize()));=
+}
+
+#endif /* HAVE_SYS_MMAN_H */




--94eb2c061e16aad101055ebcf4cd--