mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 23:00:22 +02:00
port locking refactor
* libguile/ports.h (struct scm_t_port): Make the lock into a pointer field instead of an inline field. It should be possible to make unlocked ports by having a NULL lock field. (scm_c_lock_port, scm_c_try_lock_port): Return the mutex if the port was actually locked. (scm_c_unlock_port): Remove. * libguile/ports.c (scm_c_make_port_with_encoding): For now, leave `lock' set to 0. Change scm_c_lock_port callers to pay attention to the new API. * libguile/print.c (scm_write, scm_display): Fix call to dynwind-lock-port for ports-with-print-states.
This commit is contained in:
parent
ea0582c283
commit
92c0ebac90
3 changed files with 122 additions and 74 deletions
143
libguile/ports.c
143
libguile/ports.c
|
@ -582,8 +582,10 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits,
|
||||||
SCM_SET_CELL_WORD_1 (ret, (scm_t_bits) entry);
|
SCM_SET_CELL_WORD_1 (ret, (scm_t_bits) entry);
|
||||||
SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) ptob);
|
SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) ptob);
|
||||||
|
|
||||||
#if SCM_USE_PTHREAD_THREADS
|
entry->lock = NULL;
|
||||||
scm_i_pthread_mutex_init (&entry->lock, scm_i_pthread_mutexattr_recursive);
|
#if 0
|
||||||
|
entry->lock = scm_gc_malloc_pointerless (sizeof (*entry->lock), "port lock");
|
||||||
|
scm_i_pthread_mutex_init (entry->lock, scm_i_pthread_mutexattr_recursive);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
entry->file_name = SCM_BOOL_F;
|
entry->file_name = SCM_BOOL_F;
|
||||||
|
@ -1101,25 +1103,31 @@ SCM_DEFINE (scm_set_port_conversion_strategy_x, "set-port-conversion-strategy!",
|
||||||
/* The port lock. */
|
/* The port lock. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lock_port (SCM port)
|
lock_port (void *mutex)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_lock (mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unlock_port (SCM port)
|
unlock_port (void *mutex)
|
||||||
{
|
{
|
||||||
scm_c_unlock_port (port);
|
scm_i_pthread_mutex_unlock (mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scm_dynwind_lock_port (SCM port)
|
scm_dynwind_lock_port (SCM port)
|
||||||
|
#define FUNC_NAME "dynwind-lock-port"
|
||||||
{
|
{
|
||||||
scm_dynwind_unwind_handler_with_scm (unlock_port, port,
|
scm_i_pthread_mutex_t *lock;
|
||||||
SCM_F_WIND_EXPLICITLY);
|
SCM_VALIDATE_OPPORT (SCM_ARG1, port);
|
||||||
scm_dynwind_rewind_handler_with_scm (lock_port, port,
|
scm_c_lock_port (port, &lock);
|
||||||
SCM_F_WIND_EXPLICITLY);
|
if (lock)
|
||||||
|
{
|
||||||
|
scm_dynwind_unwind_handler (unlock_port, lock, SCM_F_WIND_EXPLICITLY);
|
||||||
|
scm_dynwind_rewind_handler (lock_port, lock, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1132,11 +1140,13 @@ scm_dynwind_lock_port (SCM port)
|
||||||
int
|
int
|
||||||
scm_revealed_count (SCM port)
|
scm_revealed_count (SCM port)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = SCM_REVEALED (port);
|
ret = SCM_REVEALED (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1160,12 +1170,15 @@ SCM_DEFINE (scm_set_port_revealed_x, "set-port-revealed!", 2, 0, 0,
|
||||||
#define FUNC_NAME s_scm_set_port_revealed_x
|
#define FUNC_NAME s_scm_set_port_revealed_x
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
|
||||||
port = SCM_COERCE_OUTPORT (port);
|
port = SCM_COERCE_OUTPORT (port);
|
||||||
SCM_VALIDATE_OPENPORT (1, port);
|
SCM_VALIDATE_OPENPORT (1, port);
|
||||||
r = scm_to_int (rcount);
|
r = scm_to_int (rcount);
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
SCM_REVEALED (port) = r;
|
SCM_REVEALED (port) = r;
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
@ -1177,13 +1190,15 @@ SCM_DEFINE (scm_adjust_port_revealed_x, "adjust-port-revealed!", 2, 0, 0,
|
||||||
"The return value is unspecified.")
|
"The return value is unspecified.")
|
||||||
#define FUNC_NAME s_scm_set_port_revealed_x
|
#define FUNC_NAME s_scm_set_port_revealed_x
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
int a;
|
int a;
|
||||||
port = SCM_COERCE_OUTPORT (port);
|
port = SCM_COERCE_OUTPORT (port);
|
||||||
SCM_VALIDATE_OPENPORT (1, port);
|
SCM_VALIDATE_OPENPORT (1, port);
|
||||||
a = scm_to_int (addend);
|
a = scm_to_int (addend);
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
SCM_REVEALED (port) += a;
|
SCM_REVEALED (port) += a;
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
@ -1196,11 +1211,13 @@ SCM_DEFINE (scm_adjust_port_revealed_x, "adjust-port-revealed!", 2, 0, 0,
|
||||||
int
|
int
|
||||||
scm_get_byte_or_eof (SCM port)
|
scm_get_byte_or_eof (SCM port)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = scm_get_byte_or_eof_unlocked (port);
|
ret = scm_get_byte_or_eof_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1208,11 +1225,13 @@ scm_get_byte_or_eof (SCM port)
|
||||||
int
|
int
|
||||||
scm_peek_byte_or_eof (SCM port)
|
scm_peek_byte_or_eof (SCM port)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = scm_peek_byte_or_eof_unlocked (port);
|
ret = scm_peek_byte_or_eof_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1358,11 +1377,14 @@ scm_c_read_unlocked (SCM port, void *buffer, size_t size)
|
||||||
size_t
|
size_t
|
||||||
scm_c_read (SCM port, void *buffer, size_t size)
|
scm_c_read (SCM port, void *buffer, size_t size)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
size_t ret;
|
size_t ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = scm_c_read_unlocked (port, buffer, size);
|
ret = scm_c_read_unlocked (port, buffer, size);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1692,11 +1714,14 @@ scm_getc_unlocked (SCM port)
|
||||||
scm_t_wchar
|
scm_t_wchar
|
||||||
scm_getc (SCM port)
|
scm_getc (SCM port)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
scm_t_wchar ret;
|
scm_t_wchar ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = scm_getc_unlocked (port);
|
ret = scm_getc_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1795,9 +1820,12 @@ scm_unget_byte_unlocked (int c, SCM port)
|
||||||
void
|
void
|
||||||
scm_unget_byte (int c, SCM port)
|
scm_unget_byte (int c, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_unget_byte_unlocked (c, port);
|
scm_unget_byte_unlocked (c, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1848,9 +1876,12 @@ scm_ungetc_unlocked (scm_t_wchar c, SCM port)
|
||||||
void
|
void
|
||||||
scm_ungetc (scm_t_wchar c, SCM port)
|
scm_ungetc (scm_t_wchar c, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_ungetc_unlocked (c, port);
|
scm_ungetc_unlocked (c, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1869,9 +1900,12 @@ scm_ungets_unlocked (const char *s, int n, SCM port)
|
||||||
void
|
void
|
||||||
scm_ungets (const char *s, int n, SCM port)
|
scm_ungets (const char *s, int n, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_ungets_unlocked (s, n, port);
|
scm_ungets_unlocked (s, n, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE (scm_peek_char, "peek-char", 0, 1, 0,
|
SCM_DEFINE (scm_peek_char, "peek-char", 0, 1, 0,
|
||||||
|
@ -2022,11 +2056,14 @@ scm_fill_input_unlocked (SCM port)
|
||||||
int
|
int
|
||||||
scm_fill_input (SCM port)
|
scm_fill_input (SCM port)
|
||||||
{
|
{
|
||||||
|
scm_i_pthread_mutex_t *lock;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
scm_c_lock_port (port);
|
scm_c_lock_port (port, &lock);
|
||||||
ret = scm_fill_input_unlocked (port);
|
ret = scm_fill_input_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2128,9 +2165,12 @@ scm_end_input_unlocked (SCM port)
|
||||||
void
|
void
|
||||||
scm_end_input (SCM port)
|
scm_end_input (SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_end_input_unlocked (port);
|
scm_end_input_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE (scm_force_output, "force-output", 0, 1, 0,
|
SCM_DEFINE (scm_force_output, "force-output", 0, 1, 0,
|
||||||
|
@ -2164,9 +2204,12 @@ scm_flush_unlocked (SCM port)
|
||||||
void
|
void
|
||||||
scm_flush (SCM port)
|
scm_flush (SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_flush_unlocked (port);
|
scm_flush_unlocked (port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2177,17 +2220,23 @@ scm_flush (SCM port)
|
||||||
void
|
void
|
||||||
scm_putc (char c, SCM port)
|
scm_putc (char c, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_putc_unlocked (c, port);
|
scm_putc_unlocked (c, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scm_puts (const char *s, SCM port)
|
scm_puts (const char *s, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_puts_unlocked (s, port);
|
scm_puts_unlocked (s, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* scm_c_write
|
/* scm_c_write
|
||||||
|
@ -2224,9 +2273,12 @@ scm_c_write_unlocked (SCM port, const void *ptr, size_t size)
|
||||||
void
|
void
|
||||||
scm_c_write (SCM port, const void *ptr, size_t size)
|
scm_c_write (SCM port, const void *ptr, size_t size)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_c_write_unlocked (port, ptr, size);
|
scm_c_write_unlocked (port, ptr, size);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* scm_lfwrite
|
/* scm_lfwrite
|
||||||
|
@ -2254,9 +2306,12 @@ scm_lfwrite_unlocked (const char *ptr, size_t size, SCM port)
|
||||||
void
|
void
|
||||||
scm_lfwrite (const char *ptr, size_t size, SCM port)
|
scm_lfwrite (const char *ptr, size_t size, SCM port)
|
||||||
{
|
{
|
||||||
scm_c_lock_port (port);
|
scm_i_pthread_mutex_t *lock;
|
||||||
|
scm_c_lock_port (port, &lock);
|
||||||
scm_lfwrite_unlocked (ptr, size, port);
|
scm_lfwrite_unlocked (ptr, size, port);
|
||||||
scm_c_unlock_port (port);
|
if (lock)
|
||||||
|
scm_i_pthread_mutex_unlock (lock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write STR to PORT from START inclusive to END exclusive. */
|
/* Write STR to PORT from START inclusive to END exclusive. */
|
||||||
|
|
|
@ -53,9 +53,7 @@ typedef enum scm_t_port_rw_active {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SCM port; /* Link back to the port object. */
|
SCM port; /* Link back to the port object. */
|
||||||
#if SCM_USE_PTHREAD_THREADS
|
scm_i_pthread_mutex_t *lock; /* A recursive lock for this port. */
|
||||||
scm_i_pthread_mutex_t lock; /* A recursive lock for this port. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int revealed; /* 0 not revealed, > 1 revealed.
|
int revealed; /* 0 not revealed, > 1 revealed.
|
||||||
* Revealed ports do not get GC'd.
|
* Revealed ports do not get GC'd.
|
||||||
|
@ -295,9 +293,8 @@ SCM_API SCM scm_set_port_conversion_strategy_x (SCM port, SCM behavior);
|
||||||
|
|
||||||
/* Acquiring and releasing the port lock. */
|
/* Acquiring and releasing the port lock. */
|
||||||
SCM_API void scm_dynwind_lock_port (SCM port);
|
SCM_API void scm_dynwind_lock_port (SCM port);
|
||||||
SCM_INLINE int scm_c_lock_port (SCM port);
|
SCM_INLINE int scm_c_lock_port (SCM port, scm_i_pthread_mutex_t **lock);
|
||||||
SCM_INLINE int scm_c_try_lock_port (SCM port);
|
SCM_INLINE int scm_c_try_lock_port (SCM port, scm_i_pthread_mutex_t **lock);
|
||||||
SCM_INLINE int scm_c_unlock_port (SCM port);
|
|
||||||
|
|
||||||
/* Revealed counts. */
|
/* Revealed counts. */
|
||||||
SCM_API int scm_revealed_count (SCM port);
|
SCM_API int scm_revealed_count (SCM port);
|
||||||
|
@ -383,33 +380,29 @@ SCM_INTERNAL void scm_init_ports (void);
|
||||||
|
|
||||||
#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
|
#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
SCM_INLINE_IMPLEMENTATION int
|
||||||
scm_c_lock_port (SCM port)
|
scm_c_lock_port (SCM port, scm_i_pthread_mutex_t **lock)
|
||||||
{
|
{
|
||||||
#if 0 && SCM_USE_PTHREAD_THREADS
|
*lock = SCM_PTAB_ENTRY (port)->lock;
|
||||||
return scm_i_pthread_mutex_lock (&SCM_PTAB_ENTRY (port)->lock);
|
|
||||||
#else
|
if (*lock)
|
||||||
|
return scm_i_pthread_mutex_lock (*lock);
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
SCM_INLINE_IMPLEMENTATION int
|
||||||
scm_c_try_lock_port (SCM port)
|
scm_c_try_lock_port (SCM port, scm_i_pthread_mutex_t **lock)
|
||||||
{
|
{
|
||||||
#if 0 && SCM_USE_PTHREAD_THREADS
|
*lock = SCM_PTAB_ENTRY (port)->lock;
|
||||||
return scm_i_pthread_mutex_trylock (&SCM_PTAB_ENTRY (port)->lock);
|
if (*lock)
|
||||||
#else
|
{
|
||||||
|
int ret = scm_i_pthread_mutex_trylock (*lock);
|
||||||
|
if (ret != 0)
|
||||||
|
*lock = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
|
||||||
scm_c_unlock_port (SCM port)
|
|
||||||
{
|
|
||||||
#if 0 && SCM_USE_PTHREAD_THREADS
|
|
||||||
return scm_i_pthread_mutex_unlock (&SCM_PTAB_ENTRY (port)->lock);
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
SCM_INLINE_IMPLEMENTATION int
|
||||||
|
|
|
@ -1295,7 +1295,7 @@ scm_write (SCM obj, SCM port)
|
||||||
SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_write);
|
SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_write);
|
||||||
|
|
||||||
scm_dynwind_begin (0);
|
scm_dynwind_begin (0);
|
||||||
scm_dynwind_lock_port (port);
|
scm_dynwind_lock_port (SCM_COERCE_OUTPORT (port));
|
||||||
scm_prin1 (obj, port, 1);
|
scm_prin1 (obj, port, 1);
|
||||||
scm_dynwind_end ();
|
scm_dynwind_end ();
|
||||||
|
|
||||||
|
@ -1314,7 +1314,7 @@ scm_display (SCM obj, SCM port)
|
||||||
SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_display);
|
SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_display);
|
||||||
|
|
||||||
scm_dynwind_begin (0);
|
scm_dynwind_begin (0);
|
||||||
scm_dynwind_lock_port (port);
|
scm_dynwind_lock_port (SCM_COERCE_OUTPORT (port));
|
||||||
scm_prin1 (obj, port, 0);
|
scm_prin1 (obj, port, 0);
|
||||||
scm_dynwind_end ();
|
scm_dynwind_end ();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue