From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Matt Wette Newsgroups: gmane.lisp.guile.bugs Subject: bug#27782: mmap for guile 2.2.2 Date: Sat, 28 Oct 2017 08:25:27 -0700 Message-ID: <68E9A19E-CC14-4FEF-96C3-4FCB6F6AD74A@gmail.com> References: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Trace: blaine.gmane.org 1509204379 19071 195.159.176.226 (28 Oct 2017 15:26:19 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 28 Oct 2017 15:26:19 +0000 (UTC) To: 27782@debbugs.gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Sat Oct 28 17:26:14 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 1e8Szw-0003pz-M1 for guile-bugs@m.gmane.org; Sat, 28 Oct 2017 17:26:08 +0200 Original-Received: from localhost ([::1]:33112 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e8T03-0001t0-RK for guile-bugs@m.gmane.org; Sat, 28 Oct 2017 11:26:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:52875) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e8Szw-0001sS-V5 for bug-guile@gnu.org; Sat, 28 Oct 2017 11:26:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e8Szs-00019z-1G for bug-guile@gnu.org; Sat, 28 Oct 2017 11:26:08 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:58907) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e8Szr-00019c-Te for bug-guile@gnu.org; Sat, 28 Oct 2017 11:26:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1e8Szq-00076n-Ds for bug-guile@gnu.org; Sat, 28 Oct 2017 11:26:02 -0400 X-Loop: help-debbugs@gnu.org In-Reply-To: Resent-From: Matt Wette Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Sat, 28 Oct 2017 15:26:02 +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.150920433727291 (code B ref 27782); Sat, 28 Oct 2017 15:26:02 +0000 Original-Received: (at 27782) by debbugs.gnu.org; 28 Oct 2017 15:25:37 +0000 Original-Received: from localhost ([127.0.0.1]:39355 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e8SzR-000767-GV for submit@debbugs.gnu.org; Sat, 28 Oct 2017 11:25:37 -0400 Original-Received: from mail-pf0-f170.google.com ([209.85.192.170]:48109) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e8SzQ-00075u-AA for 27782@debbugs.gnu.org; Sat, 28 Oct 2017 11:25:36 -0400 Original-Received: by mail-pf0-f170.google.com with SMTP id z11so7131267pfk.4 for <27782@debbugs.gnu.org>; Sat, 28 Oct 2017 08:25:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=cVZJG3tyGqFNaJMiho1SoCxe3qumfUS0KPdbm7l6hL8=; b=DqHxEKPan31ItFHmd9mLSTFXTLx/YefHGQzo2oztsb6K8+TiVEWmnaSJbKBRF4R/L0 7v+thzNbUj1vcGNI776HHtF13UR2NbKD2wQoiHA9fqQDe/K8EYPYz0qQyxXgR6tmb2c6 uTREHpE51OeSkI8VDqlVfRnpbJkV+6YtNzAr3OJchMxhU2PQvBL4jC0TOmGsdCOMBZ7r moRQtrJGF9x+7MvlQ6LUmUFUjJUqM3k0PRbAyfXoUyqIc5VRvEVYglZhV65Qbs6cjkJQ de5goxscS8A440YBu5CsxLsaSkwJfY0IqLjVkfb6ODs2TOu3jLyIyOMlQ8QcKG1tWVpn lvqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:content-transfer-encoding:mime-version :subject:message-id:date:to; bh=cVZJG3tyGqFNaJMiho1SoCxe3qumfUS0KPdbm7l6hL8=; b=PcHNFI22Odn9Q07sO92q6tszhBBMBDFuyrzRHu8OAsyxxN/NBuyljNu/pd8FZMTXu1 7tQKyJB7nVlk91EtHh5+8WJvvUqvTlR1afu6GDDl0bIDcy926PF1KLdKSyn5ergAarBB DMtG3c+NEtKtOnqD4JTEdBlO40rJU3kXfn/xMZh8YmifRukudGBD3YEbXvjZ3WfqOFgL RnO46+WyeydFypjmXzAgD8CjxZEBdk6/DDPXPa2nzP0YHe9srNhJ+8NiHas8bpMnRYao GuKIVwXXnEU7wYeQE9lwZHXIwUFYA5k6G6jFfYLdYLEDRT2PqE/o/nZNcs31LVDv77ar QaDw== X-Gm-Message-State: AMCzsaVQjqFpmHZxdwRj4VHNHGmeWiMNForISeid8/rU4alURqdGTTKJ RoVQk1thMZERlI8MR1P96Ov9fZ+F X-Google-Smtp-Source: ABhQp+QtKd0JdSxYVtRnT7RHCOtVbdFA9rqYH78uvcYzuuIQs/phMI+UaqP6GUNUHpFrwg/05j8rfg== X-Received: by 10.98.34.22 with SMTP id i22mr3685367pfi.340.1509204329940; Sat, 28 Oct 2017 08:25:29 -0700 (PDT) Original-Received: from nautilus.championbroadband.com (216-165-229-229.championbroadband.com. [216.165.229.229]) by smtp.gmail.com with ESMTPSA id u7sm17899657pfh.142.2017.10.28.08.25.28 for <27782@debbugs.gnu.org> (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 28 Oct 2017 08:25:29 -0700 (PDT) X-Mailer: Apple Mail (2.3273) 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:8869 Archived-At: I worked on the code a bit more. It is currently implemented as a = #include "mman.c" in filesys.c=20 and another file "mman.c". I believe this needs to be reviewed by someone who understands the = constraints on foriegn pointers=20 and finalization better than I do. Also, there is a comment to add a = procedure mmap/no-search to=20 guarantee that the allocated region is not searched by the GC for = pointers. The following patch is against guile-2.2.2: --- libguile/filesys.c.orig 2017-07-21 06:14:18.000000000 -0700 +++ libguile/filesys.c 2017-10-27 15:40:04.000000000 -0700 @@ -1828,9 +1828,14 @@ =20 =0C =20 +#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-07-20 17:06:55.000000000 -0700 +++ libguile/mman.c 2017-10-28 08:12:46.000000000 -0700 @@ -0,0 +1,165 @@ +#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 (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, "mmap", 2, 4, 0,=20 + (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." + "ordinarily convert to bytevector using pointer->bytevector. = " + "Note that the region returned by mmap is not (?) searched " + "by the garbage collector. 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 %null-pointer #x1000)\n" + "@end example" + ) +#define FUNC_NAME s_scm_mmap +{ + 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); + =20 + if (SCM_UNBNDP (prot)) + c_prot =3D PROT_READ | PROT_WRITE; + else=20 + 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; +} +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,=20 + (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); + =20 + 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_ANO=