1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-05 06:50:21 +02:00
Commit graph

20082 commits

Author SHA1 Message Date
Andy Wingo
96b994b6f8 Beginnings of suspendable HTTP
* module/web/http.scm: Use put-string and other routines from (ice-9
  textual-ports) in preference to `display'.  The goal is for these
  operations to be suspendable.
2017-02-08 15:09:14 +01:00
Andy Wingo
8c50060ae9 Modernize (web http) a bit
* module/web/http.scm: Modernize the Guile Scheme by using more match,
  when, unless, and non-tail conversion.  No functional change, with the
  exception of fixing a bug in write-key-value-list for symbols like
  100-continue that shouldn't print as #{100-continue}#.
* test-suite/tests/web-http.test (pass-if-only-parse):
  (pass-if-reparse, pass-if-parse): Arrange to also serialize and
  reparse values from pass-if-parse.  Apply to all existing tests except
  fragments where we don't expect fragments to be written out.
2017-02-08 15:09:14 +01:00
Daniel Llorens
93cbaef134 Fix rank 0 arrays and nested arrays in truncated-print
* module/ice-9/pretty-print.scm (print): In the array case, pass
  #:inner? along to (print-sequence), unless we're at the last dimension
  of the array.
  Special case for 0-rank arrays, which cannot be empty and have no
  length.
* test-suite/tests/print.test: Test some of the cases fixed by this
  patch.
2017-02-07 15:56:40 +01:00
Daniel Llorens
ee2125c639 Support arrays in truncated-print
* module/ice-9/pretty-print.scm (print): Handle general arrays.
* test-suite/tests/print.test: Test truncated-print with general arrays.
2017-02-07 12:19:04 +01:00
Daniel Llorens
a0028723da Fix bug #25492
* libguile/vm-engine.c (BR_F64_ARITHMETIC): Fix type.
2017-02-07 12:16:16 +01:00
Andy Wingo
498f3f9568 Avoid stacks in dynamically-bound values
* libguile/dynstack.h:
* libguile/dynstack.c (scm_dynstack_find_old_fluid_value): New
  function.
* libguile/fluids.c (saved_dynamic_state_ref): New helper.
  (scm_fluid_ref): Fix docstring.
  (scm_fluid_ref_star): New function allowing access to previous values
  for a fluid.
  (scm_dynamic_state_ref): New internal function.
* libguile/fluids.h: Add scm_fluid_ref_star and scm_dynamic_state_ref.
* libguile/stacks.c (scm_stack_id): Adapt to %stacks not being a chain.
* libguile/throw.c (catch, throw_without_pre_unwind): Adapt to
  %exception-handlers not being a chain.
* module/ice-9/boot-9.scm (catch, dispatch-exception): Instead of having
  %exception-handlers be a chain, use fluid-ref* to access the chain
  that is in place at the time the exception is thrown.  Prevents
  unintended undelimited capture of the current exception handler stack
  by a delimited "catch".
  (%start-stack): Similarly, don't be a chain.
* module/system/repl/debug.scm (frame->stack-vector):
* module/system/repl/error-handling.scm (call-with-error-handling):
* module/ice-9/save-stack.scm (save-stack): Adapt to %stacks not being a
  chain.
* test-suite/tests/exceptions.test ("delimited exception handlers"): Add
  tests.
* doc/ref/api-control.texi (Fluids and Dynamic States): Add docs.
2017-02-07 09:57:55 +01:00
Andy Wingo
81e9a128c1 Guile 2.1.6.
* GUILE-VERSION (GUILE_MICRO_VERSION): Bump to 2.1.6.
2017-01-19 01:43:51 +01:00
Andy Wingo
c74426fcb2 Update NEWS.
* NEWS: Update.
2017-01-19 01:43:51 +01:00
Andy Wingo
eec9aeba56 Fix build warning
* libguile/stime.c (scm_init_stime): Remove unused variable.
2017-01-19 01:43:51 +01:00
David Thompson
35a9059250 Add unboxed floating point comparison instructions.
* libguile/vm-engine.c (BR_F64_ARITHMETIC): New preprocessor macro.
(br_if_f64_ee, br_if_f64_lt, br_if_f64_le, br_if_f64_gt, br_if_f64_ge):
New VM instructions.
* doc/ref/vm.texi ("Unboxed Floating-Point Arithmetic"): Document them.
* module/language/cps/compile-bytecode.scm (compile-function): Emit f64
comparison instructions.
* module/language/cps/effects-analysis.scm: Define effects for f64
primcalls.
* module/language/cps/primitives.scm (*branching-primcall-arities*): Add
arities for f64 primcalls.
* module/language/cps/specialize-numbers.scm (specialize-f64-comparison):
New procedure.
(specialize-operations): Specialize f64 comparisons.
* module/system/vm/assembler.scm (emit-br-if-f64-=, emit-br-if-f64-<)
(emit-br-if-f64-<=, emit-br-if-f64->, emit-br-if-f64->=): Export.
* module/system/vm/disassembler.scm (code-annotation): Add annotations
for f64 comparison instructions.
2017-01-12 09:27:43 -05:00
Andy Wingo
63bf6ffa0d Protect call-with-new-thread data from GC.
* libguile/threads.c (struct launch_data): Add prev/next pointers.
  (protected_launch_data, protected_launch_data_lock): New static vars.
  (protect_launch_data, unprotect_launch_data): New functions.
  (really_launch, scm_sys_call_with_new_thread): Preserve launch data
  from GC.  Thanks to Linas Vepstas for the report!
2017-01-11 22:19:31 +01:00
Daniel Llorens
7e93950552 Final names for new array functions
Globally rename (array-from* -> array-slice), (array-from ->
array-cell-ref), (array-amend! -> array-cell-set!), (array-for-each-cell
-> array-slice-for-each).
2017-01-09 09:02:04 +01:00
Andy Wingo
2976abdbbb Fix scm_init_stime for macOS
* libguile/stime.c (scm_init_stime): Remove needless test of
  clock_getcpuclockid.  Fixes build on macOS; thanks to Matt Wette for
  the report and fix.
2017-01-08 23:45:58 +01:00
Andy Wingo
81d8ff9e45 Fix alloc_aligned for high allocations
* libguile/loader.c (alloc_aligned): Widen alignment.  Thanks to Matt
  Wette for the report and the fix!
2017-01-08 23:41:12 +01:00
Andy Wingo
c391ab8c90 Speed up load-thunk-from-memory for page alignment
* libguile/loader.c (page_size): New static var.
  (alloc_aligned): Enable mmap path that was never used in the
  past (!).  Thanks to Matt Wette for the bug report!
  (load_thunk_from_memory): Use page_size instead of 4096.
  (scm_bootstrap_loader): Init page_size.
2017-01-08 23:39:42 +01:00
Andy Wingo
6ff1ec9c31 Fix mkstemp on macOS
* libguile/filesys.c (scm_i_mkstemp): Limit flags to mkostemp.  Based on
  a patch by Matt Wette; thanks!
2017-01-08 23:25:56 +01:00
Andy Wingo
b392d81c9c Fix close-port race.
* libguile/ports.c (release_port): Fix race.
2017-01-08 15:42:22 +01:00
Andy Wingo
dffe495d0d Exited threads retain less memory
* libguile/threads.c (on_thread_exit): Lessen excess retention.
2017-01-08 13:44:38 +01:00
Andy Wingo
12eb7b8256 Prevent some interrupts of wait-condition-variable
* libguile/threads.c (timed_wait): Disable interrupts while reacquiring
  mutex after wait-condition-variable.
2017-01-08 13:18:13 +01:00
Andy Wingo
a000e5c38d Enable interrupts only when running thread body
* libguile/threads.c (really_launch): Start threads with asyncs
  blocked.
* module/ice-9/threads.scm (call-with-new-thread): Unblock asyncs once
  we have the bookkeeping sorted out.  Don't use
  with-continuation-barrier; it's not needed.  Print nice thread
  backtraces.
2017-01-08 13:02:56 +01:00
Andy Wingo
78239acff6 Remove thread-specific admin mutex
* libguile/threads.c (guilify_self_1):
* libguile/threads.h (scm_i_thread): Remove unused thread "admin
  mutex".
2017-01-08 12:27:26 +01:00
Andy Wingo
ca598d3140 Remove thread-exited? check in sigaction
* libguile/scmsigs.c (scm_sigaction_for_thread): Remove check that
  thread hadn't exited.  This check was racy as it's always possible
  that the other thread exits between checking it or even after the
  signal handler is installed.
2017-01-08 12:26:10 +01:00
Andy Wingo
5241d06855 Thread prepare-to-wait respects block_asyncs
* libguile/async.c (scm_i_prepare_to_wait): Don't signal interrupt if
  asyncs are blocked.
2017-01-08 12:24:44 +01:00
Andy Wingo
a0656ad4cf New interfaces to help wait on fd/cond
* libguile/async.h:
* libguile/async.c (struct scm_thread_wake_data): Include the cond to
  signal.  Be a union and include a tag.
  (scm_i_prepare_to_wait): Rename from scm_i_setup_sleep and take wake
  data directly.  Also call scm_i_wait_finished as appropriate.
  (scm_i_wait_finished): Rename from scm_i_reset_sleep.
  (scm_i_prepare_to_wait_on_fd, scm_c_prepare_to_wait_on_fd):
  (scm_i_prepare_to_wait_on_cond, scm_c_prepare_to_wait_on_cond): New
  functions.
  (scm_c_wait_finished): New function.
  (scm_system_async_mark_for_thread): Adapt to wake data change.
* libguile/threads.c (block_self, scm_std_select): Adapt to async
  interface changes.
* doc/ref/api-scheduling.texi (Asyncs): Doc new public interfaces.
2016-12-29 18:46:16 +01:00
Andy Wingo
0ce8a9a5e0 Improve handle-interrupts placement
* module/language/cps/handle-interrupts.scm (compute-safepoints): New
  function.
  (add-handle-interrupts): Add safepoints at backedge targets, not
  backedges.  Gives better register allocation, loop rotation, and code
  size.
2016-12-18 23:05:15 +01:00
Mark H Weaver
a396e14cb1 FFI: Add support for functions that set 'errno'.
Implements wishlist item <https://debbugs.gnu.org/18592>.
Requested by Frank Terbeck <ft@bewatermyfriend.org>.
Based on a proposed patch by Nala Ginrut <nalaginrut@gmail.com>.
Patch ported to 2.2 by Andy Wingo <wingo@pobox.com>.

* libguile/foreign.c (cif_to_procedure): Add 'with_errno' argument.
  If true, truncate result to only one return value.
  (scm_i_foreign_call): Separate the arguments.  Always return errno.
  (pointer_to_procedure): New static function.
  (scm_pointer_to_procedure_with_errno): New C API function, implemented
  in terms of 'pointer_to_procedure'.
  (scm_pointer_to_procedure): Reimplement in terms of
  'pointer_to_procedure', no longer bound to "pointer->procedure".  See
  below.
  (scm_i_pointer_to_procedure): New C function bound to
  "pointer->procedure" which now accepts the optional #:return-errno?
  keyword argument, implemented in terms of 'pointer_to_procedure'.
  (k_return_errno): New keyword #:return-errno?.
* libguile/foreign.h (scm_pointer_to_procedure_with_errno): Add prototype.
* doc/ref/api-foreign.texi (Dynamic FFI): Adjust documentation.
* libguile/vm-engine.c (foreign-call): Return two values.
2016-12-18 23:05:15 +01:00
Daniel Llorens
546eb479b1 Test format ~f with width parameters
* test-suite/tests/format.test: Additional tests for ~f.
2016-12-15 12:47:08 +01:00
Andy Wingo
2660c0b3c8 Fix bug in compute-significant-bits for phi predecessors
* module/language/cps/specialize-numbers.scm (compute-significant-bits):
  Always revisit predecessors after first visit.  Avoids situation where
  predecessor of an unvisited phi var could default to 0 significant
  bits and never be revisited.  Fixes (format #f "~2f" 9.9).
2016-12-14 17:45:26 +01:00
Daniel Llorens
37551e40b8 Make scm_gc_warn_proc() write directly to stderr
This avoids a deadlock due to the lookup of cur_warnport_fluid while an
allocation is ongoing.

* libguile/gc.c (scm_gc_warn_proc): Write the warning directly to
  stderr.
2016-12-14 09:49:52 +01:00
Andy Wingo
6dd87f4d8c Add suspendable-continuation?
* doc/ref/api-control.texi (Prompt Primitives): Document
  suspendable-continuation?.
* libguile/control.c (scm_suspendable_continuation_p): New procedure.
  (scm_init_ice_9_control): New extension procedure, defines
  suspendable-continuation?.
  (scm_init_control): Register scm_init_ice_9_control.
* libguile/eval.c (eval):
* libguile/throw.c (catch):
* libguile/continuations.c (scm_i_make_continuation): Restore resumable
  prompt cookie after continuation invocation.
* libguile/vm.c (scm_call_n): Arrange to set resumable_prompt_cookie
  during invocation of VM.
* libguile/vm.h (struct scm_vm): Add resumable_prompt_cookie member.
* module/ice-9/control.scm: Export suspendable-continuation?.
* test-suite/tests/control.test ("suspendable-continuation?"): New
  test.
2016-12-12 21:13:00 +01:00
Andy Wingo
bf4a97898b Bump version to 2.1.5.
* GUILE-VERSION (GUILE_MICRO_VERSION): Bump.
2016-12-07 20:02:14 +01:00
Andy Wingo
bb87578041 Fix --without-threads
* libguile/dynl.c:
* libguile/gc.c:
* libguile/keywords.c:
* libguile/scmsigs.c:
* libguile/stime.c: Use scm_i_dynamic_link instead of scm_dynamic_link
  so that things compile in without-threads configurations.
2016-12-07 20:02:14 +01:00
Andy Wingo
b0ccf4dd4a Refine check for when atomics are available.
* configure.ac:
* libguile/atomics-internal.h: Use HAVE_STDATOMIC_H to know when to use
  atomics.
2016-12-06 23:26:06 +01:00
Andy Wingo
7ff3d3834d Use readdir instead of readdir_r
* libguile/filesys.c:
* configure.ac: Remove readdir_r / readdir64_r checks and usage.
  glibc's impls are thread-safe, the _r variants are squirrely and now
  deprecated in glibc, and it is expected that POSIX will mandate that
  readdir{,64} be thread-safe already.  See
  https://sourceware.org/ml/libc-alpha/2016-02/msg00093.html.
2016-12-06 23:02:28 +01:00
Andy Wingo
8e20a991a9 Update NEWS.
* NEWS: Update.
2016-12-06 22:33:38 +01:00
Andy Wingo
ed19bb63a4 Add thread-local variables manual section.
* doc/ref/api-scheduling.texi (Thread Local Variables): New subsection.
2016-12-06 22:01:04 +01:00
Andy Wingo
a5f3868e2f Minor parameters doc change
* doc/ref/api-control.texi (Parameters): Make the opening a bit less
  abrupt.
2016-12-06 22:01:04 +01:00
Andy Wingo
842ba2fe33 Update fluids / dynstate docs
* doc/ref/api-control.texi (Fluids and Dynamic States): Update
  documentation.
2016-12-06 22:01:04 +01:00
Andy Wingo
500e4a83e4 Move fluids, parameters docs nearer to dynamic-wind
* doc/ref/api-control.texi:
* doc/ref/api-scheduling.texi: Move fluids and parameters docs.
2016-12-06 22:01:04 +01:00
Christopher Allan Webber
f94ea26a97 Fix small typo in suspendable-ports documentation.
* doc/ref/api-io.texi (Non-Blocking I/O): Fix example to call use-modules
  rather than use-module.
2016-12-06 13:40:13 -06:00
Andy Wingo
7184c176b4 with-dynamic-state compiler and VM support
* libguile/dynstack.h (SCM_DYNSTACK_TYPE_DYNAMIC_STATE):
* libguile/dynstack.c (DYNAMIC_STATE_WORDS, DYNAMIC_STATE_STATE_BOX):
  (scm_dynstack_push_dynamic_state):
  (scm_dynstack_unwind_dynamic_state): New definitions.
  (scm_dynstack_unwind_1, scm_dynstack_wind_1): Add with-dynamic-state
  cases.
* libguile/memoize.c (push_dynamic_state, pop_dynamic_state)
  (do_push_dynamic_state, do_pop_dynamic_state): New definitions.
  (memoize, scm_init_memoize): Handle push-dynamic-state and
  pop-dynamic-state.
* libguile/vm-engine.c (push-dynamic-state, pop-dynamic-state): New
  opcodes.
* module/ice-9/boot-9.scm (with-dynamic-state): New definition in Scheme
  so that the push-dynamic-state and pop-dynamic-state always run in the
  VM.
* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/effects-analysis.scm:
* module/language/cps/types.scm:
* module/language/tree-il/effects.scm (make-effects-analyzer):
* module/language/tree-il/peval.scm (peval):
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
* module/system/vm/assembler.scm: Add support for with-dynamic-state to
  the compiler.
* test-suite/tests/fluids.test ("dynamic states"): Add basic tests.
* doc/ref/vm.texi (Dynamic Environment Instructions): Update.
2016-12-05 22:57:29 +01:00
Andy Wingo
aa84489d18 Reimplement dynamic states
There are two goals: one, to use less memory per dynamic state in order
to allow millions of dynamic states to be allocated in light-weight
threading scenarios.  The second goal is to prevent dynamic states from
being actively mutated in two threads at once.  This second goal does
mean that dynamic states object that escape into scheme are now copies
that won't receive further updates; an incompatible change, but one
which we hope doesn't affect anyone.

* libguile/cache-internal.h: New file.
* libguile/fluids.c (is_dynamic_state, get_dynamic_state)
  (save_dynamic_state, restore_dynamic_state, add_entry)
  (copy_value_table): New functions.
  (scm_i_fluid_print, scm_i_dynamic_state_print): Move up.
  (new_fluid): No need for a number.
  (scm_fluid_p: scm_is_fluid): Inline IS_FLUID uses.
  (fluid_set_x, fluid_ref): Adapt to dynamic state changes.
  (scm_fluid_set_x, scm_fluid_unset_x): Call fluid_set_x.
  (scm_swap_fluid): Rewrite in terms of fluid_ref and fluid_set.
  (swap_fluid): Use internal fluid_set_x.
  (scm_i_make_initial_dynamic_state): Adapt to dynamic state
  representation change.
  (scm_dynamic_state_p, scm_is_dynamic_state): Use new accessors.
  (scm_current_dynamic_state): Use make_dynamic_state.
  (scm_dynwind_current_dynamic_state): Use new accessor.
* libguile/fluids.h: Remove internal definitions.  Add new struct
  definition.
* libguile/threads.h (scm_i_thread): Use scm_t_dynamic_state for dynamic
  state.
* libguile/threads.c (guilify_self_1, guilify_self_2):
  (scm_i_init_thread_for_guile, scm_init_guile):
  (scm_call_with_new_thread):
  (scm_init_threads, scm_init_threads_default_dynamic_state): Adapt to
  scm_i_thread change.
  (scm_i_with_guile, with_guile): Remove "and parent" suffix.
  (scm_i_reset_fluid): Remove unneeded function.
* doc/ref/api-scheduling.texi (Fluids and Dynamic States): Remove
  scm_make_dynamic_state docs.  Update current-dynamic-state docs.
* libguile/vm-engine.c (vm_engine): Update fluid-ref and fluid-set!
  inlined fast paths for dynamic state changes.
* libguile/vm.c (vm_error_unbound_fluid): Remove now-unused function.
* NEWS: Update.
* module/ice-9/deprecated.scm (make-dynamic-state): New definition.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_make_dynamic_state): Move here.
* libguile/__scm.h (scm_t_dynamic_state): New typedef.
* libguile/dynstack.h:
* libguile/dynstack.c (scm_dynstack_push_fluid):
  (scm_dynstack_unwind_fluid): Take raw dynstate in these internal
  functions.
* libguile/throw.c (catch): Adapt to dynstack changes.
2016-12-05 21:46:37 +01:00
Andy Wingo
a9dc553893 Fix two wait-condition-variable race conditions
* libguile/threads.c (timed_wait): When looping to reacquire mutex,
  check if mutex owner after dropping mutex to run asyncs when the
  reacquire is interrupted.

  Also for asyncs that interrupted the initial wait, just return #t
  directly, and allow the caller to loop.  Fixes a deadlock in which a
  thread could have pending asyncs after dropping a mutex and which
  prevent it from going to wait on a cond, but then the broadcast comes
  while nobody is waiting and the mutex is dropped, then after
  reacquiring the mutex when we go to wait again, we wait forever.

  The correct thing to do is after reacquiring the mutex, to allow the
  application to check if waiting is appropriate.
2016-11-30 22:56:54 +01:00
Andy Wingo
8bd5dae8c3 Compile fluid-set! to VM opcode
* libguile/vm-engine.c (fluid-set!): Fix name of opcode to correspond
  with name of Tree-IL primitive.  Fixes compilation of fluid-set! to
  actually use the fluid-set! opcode.
* doc/ref/vm.texi (Dynamic Environment Instructions): Update.
* module/language/cps/compile-bytecode.scm (compile-function): Add
  fluid-set! case.
* module/system/vm/assembler.scm: Update export name for
  emit-fluid-set!.
2016-11-27 21:55:42 +01:00
Andy Wingo
7b6b86f255 Ensure autoconf doesn't downgrade us to C99
* configure.ac: Add -std=gnu11 if the compiler is GCC (or clang).  This
  prevents AC_PROG_CC_C99 from downgrading us by adding -std=gnu99.
  Fixes regression whereby we were always using the fallback
  implementation of atomics.
2016-11-27 20:56:59 +01:00
Andy Wingo
668153dbb6 Add weak-table fast path for update
* libguile/weak-table.c (weak_table_put_x): If the key is the same and
  the table is weak-key, avoid re-setting disappearing links.
2016-11-26 16:30:57 +01:00
Andy Wingo
5a3bc32c99 Fix scm_weak_table_refq for undefined default
* libguile/weak-table.c (scm_weak_table_refq): No need to default weak
  table result to #f; just use whatever was passed in.
2016-11-26 16:07:30 +01:00
Andy Wingo
0dcca77754 Remove special support for fluids in GDB interface
* module/system/base/types.scm (inferior-fluid?, inferior-fluid-number)
  (<inferior-fluid>): Remove.  Fluids won't have numbers in the future.
  (cell->object): Adapt.
* test-suite/tests/types.test ("opaque objects"): Update.
2016-11-26 15:43:33 +01:00
Daniel Llorens
fa4a22971a Deprecate scm_from_contiguous_array
scm_from_contiguous_array() was undocumented, unused within Guile, and
can be replaced by make-array + array-copy! without requiring contiguity
and without loss of performance.

* libguile/arrays.c (scm_array_contents): Do not rely on
  SCM_I_ARRAY_CONTP.
* test-suite/tests/arrays.test: Test array-contents with 0-rank array.
* libguile/arrays.h: Declare scm_i_shap2ra(),
  SCM_SET_ARRAY_CONTIGUOUS_FLAG, SCM_CLR_ARRAY_CONTIGUOUS_FLAG so that
  scm_from_contiguous_array() can keep using them.
* libguile/deprecated.c (scm_from_contiguous_array): Move here from
  arrays.c.
* libguile/deprecated.h (scm_from_contiguous_array): Deprecate.
* NEWS: Add deprecation notice.
2016-11-23 13:05:49 +01:00
Daniel Llorens
0bd7562c96 Document new array functions, with provisional names
* doc/ref/api-data.texi: New section 'Arrays as arrays of
  arrays'. Document array-from, array-from*, array-amend!,
  array-for-each-cell, array-for-each-cell-in-order.
2016-11-23 13:05:18 +01:00