1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-03 05:20:16 +02:00
Commit graph

18442 commits

Author SHA1 Message Date
Andy Wingo
16fe02aa15 Update documentation on mutexes
* doc/ref/api-scheduling.texi (Mutexes and Condition Variables):
  Update.
2016-11-06 18:11:25 +01:00
Andy Wingo
03ffd726df scm_timed_lock_mutex replaces scm_lock_mutex_timed
* libguile/deprecated.h:
* libguile/deprecated.c (scm_lock_mutex_timed): Deprecate.
* libguile/threads.h:
* libguile/threads.c (scm_timed_lock_mutex): New function.
  (scm_join_thread): Fix formatting.
  (scm_lock_mutex): Fix formatting and update to scm_timed_lock_mutex
  change.
  (scm_try_mutex): Update to scm_timed_lock_mutex.
2016-11-05 19:39:12 +01:00
Andy Wingo
8d907758a0 Update mutex documentation
* doc/ref/api-scheduling.texi (Mutexes and Condition Variables): Add
  foreboding preface.
2016-11-05 19:38:40 +01:00
Andy Wingo
fc4df456a1 Separate fat mutex unlock and wait operations
* libguile/threads.c (fat_mutex_unlock, fat_mutex_wait): Separate wait
  from unlock.
  (scm_unlock_mutex, scm_timed_wait_condition_variable): Adapt.
2016-11-05 11:51:02 +01:00
Andy Wingo
56dd476af7 Back to simple unlock-mutex
* libguile/threads.c (scm_unlock_mutex): Bind to unlock-mutex.
* libguile/threads.h: Remove scm_unlock_mutex_timed.
* libguile/deprecated.h: Add scm_unlock_mutex_timed.
* libguile/deprecated.c (scm_unlock_mutex_timed): Deprecate.
* test-suite/tests/threads.test: Update unlock-mutex tests to use
  wait-condition-variable if they would wait on a cond.
2016-11-05 11:50:31 +01:00
Andy Wingo
7682461241 Replace scm_make_mutex_with_flags
* libguile/threads.c (enum fat_mutex_kind): New data type, replacing
  separate flags.
  (struct fat_mutex): Adapt.
  (make_fat_mutex): Fat mutexes can only be one of three kinds, not one
  of 4 kinds.  (Recursive unowned mutexes are not a thing.)
  (scm_make_mutex): Adapt.
  (scm_make_mutex_with_kind): New function, replacing
  scm_make_mutex_with_flags.  Still bound to make-mutex.
  (scm_make_recursive_mutex): Adapt.
  (fat_mutex_lock, fat_mutex_unlock): Adapt.
* libguile/threads.h (scm_make_mutex_with_kind): New decl.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_make_mutex_with_flags): Deprecate.
2016-11-05 11:16:46 +01:00
Andy Wingo
c0916134ac Remove unchecked-unlock facility from Guile mutexes
* libguile/threads.c (fat_mutex): Remove unchecked_unlock member.
  (make_fat_mutex): Adapt.
  (scm_make_mutex_with_flags): Remove unchecked-unlock flag.
  (scm_make_recursive_mutex): Likewise.
  (fat_mutex_unlock): Remove unchecked-unlock case.
* test-suite/tests/threads.test: Remove unchecked-unlock test.
2016-11-05 10:30:54 +01:00
Andy Wingo
f1f68fffb1 Recursively locking a SRFI-18 mutex blocks
* libguile/threads.c (fat_mutex_lock): allow-external-unlock mutexes
  can't be recursive, but a recursive lock attempt can be unblocked by
  an external thread, so these mutexes shouldn't throw an error on
  recursive lock attempts.
* test-suite/tests/srfi-18.test: Add tests.
2016-11-05 10:30:54 +01:00
Andy Wingo
b43f11469a SRFI-18 mutexes are not recursive
* module/srfi/srfi-18.scm (make-mutex): Not recursive.
2016-11-05 10:30:54 +01:00
Andy Wingo
b197a6a5af Move more functionality to SRFI-18 mutex-unlock!
* module/srfi/srfi-18.scm (mutex-unlock!): Implement the
  ignore-unlock-errors and wait-condition-variable behavior of
  mutex-unlock! directly, without relying on Guile.
2016-11-05 10:30:54 +01:00
Andy Wingo
f1b7eaaa1a Remove fat mutex abandoned mutex error
* libguile/threads.c (fat_mutex_lock): Remove abandoned mutex error, as
  SRFI-18 is responsible for this.
