From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Nala Ginrut Newsgroups: gmane.lisp.guile.bugs Subject: bug#18592: FFI should have portable access to =?UTF-8?Q?=E2=80=98errno=E2=80=99?= Date: Fri, 19 Feb 2016 13:02:36 +0800 Organization: HFG Message-ID: <1455858156.3838.21.camel@Renee-desktop.suse> References: <87fvf8oocf.fsf@ft.bewatermyfriend.org> <87h9vmy0zw.fsf@gnu.org> <87twzgeh3c.fsf@yeeloong.lan> <87r3uko4c9.fsf@gnu.org> <1451565229.3594.59.camel@Renee-desktop.suse> <1451909046.3594.135.camel@Renee-desktop.suse> <8760z9gw7o.fsf@netris.org> <1451934872.3594.150.camel@Renee-desktop.suse> <20160105074924.GA23165@tuxteam.de> <1451983123.3594.156.camel@Renee-desktop.suse> <87vb78jc86.fsf@netris.org> <1452021701.3594.160.camel@Renee-desktop.suse> <1455783943.3838.16.camel@Renee-desktop.suse> <871t8af8no.fsf@netris.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1455858203 24902 80.91.229.3 (19 Feb 2016 05:03:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 19 Feb 2016 05:03:23 +0000 (UTC) Cc: 18592@debbugs.gnu.org To: Mark H Weaver Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Fri Feb 19 06:03:12 2016 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1aWdDj-00053H-Kb for guile-bugs@m.gmane.org; Fri, 19 Feb 2016 06:03:11 +0100 Original-Received: from localhost ([::1]:48489 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWdDj-0006VP-0L for guile-bugs@m.gmane.org; Fri, 19 Feb 2016 00:03:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42760) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWdDd-0006VD-Eu for bug-guile@gnu.org; Fri, 19 Feb 2016 00:03:07 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aWdDa-00045C-4p for bug-guile@gnu.org; Fri, 19 Feb 2016 00:03:05 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:36253) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aWdDa-000458-0T for bug-guile@gnu.org; Fri, 19 Feb 2016 00:03:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84) (envelope-from ) id 1aWdDZ-00084A-L1 for bug-guile@gnu.org; Fri, 19 Feb 2016 00:03: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, 19 Feb 2016 05:03:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18592 X-GNU-PR-Package: guile X-GNU-PR-Keywords: Original-Received: via spool by 18592-submit@debbugs.gnu.org id=B18592.145585817030987 (code B ref 18592); Fri, 19 Feb 2016 05:03:01 +0000 Original-Received: (at 18592) by debbugs.gnu.org; 19 Feb 2016 05:02:50 +0000 Original-Received: from localhost ([127.0.0.1]:33380 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aWdDN-00083i-Gb for submit@debbugs.gnu.org; Fri, 19 Feb 2016 00:02:49 -0500 Original-Received: from mail-pf0-f171.google.com ([209.85.192.171]:35541) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aWdDM-00083U-1Z for 18592@debbugs.gnu.org; Fri, 19 Feb 2016 00:02:48 -0500 Original-Received: by mail-pf0-f171.google.com with SMTP id c10so45797797pfc.2 for <18592@debbugs.gnu.org>; Thu, 18 Feb 2016 21:02:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :organization:content-type:mime-version:content-transfer-encoding; bh=L94P1ojbssPCI4LP9Dd2wlw+Z85bhQWsjeKccUroSJM=; b=0zyGm+nS3nnzoviHLw+hVatXvypyUX0ip/GL8GAQjNPHQTa5LxAMoTVlIYjF3KpL9j Nzks+WhZkViz4kUUWuPyMAhegL9y+7ksfq2S3OJ+YMbNEuv3qV1j81eadJKvlAZL5uGP jrgJl1mmwHHaAqJC8+8aS96eU4a8wHWr9NEYmuS6ce7uZyJIbDXTV3pT/JzIoDicyAaQ cJSOtK2emOb0VdGKdDfxL01i+hpFtfRLqUCZ4vkrVKy9fcNGsTDOpiPX44vSfHwXW822 CIz3kNuJ80bfr4KjcHSvBiIPD4KTC1lwSHhYiHHFZY2W5C3CR3Zjl4PNHNxq8c0clH8P TPKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:content-type:mime-version :content-transfer-encoding; bh=L94P1ojbssPCI4LP9Dd2wlw+Z85bhQWsjeKccUroSJM=; b=O5fqm4xeVqSxxReZ22bpg1YeHwS8nRZ5NkC+FUqCdHVSvT1u1R74FSqZxFwT13JYvx DLZJA+G6oSVB1F3wYbXEo9BhhS4mvfoqZjnyGJnR0fJdPh+kP7uC+ITnimshKAPYLhZU Xyhq5Ycp4s2PiAzMNzTPl5lVGQDRbJu/J793MhxOetRuTDluwT2OiGQOw+eBFVImFeYr a4C/OKn02cnhLVg/rMImrWDUTJClDgBJAoUJfy3+sxnksDqrVH3fxSVtKc6DmvH6wPd9 8IAobERA6J/Z2IFDVAMpGeo2eLQFEwGyLAKCt4lIWv2tPqHX7S+n7idwcUoCBQMmA/to w+OQ== X-Gm-Message-State: AG10YOTQL2gLB6V8/SKSXqjlCWoyPkpi0EeFkXUk5fSKOu7wPsbI+bP8wOTvZGYuDroENg== X-Received: by 10.98.32.5 with SMTP id g5mr15458123pfg.74.1455858162106; Thu, 18 Feb 2016 21:02:42 -0800 (PST) Original-Received: from [147.2.147.24] ([203.192.156.9]) by smtp.gmail.com with ESMTPSA id dg1sm14078332pad.18.2016.02.18.21.02.39 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 18 Feb 2016 21:02:41 -0800 (PST) In-Reply-To: <871t8af8no.fsf@netris.org> X-Mailer: Evolution 3.4.4 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-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:7964 Archived-At: I think it's OK to try this: (pointer->procedure int (dynamic-func "epoll_create" (dynamic-link)) '() #:return-errno? #t) And I'm fine with the patch, could you push it please? Thank you very much! On Thu, 2016-02-18 at 08:30 -0500, Mark H Weaver wrote: > Nala Ginrut writes: > > Is there still any problem with the previous patch? > > Yes. I'm sorry, but we were failing to communicate and I did not have > time to continue trying, so instead I made my own patch, attached below. > > Can you try this patch, and tell me if it does what you need? > > Thanks, > Mark > > > differences between files attachment > (0001-PRELIMINARY-Add-support-for-errno-to-Dynamic-FFI.patch), > "[PATCH] PRELIMINARY: Add support for errno to Dynamic FFI" > From 17a3ee8c255e06ea7ee805401c94853fb48cbf12 Mon Sep 17 00:00:00 2001 > From: Mark H Weaver > Date: Tue, 5 Jan 2016 16:30:41 -0500 > Subject: [PATCH] PRELIMINARY: Add support for errno to Dynamic FFI. > > --- > doc/ref/api-foreign.texi | 15 +++++--- > libguile/foreign.c | 89 ++++++++++++++++++++++++++++++++++++++---------- > libguile/foreign.h | 4 ++- > 3 files changed, 85 insertions(+), 23 deletions(-) > > diff --git a/doc/ref/api-foreign.texi b/doc/ref/api-foreign.texi > index c2c49ec..25eaabf 100644 > --- a/doc/ref/api-foreign.texi > +++ b/doc/ref/api-foreign.texi > @@ -1,7 +1,7 @@ > @c -*-texinfo-*- > @c This is part of the GNU Guile Reference Manual. > -@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2008, > -@c 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. > +@c Copyright (C) 1996, 1997, 2000-2004, 2007-2014, 2016 > +@c Free Software Foundation, Inc. > @c See the file guile.texi for copying conditions. > > @node Foreign Function Interface > @@ -813,8 +813,11 @@ tightly packed structs and unions by hand. See the code for > Of course, the land of C is not all nouns and no verbs: there are > functions too, and Guile allows you to call them. > > -@deffn {Scheme Procedure} pointer->procedure return_type func_ptr arg_types > -@deffnx {C Procedure} scm_pointer_to_procedure (return_type, func_ptr, arg_types) > +@deffn {Scheme Procedure} pointer->procedure return_type func_ptr arg_types @ > + [#:return-errno?=#f] > +@deffnx {C Function} scm_pointer_to_procedure (return_type, func_ptr, arg_types) > +@deffnx {C Function} scm_pointer_to_procedure_with_errno (return_type, func_ptr, arg_types) > + > Make a foreign function. > > Given the foreign void pointer @var{func_ptr}, its argument and > @@ -825,6 +828,10 @@ and return appropriate values. > @var{arg_types} should be a list of foreign types. > @code{return_type} should be a foreign type. @xref{Foreign Types}, for > more information on foreign types. > + > +If @var{return-errno?} is true, or when calling > +@code{scm_pointer_to_procedure_with_errno}, the returned procedure will > +return two values, with @code{errno} as the second value. > @end deffn > > Here is a better definition of @code{(math bessel)}: > diff --git a/libguile/foreign.c b/libguile/foreign.c > index 29cfc73..f770100 100644 > --- a/libguile/foreign.c > +++ b/libguile/foreign.c > @@ -1,4 +1,4 @@ > -/* Copyright (C) 2010-2015 Free Software Foundation, Inc. > +/* Copyright (C) 2010-2016 Free Software Foundation, Inc. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public License > @@ -26,6 +26,7 @@ > #include > #include > #include > +#include > > #include "libguile/_scm.h" > #include "libguile/bytevectors.h" > @@ -85,7 +86,7 @@ null_pointer_error (const char *func_name) > } > > > -static SCM cif_to_procedure (SCM cif, SCM func_ptr); > +static SCM cif_to_procedure (SCM cif, SCM func_ptr, SCM return_errno); > > > static SCM pointer_weak_refs = SCM_BOOL_F; > @@ -753,24 +754,58 @@ make_cif (SCM return_type, SCM arg_types, const char *caller) > } > #undef FUNC_NAME > > -SCM_DEFINE (scm_pointer_to_procedure, "pointer->procedure", 3, 0, 0, > - (SCM return_type, SCM func_ptr, SCM arg_types), > +static SCM > +pointer_to_procedure (SCM return_type, SCM func_ptr, SCM arg_types, > + SCM return_errno) > +#define FUNC_NAME "pointer->procedure" > +{ > + ffi_cif *cif; > + > + SCM_VALIDATE_POINTER (2, func_ptr); > + > + cif = make_cif (return_type, arg_types, FUNC_NAME); > + > + return cif_to_procedure (scm_from_pointer (cif, NULL), func_ptr, > + return_errno); > +} > +#undef FUNC_NAME > + > +SCM > +scm_pointer_to_procedure (SCM return_type, SCM func_ptr, SCM arg_types) > +{ > + return pointer_to_procedure (return_type, func_ptr, arg_types, SCM_BOOL_F); > +} > + > +SCM > +scm_pointer_to_procedure_with_errno (SCM return_type, SCM func_ptr, > + SCM arg_types) > +{ > + return pointer_to_procedure (return_type, func_ptr, arg_types, SCM_BOOL_T); > +} > + > +SCM_KEYWORD (k_return_errno, "return-errno?"); > + > +SCM_DEFINE (scm_i_pointer_to_procedure, "pointer->procedure", 3, 0, 1, > + (SCM return_type, SCM func_ptr, SCM arg_types, SCM keyword_args), > "Make a foreign function.\n\n" > "Given the foreign void pointer @var{func_ptr}, its argument and\n" > "return types @var{arg_types} and @var{return_type}, return a\n" > "procedure that will pass arguments to the foreign function\n" > "and return appropriate values.\n\n" > "@var{arg_types} should be a list of foreign types.\n" > - "@code{return_type} should be a foreign type.") > -#define FUNC_NAME s_scm_pointer_to_procedure > + "@code{return_type} should be a foreign type.\n" > + "If the @code{#:return-errno?} keyword argument is provided and\n" > + "its value is true, then the returned procedure will return two\n" > + "values, with @code{errno} as the second value.") > +#define FUNC_NAME "pointer->procedure" > { > - ffi_cif *cif; > + SCM return_errno = SCM_BOOL_F; > > - SCM_VALIDATE_POINTER (2, func_ptr); > - > - cif = make_cif (return_type, arg_types, FUNC_NAME); > + scm_c_bind_keyword_arguments (FUNC_NAME, keyword_args, 0, > + k_return_errno, &return_errno, > + SCM_UNDEFINED); > > - return cif_to_procedure (scm_from_pointer (cif, NULL), func_ptr); > + return pointer_to_procedure (return_type, func_ptr, arg_types, return_errno); > } > #undef FUNC_NAME > > @@ -940,16 +975,20 @@ get_objcode_trampoline (unsigned int nargs) > } > > static SCM > -cif_to_procedure (SCM cif, SCM func_ptr) > +cif_to_procedure (SCM cif, SCM func_ptr, SCM return_errno) > { > ffi_cif *c_cif; > SCM objcode, table, ret; > > c_cif = (ffi_cif *) SCM_POINTER_VALUE (cif); > objcode = get_objcode_trampoline (c_cif->nargs); > - > + > + /* Convert 'return_errno' to a simple boolean, to avoid retaining > + references to non-boolean objects. */ > + return_errno = scm_from_bool (scm_is_true (return_errno)); > + > table = scm_c_make_vector (2, SCM_UNDEFINED); > - SCM_SIMPLE_VECTOR_SET (table, 0, scm_cons (cif, func_ptr)); > + SCM_SIMPLE_VECTOR_SET (table, 0, scm_cons2 (cif, func_ptr, return_errno)); > SCM_SIMPLE_VECTOR_SET (table, 1, SCM_BOOL_F); /* name */ > ret = scm_make_program (objcode, table, SCM_BOOL_F); > > @@ -1116,9 +1155,11 @@ scm_i_foreign_call (SCM foreign, const SCM *argv) > unsigned i; > size_t arg_size; > scm_t_ptrdiff off; > + SCM return_errno; > > cif = SCM_POINTER_VALUE (SCM_CAR (foreign)); > - func = SCM_POINTER_VALUE (SCM_CDR (foreign)); > + func = SCM_POINTER_VALUE (SCM_CADR (foreign)); > + return_errno = SCM_CDDR (foreign); > > /* Argument pointers. */ > args = alloca (sizeof (void *) * cif->nargs); > @@ -1153,10 +1194,22 @@ scm_i_foreign_call (SCM foreign, const SCM *argv) > rvalue = (void *) ROUND_UP ((scm_t_uintptr) data + off, > max (sizeof (void *), cif->rtype->alignment)); > > - /* off we go! */ > - ffi_call (cif, func, rvalue, args); > + if (scm_is_true (return_errno)) > + { > + int errno_save; > + > + errno = 0; > + ffi_call (cif, func, rvalue, args); > + errno_save = errno; > > - return pack (cif->rtype, rvalue, 1); > + return scm_values (scm_list_2 (pack (cif->rtype, rvalue, 1), > + scm_from_int (errno_save))); > + } > + else > + { > + ffi_call (cif, func, rvalue, args); > + return pack (cif->rtype, rvalue, 1); > + } > } > > > diff --git a/libguile/foreign.h b/libguile/foreign.h > index 41c0b65..f8a176b 100644 > --- a/libguile/foreign.h > +++ b/libguile/foreign.h > @@ -1,7 +1,7 @@ > #ifndef SCM_FOREIGN_H > #define SCM_FOREIGN_H > > -/* Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. > +/* Copyright (C) 2010, 2011, 2012, 2016 Free Software Foundation, Inc. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public License > @@ -94,6 +94,8 @@ SCM_INTERNAL SCM scm_pointer_to_string (SCM pointer, SCM length, SCM encoding); > > SCM_API SCM scm_pointer_to_procedure (SCM return_type, SCM func_ptr, > SCM arg_types); > +SCM_API SCM scm_pointer_to_procedure_with_errno (SCM return_type, SCM func_ptr, > + SCM arg_types); > SCM_API SCM scm_procedure_to_pointer (SCM return_type, SCM func_ptr, > SCM arg_types); > SCM_INTERNAL SCM scm_i_foreign_call (SCM foreign, const SCM *argv);