2003-06-14 Stefan Jahn <stefan@lkcc.org>
authorStefan Jahn <stefan@lkcc.org>
Sat, 14 Jun 2003 05:36:02 +0000 (05:36 +0000)
committerStefan Jahn <stefan@lkcc.org>
Sat, 14 Jun 2003 05:36:02 +0000 (05:36 +0000)
        * configure.in: Checking for __int64 as possible candidate for
        the SCM_I_GSC_T_INT64 define.

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.

ChangeLog
configure.in
libguile/ChangeLog
libguile/deprecated.h
libguile/gen-scmconfig.c
libguile/posix.c
libguile/threads.c
libguile/threads.h

index 04addeb..5242e5a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+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().
index 323322a..717611a 100644 (file)
@@ -242,6 +242,8 @@ AC_CHECK_SIZEOF(unsigned long)
 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)
@@ -419,7 +421,7 @@ fi
 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"'
@@ -429,6 +431,8 @@ elif test "$ac_cv_sizeof_short" -eq 8; then
   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
@@ -441,7 +445,7 @@ fi
 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"'
@@ -451,6 +455,8 @@ elif test "$ac_cv_sizeof_unsigned_short" -eq 8; then
   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
index 96762b0..3447bca 100644 (file)
@@ -1,3 +1,17 @@
+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
index 981e982..4462729 100644 (file)
@@ -68,8 +68,13 @@ SCM_API const char scm_s_formals[];
 #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
 
index d2f0778..4384b36 100644 (file)
@@ -276,6 +276,8 @@ main (int argc, char *argv[])
       "   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");
index bd3c2fe..60ad33d 100644 (file)
@@ -1175,6 +1175,8 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
         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;
@@ -1182,7 +1184,7 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
       e = errno; free (ptr); errno = e;
       if (rv < 0)
        SCM_SYSERROR;
-#endif
+#endif /* !HAVE_UNSETENV */
     }
   else
     {
@@ -1191,6 +1193,41 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
       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)
index 26d613e..5be5b82 100644 (file)
 
 #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"
@@ -1088,6 +1092,18 @@ scm_cond_timedwait (scm_t_cond *c, scm_t_mutex *m, const scm_t_timespec *wt)
   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 ()
 {
index cebdc7b..cb08b72 100644 (file)
@@ -63,6 +63,12 @@ SCM_API void scm_threads_mark_stacks (void);
 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 */
 
@@ -130,8 +136,8 @@ SCM_API int scm_cond_timedwait (scm_t_cond *c,
 
 #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
 
@@ -224,19 +230,13 @@ SCM_API SCM scm_thread_exited_p (SCM thread);
 
 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 *);