* test-suite/tests/threads.test: Update test.
2016-11-05 10:30:49 +01:00
Andy Wingo
a3d0a7da4d Remove thread held pthread_mutex field
* libguile/threads.h (scm_i_thread):
* libguile/threads.c (guilify_self_1, on_thread_exit)
  (scm_pthread_cond_wait, scm_pthread_cond_timedwait): The thread-local
  held_mutex field is no longer needed, now that we cancel threads via
  interrupts instead of pthread_cancel.
2016-11-05 00:22:15 +01:00
Andy Wingo
857aa581a2 Remove thread-local weak mutex set
* libguile/threads.h (scm_i_thread):
* libguile/threads.c (guilify_self_1, do_thread_exit, fat_mutex_lock):
  Remove thread-local weak mutex set.
2016-11-05 00:20:39 +01:00
Andy Wingo
c6a8092b3f SRFI-18 manages own mutex "abandoned" state
* module/srfi/srfi-18.scm (<mutex>, with-thread-mutex-cleanup)
  (make-mutex, mutex-state, abandon-mutex!, mutex-lock!): Manage
  "abandoned" bit on Scheme side with no need for thread cleanup
  handler.
2016-11-05 00:13:55 +01:00
Andy Wingo
ecfa0b50ce Remove lock-mutex owner facility
* libguile/threads.c (scm_lock_mutex_timed): Deprecate "owner"
  argument.
  (fat_mutex_lock): Remove owner argument.
  (fat_mutex_unlock): Don't pass owner to scm_lock_mutex_timed.
* test-suite/tests/threads.test: Remove tests of mutex-owner.
2016-11-04 23:32:26 +01:00
Andy Wingo
3ce76c38cb SRFI-18 threads disjoint from guile threads
* doc/ref/srfi-modules.texi (SRFI-18 Threads): Update.
* module/srfi/srfi-18.scm (<mutex>): Add owner field.
  (<thread>): New data type.
  (make-thread): Adapt for boxed threads.
  (thread-start!, thread-terminate!): Likewise.
  (mutex-state): Adapt for boxed threads.
  (mutex-lock!, mutex-unlock!): Update owner field.
2016-11-04 22:35:19 +01:00
Andy Wingo
bb4e955f0c Update SRFI-18 documentation.
* doc/ref/srfi-modules.texi (SRFI-18): Update documentation for disjoint
  mutexes and cond variables.
2016-11-04 20:41:52 +01:00
Andy Wingo
846f7e116e srfi-18 condition variables disjoint
* module/srfi/srfi-18.scm (<condition-variable>): New data type.
  (make-thread): Use srfi-18 interfaces.
  (mutex-unlock!): Adapt to optional cond argument being disjoint from
  Guile condition variables.
  (make-condition-variable, condition-variable-signal!)
  (condition-variable-broadcast!): Adapt.
2016-11-04 20:29:44 +01:00
Andy Wingo
3794935fed Remove export srfi-18 never had
* module/srfi/srfi-18.scm (condition-variable-wait!): Remove undefined
  export.
2016-11-04 20:20:04 +01:00
Andy Wingo
2559631869 SRFI-18 mutexes disjoint from Guile mutexes
* module/srfi/srfi-18.scm (<mutex>): Define as a wrapper type around
  Guile mutexes.
  (thread-mutexes): New variable.
  (with-thread-mutex-cleanup): New facility to abandon mutexes on
  SRFI-18 thread exit.  Not yet used.
  (make-thread): Use SRFI-18 interfaces.
  (make-mutex): Reimplement for our boxed mutexes.
  (mutex-state): Adapt.
  (mutex-lock!): Adapt.
  (mutex-unlock!): Adapt.
* test-suite/tests/srfi-18.test: Don't assume that SRFI-18 mutexes are
  the same as Guile mutexes.
2016-11-04 20:17:58 +01:00
Andy Wingo
0f5a59b215 try-mutex in terms of mutex-lock
* libguile/threads.c (scm_try_mutex): Just call scm_lock_mutex_timed
  with a zero timeout.
* module/ice-9/threads.scm (try-mutex): Likewise.
2016-11-02 21:29:30 +01:00
Andy Wingo
10471f40fe Fix typo in threads documentation
* doc/ref/api-scheduling.texi (Threads): Fix typo.
2016-11-02 19:10:33 +01:00
Andy Wingo
fcc6a7ba20 Deprecate critical sections
* NEWS: Deprecate critical sections.
* doc/ref/api-scheduling.texi (Critical Sections): Remove.
* libguile/async.c:
* libguile/async.h:
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/threads.c:
* libguile/threads.h: Deprecate critical section API.
2016-11-01 23:48:42 +01:00
Andy Wingo
4b78b001d8 Threads no longer track critical section level
* libguile/threads.h (scm_i_thread):
* libguile/threads.c (guilify_self_1): Remove critical_section_level
  member of scm_i_thread.
