unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Ihor Radchenko <yantar92@posteo.net>
To: Eli Zaretskii <eliz@gnu.org>
Cc: luangruo@yahoo.com, emacs-devel@gnu.org
Subject: Re: Concurrency via isolated process/thread
Date: Mon, 24 Jul 2023 16:38:55 +0000	[thread overview]
Message-ID: <87wmypi7s0.fsf@localhost> (raw)
In-Reply-To: <83y1j5qoyo.fsf@gnu.org>

Eli Zaretskii <eliz@gnu.org> writes:

>> AFAIK, reading buffer does not require moving the gap.
>
> We've been through that: at least xml.c moves the gap to allow
> external libraries access to buffer text as a single contiguous C
> string.  This is a capability I wouldn't want to lose, because it
> might come in handy in future developments.

move_gap_both should lock the buffer as it is buffer modification (of
the buffer_text object). htmlReadMemory should also lock it because it
expects constant string segment.

And if we really want xml.c:parse_region to be asynchronous (not
blocking other threads reading the same buffer), we can still do it at
the cost of extra memcpy into newly allocated contiguous memory segment.

>> The point adjustment in the base buffer is done simply by storing point
>> as a marker. We can do the same for thread-local point positions.
>
> I still don't quite see how this will work.  Indirect buffers don't
> introduce parallelism, and programs that modify indirect buffers
> _know_ that the text of the base buffer will also be modified.  By
> contrast, a thread that has been preempted won't know and won't expect
> that.  It could, for example, keep buffer positions in simple
> variables, not in markers; almost all Lisp programs do that, and use
> markers only in very special situations.

Any async thread should expect that current buffer might be modified. Or
lock the buffer for text modifications explicitly (the feature we should
probably provide - something more enforcing compared to read-only-mode
we have now).

> In addition, on the C level, some code computes pointers to buffer
> text via BYTE_POS_ADDR, and then uses the pointer as any C program
> would.  If such a thread is suspended, and some other thread modifies
> buffer text in the meantime, all those pointers will be invalid, and
> we have bugs.  So it looks like, if we want to allow concurrent access
> to buffers from several threads, we will have a lot of code rewriting
> on our hands, and the rewritten code will be less efficient, because
> it will have to always access buffer text via buffer positions and
> macros like FETCH_BYTE and fetch_char_advance; access through char *
> pointers will be lost forever.

Not necessarily lost. We should provide facilities to prevent buffer
from being modified ("write mutex").

This problem is not limited to buffers - any low-level function that
modifies C object struct must enforce the condition when other threads
cannot modify the same object. For example SETCAR will have to mark the
modified object non-writable first, set its car, and release the lock.

So, any time we need a guarantee that an object remains unchanged, we
should acquire object-specific write-preventing mutex.

Of course, such write locks should happen for short periods of time to
be efficient.

Some of the existing uses of BYTE_POS_ADDRS may be converted into
explicit dynamic calls to
 (n < GPT_BYTE ? 0 : GAP_SIZE) + n + BEG_ADDR - BEG_BYTE;
If necessary.

> So maybe we should take a step back and consider a restriction that
> only one thread can access a buffer at any given time?  WDYT?

Buffers are so central in Emacs that I do not want to give up before we
try our best.

Alternatively, I can try to look into other global states first and
leave async buffer access to later. If we can get rid of the truly
global states (which buffer point is not; given that each thread has an
exclusive lock on its buffer), we can later come back to per-thread
point and restriction.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>



  reply	other threads:[~2023-07-24 16:38 UTC|newest]

