+2003-06-14 Stefan Jahn <stefan@lkcc.org>
+
+ * configure.in: Checking for __int64 as possible candidate for
+ the SCM_I_GSC_T_INT64 define.
+
2003-05-30 Stefan Jahn <stefan@lkcc.org>
* configure.in: Checking for unsetenv().
AC_CHECK_SIZEOF(size_t)
AC_CHECK_SIZEOF(long long)
AC_CHECK_SIZEOF(unsigned long long)
+AC_CHECK_SIZEOF(__int64)
+AC_CHECK_SIZEOF(unsigned __int64)
AC_CHECK_SIZEOF(void *)
AC_CHECK_SIZEOF(intptr_t)
AC_CHECK_SIZEOF(uintptr_t)
AC_SUBST([SCM_I_GSC_T_UINT32])
### Optional type scm_t_int64 (ANSI C says int, short, or long might work)
-### Also try long long if we have it.
+### Also try 'long long' and '__int64' if we have it.
SCM_I_GSC_T_INT64=0
if test "$ac_cv_sizeof_int" -eq 8; then
SCM_I_GSC_T_INT64='"int"'
SCM_I_GSC_T_INT64='"short"'
elif test "$ac_cv_sizeof_long_long" -eq 8; then
SCM_I_GSC_T_INT64='"long long"'
+elif test "$ac_cv_sizeof___int64" -eq 8; then
+ SCM_I_GSC_T_INT64='"__int64"'
elif test "$scm_stdint_has_int64"; then
SCM_I_GSC_T_INT64='"int64_t"'
SCM_I_GSC_NEEDS_STDINT_H=1
AC_SUBST([SCM_I_GSC_T_INT64])
### Optional type scm_t_uint64 (ANSI C says int, short, or long might work)
-### Also try long long if we have it.
+### Also try 'long long' and '__int64' if we have it.
SCM_I_GSC_T_UINT64=0
if test "$ac_cv_sizeof_unsigned_int" -eq 8; then
SCM_I_GSC_T_UINT64='"unsigned int"'
SCM_I_GSC_T_UINT64='"unsigned short"'
elif test "$ac_cv_sizeof_unsigned_long_long" -eq 8; then
SCM_I_GSC_T_UINT64='"unsigned long long"'
+elif test "$ac_cv_sizeof_unsigned___int64" -eq 8; then
+ SCM_I_GSC_T_UINT64='"unsigned __int64"'
elif test "$scm_stdint_has_uint64"; then
SCM_I_GSC_T_UINT64='"uint64_t"'
SCM_I_GSC_NEEDS_STDINT_H=1
+2003-06-14 Stefan Jahn <stefan@lkcc.org>
+
+ * threads.h: Redefined scm_getspecific() and scm_setspecific()
+ to be functions instead of macros.
+
+ * threads.c: Conditionalized inclusion of <sys/time.h> and
+ <unistd.h>.
+ (scm_getspecific, scm_setspecific): Made these two function
+ real part of the API.
+
+ * posix.c (s_scm_putenv): Added some code to make a
+ (putenv "FOO="), i.e. setting an empty string, work also on
+ Win32 systems. Thanks to Kevin Ryde for the proposal.
+
2003-06-12 Kevin Ryde <user42@zip.com.au>
* posix.c (scm_putenv): Free temporary ptr in mingw unset. Add
#define scm_substring_move_left_x scm_substring_move_x
#define scm_substring_move_right_x scm_substring_move_x
+#if SCM_SIZEOF_LONG_LONG != 0
typedef long long long_long;
typedef unsigned long long ulong_long;
+#elif SCM_SIZEOF___INT64 != 0
+typedef __int64 long_long;
+typedef unsigned __int64 ulong_long;
+#endif
#define scm_sizet size_t
" be more likely to be what you want */\n");
pf ("#define SCM_SIZEOF_LONG_LONG %d\n", SIZEOF_LONG_LONG);
pf ("#define SCM_SIZEOF_UNSIGNED_LONG_LONG %d\n", SIZEOF_UNSIGNED_LONG_LONG);
+ pf ("#define SCM_SIZEOF___INT64 %d\n", SIZEOF___INT64);
+ pf ("#define SCM_SIZEOF_UNSIGNED___INT64 %d\n", SIZEOF_UNSIGNED___INT64);
pf ("\n");
pf ("/* These are always defined. */\n");
environment variable 'name'. */
int e;
ptr = scm_malloc (SCM_STRING_LENGTH (str) + 2);
+ if (ptr == NULL)
+ SCM_MEMORY_ERROR;
strncpy (ptr, SCM_STRING_CHARS (str), SCM_STRING_LENGTH (str));
ptr[SCM_STRING_LENGTH (str)] = '=';
ptr[SCM_STRING_LENGTH (str) + 1] = 0;
e = errno; free (ptr); errno = e;
if (rv < 0)
SCM_SYSERROR;
-#endif
+#endif /* !HAVE_UNSETENV */
}
else
{
if (ptr == NULL)
SCM_MEMORY_ERROR;
strncpy (ptr, SCM_STRING_CHARS (str), SCM_STRING_LENGTH (str));
+
+#ifdef __MINGW32__
+ /* If str is "FOO=", ie. attempting to set an empty string, then
+ we need to see if it's been successful. On MINGW, "FOO="
+ means remove FOO from the environment. As a workaround, we
+ set "FOO= ", ie. a space, and then modify the string returned
+ by getenv. It's not enough just to modify the string we set,
+ because MINGW putenv copies it. */
+ if (ptr[SCM_STRING_LENGTH (str) - 1] == '=')
+ {
+ char *alt;
+ SCM name = scm_substring (str, SCM_MAKINUM (0),
+ SCM_MAKINUM (SCM_STRING_LENGTH (str) - 1));
+ if (getenv (SCM_STRING_CHARS (name)) == NULL)
+ {
+ alt = scm_malloc (SCM_STRING_LENGTH (str) + 2);
+ if (alt == NULL)
+ {
+ free (ptr);
+ SCM_MEMORY_ERROR;
+ }
+ memcpy (alt, SCM_STRING_CHARS (str), SCM_STRING_LENGTH (str));
+ alt[SCM_STRING_LENGTH (str)] = ' ';
+ alt[SCM_STRING_LENGTH (str) + 1] = '\0';
+ rv = putenv (alt);
+ if (rv < 0)
+ SCM_SYSERROR;
+ free (ptr); /* don't need the old string we gave to putenv */
+ }
+ alt = getenv (SCM_STRING_CHARS (name));
+ alt[0] = '\0';
+ return SCM_UNSPECIFIED;
+ }
+#endif /* __MINGW32__ */
+
ptr[SCM_STRING_LENGTH (str)] = 0;
rv = putenv (ptr);
if (rv < 0)
#include "libguile/_scm.h"
+#if HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <stdio.h>
#include <assert.h>
+#if HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
#include "libguile/validate.h"
#include "libguile/root.h"
return res;
}
+void *
+scm_getspecific (scm_t_key k)
+{
+ return scm_i_plugin_getspecific (k);
+}
+
+int
+scm_setspecific (scm_t_key k, void *s)
+{
+ return scm_i_plugin_setspecific (k, s);
+}
+
void
scm_enter_guile ()
{
SCM_API void scm_init_threads (SCM_STACKITEM *);
SCM_API void scm_init_thread_procs (void);
+#if SCM_USE_PTHREAD_THREADS
+# include "libguile/pthread-threads.h"
+#else
+# include "libguile/null-threads.h"
+#endif
+
/*----------------------------------------------------------------------*/
/* Low-level C API */
#define scm_key_create scm_i_plugin_key_create
#define scm_key_delete scm_i_plugin_key_delete
-#define scm_setspecific scm_i_plugin_setspecific
-#define scm_getspecific scm_i_plugin_getspecific
+SCM_API int scm_setspecific (scm_t_key k, void *s);
+SCM_API void *scm_getspecific (scm_t_key k);
#define scm_thread_select scm_internal_select
SCM_API scm_root_state *scm_i_thread_root (SCM thread);
-#if SCM_USE_PTHREAD_THREADS
-# include "libguile/pthread-threads.h"
-#else
-# include "libguile/null-threads.h"
-#endif
-
#define SCM_CURRENT_THREAD \
((scm_thread *) scm_i_plugin_getspecific (scm_i_thread_key))
extern scm_t_key scm_i_thread_key;
/* These macros have confusing names.
They really refer to the root state of the running thread. */
-#define SCM_THREAD_LOCAL_DATA (scm_i_plugin_getspecific (scm_i_root_state_key))
+#define SCM_THREAD_LOCAL_DATA (scm_getspecific (scm_i_root_state_key))
#define SCM_SET_THREAD_LOCAL_DATA(x) scm_i_set_thread_data(x)
SCM_API scm_t_key scm_i_root_state_key;
SCM_API void scm_i_set_thread_data (void *);