all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Pascal J. Bourguignon" <pjb@informatimago.com>
To: emacs-devel@gnu.org
Subject: Re: FFI in Emacs
Date: Tue, 12 Mar 2013 23:40:14 +0100	[thread overview]
Message-ID: <87d2v4s0mp.fsf@kuiper.lan.informatimago.com> (raw)
In-Reply-To: 83d2v4jnih.fsf@gnu.org

Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Tue, 12 Mar 2013 20:16:42 +0100
>> From: Aurélien Aptel <aurelien.aptel+emacs@gmail.com>
>> Cc: emacs-devel@gnu.org
>> 
>> a) load the shared library dynamically
>> b) get the address of any symbol in it (be it a global var or a function).
>> 
>> Then, to call a function:
>> c) load the argument according to user-provided type and ABI
>> d) make the call
>> e) retrieve eventual return value (also depends on ABI)
>> 
>> Steps a and b can be done portably using libltdl [1]; c,d and e with
>> libffi [2] or libffcall [3].
>
> Do we really need these libraries?  If the Posix hosts can do with
> dlopen, dlsym, dlclose, and dlerror, then it's very easy to emulate
> that on platforms that don't have these in the system libraries.  What
> else is needed, and why?
>
>> a) a function can allocate memory that has to be freed
>
> At least on Windows, this cannot be done safely, so please don't
> design the interface based on the assumption this is doable.  If a
> shared object allocates memory, it should be responsible for freeing
> it, or provide an API for telling it to free it.
>
> Likewise with file descriptors -- they cannot be safely shared across
> the interface, because the shared library could have used a different
> runtime for opening files.

Is emacs garbage collector of the copying kind?  If so, then objects
move in memory during garbage collection, and therefore any reference
given to a foreign library become invalid once the garbage collector
runs.  And vice-versa, managing resources allocated in the library (even if
we use library calls to do so) is quite complex, when those resources
have to be fred when the lisp object that has a reference is collected.
(Do we have finalizer in emacs objects?)

Soon the easiest solution is to copy a lot of data, between the lisp and
C side, which is even more costly.

A lot of libraries are written in C++ too, and they're a bitch to write
a FFI for, in general (ie. as soon as they use templates, smartptr<T>
anybody?), not counting the compiler-dependent name mangling which is
relatively a simple problem to solve.


I mean, even if emacs FFI was perfect (the FFI of some CL
implementations are good enough), you would still have those two
problems, of dealing with C++ libraries, and of crashing into C code,
which makes me choose often to just rewrite the thing in lisp, or to
write an external wrapper program in C, communicating with the lisp
process with whatever IPC is practical (files, sockets, etc).

Also, I guess a lot of modern libraries don't need anything fancy from
C/C++ either, so perhaps the best solution would be to have actually a
C/C++ compiler targetting the emacs VM, and instead of doing FFI to an
external binary library, we'd just compile it into the emacs VM.  But
perhaps writing a whole new compiler is more work than hacking half a
FFI.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.




  reply	other threads:[~2013-03-12 22:40 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-27 23:36 FFI in Emacs Aurélien Aptel
2012-06-27 23:47 ` Glenn Morris
2012-06-28  0:03   ` John Wiegley
2012-06-28  2:12     ` Glenn Morris
2012-06-28  3:43       ` Stefan Monnier
2012-06-28  4:51         ` John Wiegley
2012-06-28 15:27           ` Nix
2012-07-11  5:24         ` John Wiegley
2012-07-11  5:53           ` Helmut Eller
2012-07-11  6:43           ` Michael Albinus
2012-07-11 14:04             ` Burton Samograd
2012-07-11 14:07               ` Burton Samograd
2012-07-11  7:14           ` Stephen J. Turnbull
2012-07-11  7:44             ` Michael Albinus
2012-07-11 16:11             ` Eli Zaretskii
2012-07-11 17:08               ` Samuel Bronson
2012-07-11 17:49                 ` Eli Zaretskii
2012-07-11 18:23                   ` Stephen J. Turnbull
2012-07-11 18:30                     ` Eli Zaretskii
2012-07-11 16:05           ` Eli Zaretskii
2012-07-12 13:55           ` Stefan Monnier
2012-07-12 17:01             ` Samuel Bronson
2012-07-12 18:54             ` John Wiegley
2012-07-12 23:19             ` Sam Steingold
2012-07-13  2:20               ` Óscar Fuentes
2012-07-13  3:21                 ` Stephen J. Turnbull
2012-06-28  6:20       ` joakim
2012-07-11  9:40         ` joakim
2012-08-25 17:25           ` Aurélien Aptel
2012-08-25 18:20             ` joakim
2012-08-26  8:57               ` Ivan Kanis
2012-08-26 13:11                 ` joakim
2013-03-12 19:16             ` Aurélien Aptel
2013-03-12 21:50               ` Eli Zaretskii
2013-03-12 22:40                 ` Pascal J. Bourguignon [this message]
2013-03-13  7:41                   ` Andreas Schwab
2013-03-12 22:53                 ` Aurélien Aptel
2013-03-13  0:31                   ` Daniel Colascione
2013-03-13  3:55                   ` Eli Zaretskii
2013-03-22 19:44               ` BT Templeton
2013-03-23  1:51                 ` Leo Liu
2013-03-23  2:04                   ` Noah Lavine
2013-03-23 16:07                 ` Stefan Monnier
2013-03-23 18:33                   ` Yagnesh Raghava Yakkala

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87d2v4s0mp.fsf@kuiper.lan.informatimago.com \
    --to=pjb@informatimago.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.