mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 07:30:32 +02:00
threadsafe port revealed counts
* libguile/ports.h: * libguile/ports.c (scm_revealed_count, scm_set_port_revealed_x): Make threadsafe. (scm_adjust_port_revealed_x): New function, to adjust a port's revealed count in a threadsafe way.
This commit is contained in:
parent
285ac79b1a
commit
b262d3065c
2 changed files with 31 additions and 2 deletions
|
@ -1106,7 +1106,13 @@ SCM_DEFINE (scm_set_port_conversion_strategy_x, "set-port-conversion-strategy!",
|
||||||
int
|
int
|
||||||
scm_revealed_count (SCM port)
|
scm_revealed_count (SCM port)
|
||||||
{
|
{
|
||||||
return SCM_REVEALED (port);
|
int ret;
|
||||||
|
|
||||||
|
scm_c_lock_port (port);
|
||||||
|
ret = SCM_REVEALED (port);
|
||||||
|
scm_c_unlock_port (port);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFINE (scm_port_revealed, "port-revealed", 1, 0, 0,
|
SCM_DEFINE (scm_port_revealed, "port-revealed", 1, 0, 0,
|
||||||
|
@ -1127,9 +1133,31 @@ SCM_DEFINE (scm_set_port_revealed_x, "set-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
|
||||||
{
|
{
|
||||||
|
int r;
|
||||||
port = SCM_COERCE_OUTPORT (port);
|
port = SCM_COERCE_OUTPORT (port);
|
||||||
SCM_VALIDATE_OPENPORT (1, port);
|
SCM_VALIDATE_OPENPORT (1, port);
|
||||||
SCM_REVEALED (port) = scm_to_int (rcount);
|
r = scm_to_int (rcount);
|
||||||
|
scm_c_lock_port (port);
|
||||||
|
SCM_REVEALED (port) = r;
|
||||||
|
scm_c_unlock_port (port);
|
||||||
|
return SCM_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
/* Set the revealed count for a port. */
|
||||||
|
SCM_DEFINE (scm_adjust_port_revealed_x, "adjust-port-revealed!", 2, 0, 0,
|
||||||
|
(SCM port, SCM addend),
|
||||||
|
"Add @var{addend} to the revealed count of @var{port}.\n"
|
||||||
|
"The return value is unspecified.")
|
||||||
|
#define FUNC_NAME s_scm_set_port_revealed_x
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
port = SCM_COERCE_OUTPORT (port);
|
||||||
|
SCM_VALIDATE_OPENPORT (1, port);
|
||||||
|
a = scm_to_int (addend);
|
||||||
|
scm_c_lock_port (port);
|
||||||
|
SCM_REVEALED (port) += a;
|
||||||
|
scm_c_unlock_port (port);
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
|
@ -302,6 +302,7 @@ SCM_INLINE int scm_c_unlock_port (SCM port);
|
||||||
SCM_API int scm_revealed_count (SCM port);
|
SCM_API int scm_revealed_count (SCM port);
|
||||||
SCM_API SCM scm_port_revealed (SCM port);
|
SCM_API SCM scm_port_revealed (SCM port);
|
||||||
SCM_API SCM scm_set_port_revealed_x (SCM port, SCM rcount);
|
SCM_API SCM scm_set_port_revealed_x (SCM port, SCM rcount);
|
||||||
|
SCM_API SCM scm_adjust_port_revealed_x (SCM port, SCM addend);
|
||||||
|
|
||||||
/* Input. */
|
/* Input. */
|
||||||
SCM_INLINE int scm_get_byte_or_eof (SCM port);
|
SCM_INLINE int scm_get_byte_or_eof (SCM port);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue