From: Neil Jerram <neil@ossau.uklinux.net>
To: "Julian Graham" <joolean@gmail.com>
Cc: "Ludovic Courtès" <ludo@gnu.org>, guile-devel@gnu.org
Subject: Re: srfi-18 requirements
Date: Thu, 15 May 2008 00:11:36 +0100 [thread overview]
Message-ID: <87ve1gscpj.fsf@ossau.uklinux.net> (raw)
In-Reply-To: <2bc5f8210804131743p10e3a24bu15a4fb1985f72d1b@mail.gmail.com> (Julian Graham's message of "Sun, 13 Apr 2008 20:43:26 -0400")
"Julian Graham" <joolean@gmail.com> writes:
> Find attached a patch (in two parts [...]
Thanks; I've reviewed and applied those to my tree, and rebuilding
now; will push shortly unless I see any build errors.
> * Re-added support for locking mutexes with an owner other than the
> current thread
> * Enabled the previously ifdef'd out functions scm_mutex_owner and
> scm_mutex_level
> * Added a new function, scm_mutex_locked_p, useful for distinguishing
> between unlocked and unowned mutex states.
> * Updated the threads.test file to reflect the changes above
> * Updated the documentation in api-scheduling.texi to reflect the changes above
> * Updated the ChangeLog to reflect the changes above
All great.
> Also attached are updated versions of the Scheme SRFI-18
> implementation as well as the SRFI-18-specific test code.
I haven't covered these yet. Will try to soon, but could you resubmit
anyway as a GIT commit patch, so that you end up being properly
credited for the commit?
> A couple of notes: For purposes of elegance, I've changed semantics of
> fat_mutex.level -- where previously all non-recursive mutexes had a
> level of -1, recursiveness is now denoted by an integer field on
> fat_mutex. Any mutex (recursive or not) is in a locked state iff its
> level is greater than 0.
Cool; I think this is nicer than the previous -1 representation.
> Second, during the testing I did for this round of changes, I noticed
> a few more deadlocks that I believe are related to the existing core
> threading model (as opposed to the changes included in this patch).
> These seem to crop up when I run overnight tests on modified core
> code, probably because different timings and thread interactions are
> introduced. I think I've got fixes for some of them, and I'll
> follow-up in a separate mailing list thread.
OK. I'll look out for those.
Even though I've already committed, I had one query...
> @@ -1211,79 +1212,77 @@ SCM_DEFINE (scm_make_recursive_mutex, "make-recursive-mutex", 0, 0, 0,
> SCM_SYMBOL (scm_abandoned_mutex_error_key, "abandoned-mutex-error");
>
> static SCM
> -fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, int *ret)
> +fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, SCM owner, int *ret)
> {
> fat_mutex *m = SCM_MUTEX_DATA (mutex);
>
> - SCM thread = scm_current_thread ();
> - scm_i_thread *t = SCM_I_THREAD_DATA (thread);
> -
> + SCM new_owner = SCM_UNBNDP (owner) ? scm_current_thread() : owner;
> SCM err = SCM_BOOL_F;
>
> struct timeval current_time;
>
> scm_i_scm_pthread_mutex_lock (&m->lock);
> - if (scm_is_false (m->owner))
> - {
> - m->owner = thread;
> - scm_i_pthread_mutex_lock (&t->admin_mutex);
> - t->mutexes = scm_cons (mutex, t->mutexes);
> - scm_i_pthread_mutex_unlock (&t->admin_mutex);
> - *ret = 1;
> - }
> - else if (scm_is_eq (m->owner, thread))
> +
> + while (1)
> {
> - if (m->level >= 0)
> + if (m->level == 0)
> {
> + m->owner = new_owner;
> m->level++;
> - *ret = 1;
> - }
> - else
> - err = scm_cons (scm_misc_error_key,
> - scm_from_locale_string ("mutex already locked by "
> - "current thread"));
> - }
> - else
> - {
> - int first_iteration = 1;
> - while (1)
> - {
> - if (scm_is_eq (m->owner, thread) || scm_c_thread_exited_p (m->owner))
> +
> + if (SCM_I_IS_THREAD (new_owner))
> {
> + scm_i_thread *t = SCM_I_THREAD_DATA (new_owner);
> scm_i_pthread_mutex_lock (&t->admin_mutex);
> t->mutexes = scm_cons (mutex, t->mutexes);
> scm_i_pthread_mutex_unlock (&t->admin_mutex);
> - *ret = 1;
> - if (scm_c_thread_exited_p (m->owner))
> - {
> - m->owner = thread;
> - err = scm_cons (scm_abandoned_mutex_error_key,
> - scm_from_locale_string ("lock obtained on "
> - "abandoned mutex"));
> - }
> - break;
> }
> - else if (!first_iteration)
> + *ret = 1;
> + break;
> + }
> + else if (SCM_I_IS_THREAD (m->owner) && scm_c_thread_exited_p (m->owner))
> + {
> + m->owner = new_owner;
Should m->level be set to 1 here?
Regards, and thanks once again for your work on this area!
Neil
next prev parent reply other threads:[~2008-05-14 23:11 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-11 1:54 srfi-18 requirements Julian Graham
2007-10-12 8:42 ` Ludovic Courtès
2007-10-12 15:31 ` Julian Graham
2007-10-15 22:26 ` Julian Graham
2007-10-15 22:35 ` Stephen Compall
2007-10-15 22:47 ` Julian Graham
2007-10-29 14:37 ` Julian Graham
2007-11-26 18:11 ` Julian Graham
2007-11-27 9:14 ` Ludovic Courtès
2007-11-28 18:23 ` Ludovic Courtès
2007-11-28 18:55 ` Julian Graham
2007-12-01 5:08 ` Julian Graham
2007-12-01 10:21 ` Ludovic Courtès
2007-12-02 3:59 ` Julian Graham
2007-12-04 22:20 ` Neil Jerram
2007-12-04 22:29 ` Neil Jerram
2007-12-11 4:20 ` Julian Graham
2007-12-18 4:30 ` Julian Graham
2007-12-28 18:46 ` Ludovic Courtès
2007-12-28 19:08 ` Julian Graham
2007-12-28 22:35 ` Neil Jerram
2007-12-30 11:04 ` Neil Jerram
2007-12-30 20:38 ` Julian Graham
2008-01-01 19:09 ` Neil Jerram
2008-01-04 5:01 ` Julian Graham
2008-01-05 0:30 ` Neil Jerram
2008-01-06 21:41 ` Julian Graham
2008-01-08 23:11 ` Neil Jerram
2008-01-11 2:39 ` Julian Graham
2008-01-17 1:48 ` Neil Jerram
2008-01-19 20:10 ` Julian Graham
2008-01-23 22:46 ` Neil Jerram
2008-01-23 23:23 ` Julian Graham
2008-01-25 1:07 ` Neil Jerram
2008-01-25 1:38 ` Julian Graham
2008-01-28 2:06 ` Julian Graham
2008-02-03 0:30 ` Neil Jerram
2008-02-05 6:27 ` Julian Graham
2008-02-07 1:23 ` Neil Jerram
2008-02-07 3:06 ` Julian Graham
2008-02-07 23:26 ` Neil Jerram
2008-02-07 23:33 ` Julian Graham
2008-02-07 23:38 ` Neil Jerram
2008-02-08 0:04 ` Julian Graham
2008-02-11 5:14 ` Julian Graham
2008-02-19 22:48 ` Neil Jerram
2008-02-20 2:10 ` Julian Graham
2008-02-22 0:33 ` Neil Jerram
2008-02-22 4:14 ` Julian Graham
2008-02-24 9:41 ` Neil Jerram
2008-02-24 18:17 ` Julian Graham
2008-02-24 23:29 ` Neil Jerram
2008-03-01 19:56 ` Julian Graham
2008-03-08 16:34 ` Neil Jerram
2008-03-11 4:02 ` Julian Graham
2008-03-22 18:55 ` Julian Graham
2008-03-23 23:57 ` Neil Jerram
2008-03-24 22:03 ` Neil Jerram
2008-03-26 15:55 ` Julian Graham
2008-04-03 0:18 ` Neil Jerram
2008-04-03 19:07 ` Julian Graham
2008-04-09 21:29 ` Neil Jerram
2008-04-14 0:43 ` Julian Graham
2008-05-14 1:23 ` Julian Graham
2008-05-14 21:13 ` Neil Jerram
2008-05-14 23:11 ` Neil Jerram [this message]
2008-05-15 5:05 ` Julian Graham
2008-05-24 11:42 ` Neil Jerram
2008-05-24 13:55 ` Neil Jerram
2008-05-25 2:07 ` Julian Graham
2008-05-31 21:41 ` Ludovic Courtès
2008-06-02 4:48 ` Julian Graham
2008-06-21 5:03 ` Julian Graham
2008-06-30 17:51 ` Ludovic Courtès
2008-01-08 23:41 ` Neil Jerram
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/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ve1gscpj.fsf@ossau.uklinux.net \
--to=neil@ossau.uklinux.net \
--cc=guile-devel@gnu.org \
--cc=joolean@gmail.com \
--cc=ludo@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.
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).