* libguile/async.c (scm_critical_section_end)
  (scm_critical_section_start): Remove bookkeeping.
2016-11-01 23:33:47 +01:00
Andy Wingo
8fc9450619 Remove call/cc assertion about critical sections
* libguile/continuations.c (scm_dynthrow): Remove assertion about
  critical section level; it's just a mutex anyway.
2016-11-01 23:32:41 +01:00
Andy Wingo
65268ff37a Remove last critical section use
* libguile/scmsigs.c (signal_handler_lock): New variable.
  (scm_sigaction_for_thread): Block asyncs and use a mutex instead of
  using scm_dynwind_critical_section.
2016-11-01 23:32:41 +01:00
Andy Wingo
2e2396d28c Mutex in dynamic linker
* libguile/dynl.c (scm_dynamic_link, scm_dynamic_unlink)
  (scm_dynamic_pointer): Use a mutex to provide thread-safety.
2016-11-01 23:13:17 +01:00
Andy Wingo
399379bf25 Remove critical section in scm_debug_options
* libguile/debug.c (scm_debug_options): Remove critical section.  There
  is no memory corruption hazard and racing callers to debug options
  won't produce sensible results anyway; or anyway they will be the same
  as racing vector-set!.
2016-11-01 23:07:56 +01:00
Andy Wingo
42882bbf42 Mutex instead of critical section in gc.c
* libguile/gc.c (scm_gc_protect_object, scm_gc_unprotect_object): Use a
  mutex instead of a critical section.  Remove dead code.
2016-11-01 22:57:54 +01:00
Andy Wingo
e7e7a719ba Mutex instead of critical section in GOOPS
* libguile/goops.c (scm_sys_modify_instance)
  (scm_sys_modify_class): Use a mutex instead of a critical section.
2016-11-01 22:52:12 +01:00
Andy Wingo
b410667e64 Simplify critical section implementation
* libguile/async.h (SCM_CRITICAL_SECTION_START)
  (SCM_CRITICAL_SECTION_END): Define in just one way.
* libguile/async.c (critical_section_mutex): New static variable.
  (scm_critical_section_start, scm_critical_section_end): Inline
  internal body of critical section gates.
  (scm_init_async): Init critical_section_mutex.
* libguile/threads.c (scm_threads_prehistory): Don't declare critical
  section mutex here.
2016-11-01 22:48:19 +01:00
Andy Wingo
c88d0cc402 Mutex instead of critical sectoin in symbol->keyword
* libguile/keywords.c (scm_symbol_to_keyword): Use a mutex in a dynwind
  instead of a critical section.
2016-11-01 22:40:38 +01:00
Andy Wingo
cfab7e3bf3 Mutexes instead of critical sections in stime.c
* libguile/stime.c (scm_current_time): No need for a critical section
  around time().
  (tz_lock): New mutex.
  (scm_localtime): Use tz_lock in a dynwind.  Fixes bug in which
  critical section was never left on error.
  (scm_gmtime, scm_mktime, scm_strftime, scm_strptime): Use a normal
  mutex instead of a critical section.
2016-11-01 22:33:30 +01:00
Andy Wingo
c77ccc58fb Remove unused internal definitions
* libguile/async.h (scm_i_pthread_mutex_lock_block_asyncs)
  (scm_i_pthread_mutex_unlock_unblock_asyncs): Remove unused internal
  definitions.
2016-11-01 22:10:12 +01:00
Andy Wingo
445837754e regexec comment fix
* libguile/regex-posix.c (SCM_DEFINE): Remove comment about
  threadsafety, given that regexec does appear to be threadsafe.
2016-11-01 21:55:16 +01:00
Andy Wingo
465466ce4d sigaction critical section refactor.
* libguile/scmsigs.c (scm_sigaction_for_thread): Use critical section
  dynwinds instead of SCM_CRITICAL_SECTION_START.
2016-11-01 21:40:34 +01:00
Andy Wingo
0a663877ac threads: Use a mutex instead of a critical section.
* libguile/threads.c: Replace uses of critical sections with a dedicated
  mutex.