Thread overview: 192+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-04 16:58 Concurrency via isolated process/thread Ihor Radchenko
2023-07-04 17:12 ` Eli Zaretskii
2023-07-04 17:29   ` Ihor Radchenko
2023-07-04 17:35     ` Eli Zaretskii
2023-07-04 17:52       ` Ihor Radchenko
2023-07-04 18:24         ` Eli Zaretskii
2023-07-05 11:23           ` Ihor Radchenko
2023-07-05 11:49             ` Eli Zaretskii
2023-07-05 12:40               ` Ihor Radchenko
2023-07-05 13:02                 ` Lynn Winebarger
2023-07-05 13:10                   ` Ihor Radchenko
2023-07-06 18:35                     ` Lynn Winebarger
2023-07-07 11:48                       ` Ihor Radchenko
2023-07-05 13:33                 ` Eli Zaretskii
2023-07-05 13:35                   ` Ihor Radchenko
2023-07-05  0:34         ` Po Lu
2023-07-05 11:26           ` Ihor Radchenko
2023-07-05 12:11             ` Po Lu
2023-07-05 12:44               ` Ihor Radchenko
2023-07-05 13:21                 ` Po Lu
2023-07-05 13:26                   ` Ihor Radchenko
2023-07-05 13:51                     ` Eli Zaretskii
2023-07-05 14:00                       ` Ihor Radchenko
2023-07-06  0:32                         ` Po Lu
2023-07-06 10:46                           ` Ihor Radchenko
2023-07-06 12:24                             ` Po Lu
2023-07-06 12:31                               ` Ihor Radchenko
2023-07-06 12:41                                 ` Po Lu
2023-07-06 12:51                                   ` Ihor Radchenko
2023-07-06 12:58                                     ` Po Lu
2023-07-06 13:13                                       ` Ihor Radchenko
2023-07-06 14:13                                         ` Eli Zaretskii
2023-07-06 14:47                                           ` Ihor Radchenko
2023-07-06 15:10                                             ` Eli Zaretskii
2023-07-06 16:17                                               ` Ihor Radchenko
2023-07-06 18:19                                                 ` Eli Zaretskii
2023-07-07 12:04                                                   ` Ihor Radchenko
2023-07-07 13:16                                                     ` Eli Zaretskii
2023-07-07 14:29                                                       ` Ihor Radchenko
2023-07-07 14:47                                                         ` Eli Zaretskii
2023-07-07 15:21                                                           ` Ihor Radchenko
2023-07-07 18:04                                                             ` Eli Zaretskii
2023-07-07 18:24                                                               ` Ihor Radchenko
2023-07-07 19:36                                                                 ` Eli Zaretskii
2023-07-07 20:05                                                                   ` Ihor Radchenko
2023-07-08  7:05                                                                     ` Eli Zaretskii
2023-07-08 10:53                                                                       ` Ihor Radchenko
2023-07-08 14:26                                                                         ` Eli Zaretskii
2023-07-09  9:36                                                                           ` Ihor Radchenko
2023-07-09  9:56                                                                             ` Po Lu
2023-07-09 10:04                                                                               ` Ihor Radchenko
2023-07-09 11:59                                                                             ` Eli Zaretskii
2023-07-09 13:58                                                                               ` Ihor Radchenko
2023-07-09 14:52                                                                                 ` Eli Zaretskii
2023-07-09 15:49                                                                                   ` Ihor Radchenko
2023-07-09 16:35                                                                                     ` Eli Zaretskii
2023-07-10 11:30                                                                                       ` Ihor Radchenko
2023-07-10 12:13                                                                                         ` Po Lu
2023-07-10 12:28                                                                                           ` Ihor Radchenko
2023-07-10 12:48                                                                                             ` Po Lu
2023-07-10 12:53                                                                                               ` Ihor Radchenko
2023-07-10 13:18                                                                                                 ` Po Lu
2023-07-10 13:09                                                                                         ` Eli Zaretskii
2023-07-10 13:58                                                                                           ` Ihor Radchenko
2023-07-10 14:37                                                                                             ` Eli Zaretskii
2023-07-10 14:55                                                                                               ` Ihor Radchenko
2023-07-10 16:03                                                                                                 ` Eli Zaretskii
2023-07-16 14:58                                                                                 ` Ihor Radchenko
2023-07-17  7:55                                                                                   ` Ihor Radchenko
2023-07-17  8:36                                                                                     ` Po Lu
2023-07-17  8:52                                                                                       ` Ihor Radchenko
2023-07-17  9:39                                                                                         ` Po Lu
2023-07-17  9:54                                                                                           ` Ihor Radchenko
2023-07-17 10:08                                                                                             ` Po Lu
2023-07-24  8:42                                                                                 ` Ihor Radchenko
2023-07-24  9:52                                                                                   ` Po Lu
2023-07-24 10:09                                                                                     ` Ihor Radchenko
2023-07-24 12:15                                                                                       ` Po Lu
2023-07-24 12:25                                                                                         ` Ihor Radchenko
2023-07-24 13:31                                                                                           ` Po Lu
2023-07-24 13:53                                                                                             ` Ihor Radchenko
2023-07-25  0:12                                                                                               ` Po Lu
2023-07-25  4:28                                                                                                 ` Ihor Radchenko
2023-07-24 12:50                                                                                       ` Eli Zaretskii
2023-07-24 13:15                                                                                         ` Ihor Radchenko
2023-07-24 13:41                                                                                           ` Eli Zaretskii
2023-07-24 14:13                                                                                             ` Ihor Radchenko
2023-07-24 12:44                                                                                   ` Eli Zaretskii
2023-07-24 13:02                                                                                     ` Ihor Radchenko
2023-07-24 13:54                                                                                       ` Eli Zaretskii
2023-07-24 14:24                                                                                         ` Ihor Radchenko
2023-07-24 16:00                                                                                           ` Eli Zaretskii
2023-07-24 16:38                                                                                             ` Ihor Radchenko [this message]
2023-07-25  0:20                                                                                               ` Po Lu
2023-07-25  4:36                                                                                                 ` Ihor Radchenko
2023-07-25  7:27                                                                                                   ` Po Lu
2023-07-25  7:59                                                                                                     ` Ihor Radchenko
2023-07-25  8:27                                                                                                       ` Po Lu
2023-07-25  8:45                                                                                                         ` Ihor Radchenko
2023-07-25  8:53                                                                                                           ` Po Lu
2023-07-25  9:03                                                                                                             ` Ihor Radchenko
2023-07-25  9:17                                                                                                               ` Po Lu
2023-07-25  9:27                                                                                                                 ` Ihor Radchenko
2023-07-25  9:37                                                                                                                   ` Po Lu
2023-07-25 12:40                                                                                                                   ` Eli Zaretskii
2023-07-25 11:29                                                                                               ` Eli Zaretskii
2023-07-25 11:52                                                                                                 ` Ihor Radchenko
2023-07-25 14:27                                                                                                   ` Eli Zaretskii
2023-07-09 17:13                                                                             ` Gregory Heytings
2023-07-10 11:37                                                                               ` Ihor Radchenko
2023-07-13 13:54                                                                                 ` Gregory Heytings
2023-07-13 14:23                                                                                   ` Ihor Radchenko
2023-07-07  0:21                                         ` Po Lu
2023-07-06 14:08                             ` Eli Zaretskii
2023-07-06 15:01                               ` Ihor Radchenko
2023-07-06 15:16                                 ` Eli Zaretskii
2023-07-06 16:32                                   ` Ihor Radchenko
2023-07-06 17:50                                     ` Eli Zaretskii
2023-07-07 12:30                                       ` Ihor Radchenko
2023-07-07 13:34                                         ` Eli Zaretskii
2023-07-07 15:17                                           ` Ihor Radchenko
2023-07-07 19:31                                             ` Eli Zaretskii
2023-07-07 20:01                                               ` Ihor Radchenko
2023-07-08  6:50                                                 ` Eli Zaretskii
2023-07-08 11:55                                                   ` Ihor Radchenko
2023-07-08 14:43                                                     ` Eli Zaretskii
2023-07-09  9:57                                                       ` Ihor Radchenko
2023-07-09 12:08                                                         ` Eli Zaretskii
2023-07-09 14:16                                                           ` Ihor Radchenko
2023-07-09 15:00                                                             ` Eli Zaretskii
2023-07-09 12:22                                                         ` Po Lu
2023-07-09 13:12                                                           ` Eli Zaretskii
2023-07-10  0:18                                                             ` Po Lu
2023-07-08  0:51                                               ` Po Lu
2023-07-08  4:18                                                 ` tomas
2023-07-08  5:51                                                   ` Po Lu
2023-07-08  6:01                                                     ` tomas
2023-07-08 10:02                                                       ` Ihor Radchenko
2023-07-08 19:39                                                         ` tomas
2023-07-08  6:25                                                 ` Eli Zaretskii
2023-07-08  6:38                                                   ` Ihor Radchenko
2023-07-08  7:45                                                     ` Eli Zaretskii
2023-07-08  8:16                                                       ` Ihor Radchenko
2023-07-08 10:13                                                         ` Eli Zaretskii
2023-07-07 13:35                                         ` Po Lu
2023-07-07 15:31                                           ` Ihor Radchenko
2023-07-08  0:44                                             ` Po Lu
2023-07-08  4:29                                               ` tomas
2023-07-08  7:21                                               ` Eli Zaretskii
2023-07-08  7:48                                                 ` Po Lu
2023-07-08 10:02                                                   ` Eli Zaretskii
2023-07-08 11:54                                                     ` Po Lu
2023-07-08 14:12                                                       ` Eli Zaretskii
2023-07-09  0:37                                                         ` Po Lu
2023-07-09  7:01                                                           ` Eli Zaretskii
2023-07-09  7:14                                                             ` Po Lu
2023-07-09  7:35                                                               ` Eli Zaretskii
2023-07-09  7:57                                                                 ` Ihor Radchenko
2023-07-09  8:41                                                                   ` Eli Zaretskii
2023-07-10 14:53                                                                     ` Dmitry Gutov
2023-07-09  9:25                                                                 ` Po Lu
2023-07-09 11:14                                                                   ` Eli Zaretskii
2023-07-09 11:23                                                                     ` Ihor Radchenko
2023-07-09 12:10                                                                     ` Po Lu
2023-07-09 13:03                                                                       ` Eli Zaretskii
2023-07-08 12:01                                                     ` Ihor Radchenko
2023-07-08 14:45                                                       ` Eli Zaretskii
2023-07-07  0:41                                     ` Po Lu
2023-07-07 12:42                                       ` Ihor Radchenko
2023-07-07 13:31                                         ` Po Lu
2023-07-07  0:27                                 ` Po Lu
2023-07-07 12:45                                   ` Ihor Radchenko
2023-07-06  0:27                     ` Po Lu
2023-07-06 10:48                       ` Ihor Radchenko
2023-07-06 12:15                         ` Po Lu
2023-07-06 14:10                         ` Eli Zaretskii
2023-07-06 15:09                           ` Ihor Radchenko
2023-07-06 15:18                             ` Eli Zaretskii
2023-07-06 16:36                               ` Ihor Radchenko
2023-07-06 17:53                                 ` Eli Zaretskii
2023-07-07  0:22                             ` Po Lu
2023-07-05  0:33 ` Po Lu
2023-07-05  2:31   ` Eli Zaretskii
2023-07-17 20:43     ` Hugo Thunnissen
2023-07-18  4:51       ` tomas
2023-07-18  5:25       ` Ihor Radchenko
2023-07-18  5:39         ` Po Lu
2023-07-18  5:49           ` Ihor Radchenko
2023-07-18 12:14         ` Hugo Thunnissen
2023-07-18 12:39           ` Async IO and queing process sentinels (was: Concurrency via isolated process/thread) Ihor Radchenko
2023-07-18 12:49             ` Ihor Radchenko
2023-07-18 14:12             ` Async IO and queing process sentinels Michael Albinus

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

  List information: https://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=87wmypi7s0.fsf@localhost \
    --to=yantar92@posteo.net \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=luangruo@yahoo.com \
    /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 public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).