2016-11-01 21:26:42 +01:00
Andy Wingo
b2e7662ebe Add scm_yield to manual alongside yield
* doc/ref/api-scheduling.texi (Threads): Mention scm_yield.
2016-11-01 19:58:06 +01:00
Andy Wingo
4280c818c2 api-scheduling.texi: Syntactic cleanups.
* doc/ref/api-scheduling.texi: Remove vestigial comments.
2016-11-01 19:40:19 +01:00
Andy Wingo
eeeee3297b Remove thread cleanup facility
* NEWS: Add entry.
* doc/ref/api-scheduling.texi (Threads): Remove thread-cleanup docs.
* libguile/threads.c (guilify_self_1, do_thread_exit):
  (scm_set_thread_cleanup_x, scm_thread_cleanup): Remove these.
* libguile/threads.h (scm_i_thread): Remove cleanup_handler.
* module/ice-9/threads.scm:
* module/ice-9/deprecated.scm (thread-cleanup, set-thread-cleanup!):
  Remove.
* test-suite/tests/threads.test: Adapt to test cancel-thread return
  values and not test thread-cleanup procs.
2016-10-31 22:37:46 +01:00
Andy Wingo
94a3433b9d REPL server avoids thread cleanup handlers
* module/system/repl/server.scm (serve-client): Avoid thread cleanup
  handlers.
2016-10-31 22:13:30 +01:00
Andy Wingo
b85f033526 srfi-18: thread-terminate! without cleanup handlers
* module/srfi/srfi-18.scm (%cancel-sentinel, thread-terminate!): Just
  use cancel-thread to cause the thread to return a sentinel value.
  (%timeout-sentinel): Rename from %sentinel.
  (thread-join!): Adapt and transform %cancel-sentinel to a
  &terminated-thread-exception.
2016-10-31 22:11:43 +01:00
Andy Wingo
a7114ced5f cancel-thread can take arguments
* doc/ref/api-scheduling.texi (Threads):
* module/ice-9/threads.scm (cancel-thread): Additional args to
  cancel-thread will be returned by the thread.
2016-10-31 22:11:01 +01:00
Andy Wingo
6bf9c65419 Trim srfi-18 thread startup machinery
* module/srfi/srfi-18.scm (make-thread): Use just one cond/mutex pair
  for signalling in both directions: waiting for launch and waiting for
  start.
2016-10-31 21:42:47 +01:00
Andy Wingo
59fdf9cdcd Refactor thread-join! to use optional args.
* module/srfi/srfi-18.scm (thread-join!): Use optional args.  Also don't
  treat false return values from threads as meaning anything.
2016-10-31 21:36:56 +01:00
Andy Wingo
8e305ee045 Rationalize exception handling in srfi-18
* module/srfi/srfi-18.scm (make-thread): Inline some helpers, and use
  just one catch block.
  (thread->exception): Move up definition.
  (exception-handler-for-foreign-threads): Use this as the default
  handler, not the one that squirrels away exceptions in
  thread->exception.
  (thread-terminate!): Don't instate an exception handler for the thread
  cleanup proc.
2016-10-31 21:20:47 +01:00
Andy Wingo
789a4d8d87 srfi-18: Avoid call/cc.
* module/srfi/srfi-18.scm (with-exception-handlers-here): New function.
  (wrap): Remove.
  (thread-join!, mutex-lock!): Use with-exception-handlers-here instead
  of the call/cc+wrap mess.
2016-10-31 20:52:08 +01:00
Andy Wingo
c3f08aa866 srfi-18: Inline uses of srfi-18-exception-preserver.
* module/srfi/srfi-18.scm (srfi-18-exception-preserver): Inline into
  call sites.
2016-10-30 22:37:49 +01:00
Andy Wingo
177a058a40 srfi-18: Use srfi-35 conditions.
* module/srfi/srfi-18.scm: Use srfi-35 conditions instead of our
  home-grown equivalent system.
  (thread-exception-handlers): Remove unused table.
  (srfi-18-exception-handler): Always capture key consed to args; no
  special case for bare key.
* test-suite/tests/srfi-18.test (provided?): Adapt to reason always
  being key+args.
2016-10-30 22:30:21 +01:00
Andy Wingo
0d57476f0a srfi-18: Use parameters.
* module/srfi/srfi-18.scm: Use srfi-34 internally with srfi-34: prefix.
  (current-exception-handler): Be a parameter.
  (with-exception-handler): Adapt to current-exception-handler change.
  (thread-join!, mutex-lock!): Adapt to use srfi-34: prefix.
2016-10-30 22:16:37 +01:00