1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-23 20:05:32 +02:00

2001-11-04 Stefan Jahn <stefan@lkcc.org>

* NEWS: Corrected remarks about SCM_API.

        * configure.in: Defining USE_DLL_IMPORT definition to indicate
        usage of DLL import macros in `libguile/__scm.h'.
        (LIBOBJS): Removed `fileblocks.o' from the list of object files.
        Somehow Jim Blandy's patch from 1997 did not survive.

2001-11-04  Stefan Jahn  <stefan@lkcc.org>

        * configure.in (EXTRA_DEFS): Follow-up patch.  Using SCM_IMPORT
        instead of __SCM_IMPORT__.

        * readline.c (scm_readline_init_ports): Disable input/output
        stream redirection for Win32.  The readline package for Win32
        does not support this.  The guile-readline library works fine
        for command line editing.

        * readline.h (SCM_RL_API): Renamed __FOO__ macros into FOO.

2001-11-04  Stefan Jahn  <stefan@lkcc.org>

        * Makefile.am (libguile_la_LIBADD): Added $(THREAD_LIBS_LOCAL)
        here (was at guile_LDADD) which describes the dependency
        correctly and allows a clean build on Win32.

        * __scm.h (SCM_API): Follow-up patch.  Renamed __FOO__ macros
        into FOO.

        * __scm.h: USE_DLL_IMPORT indicates the usage of the DLL
        import macros for external libraries (libcrypt, libqthreads,
        libreadline and libregex).

        * coop-defs.h: Include <winsock2.h> for `struct timeval'.

        * posix.c (flock): Added support for flock() in M$-Windows.

        * guile.c (SCM_IMPORT): Follow-up patch.  Use SCM_IMPORT instead
        of __SCM_IMPORT__.

        * fports.c (getflags): Differentiate reading and writing pipes
        descriptors.

        * filesys.c (S_IS*): Redefine all of the S_IS*() macros for
        M$-Windows.

        * coop.c (coop_condition_variable_timed_wait_mutex): Use
        conditionalized error code if `ETIMEDOUT' is not available.
        (scm_thread_usleep): Remove bogus declaration of `struct timeval
        timeout'.

        * numbers.c (PTRDIFF_MIN): Moved this definition where it actually
        belongs.  That is because NO_PREPRO_MAGIC gets undefined after
        each inclusion of `num2integral.i.c'.
        (SIZE_MAX): Define NO_PREPRO_MAGIC if SIZE_MAX is undefined.

2001-11-04  Stefan Jahn  <stefan@lkcc.org>

        * md/Makefile.am (EXTRA_DIST): Added `i386.asm'.

        * md/i386.asm: New file.  Contains the Intel syntax version for
        nasm/tasm/masm of the file `i386.s'.

        * qt.h.in: Definition of QT_API, QT_IMPORT and QT_EXPORT.
        Prefixed each symbols which is meant to go into a DLL.

        * Makefile.am (libqthreads_la_LDFLAGS):  Put `-no-undefined'
        into LDFLAGS to support linkers which do not allow unresolved
        symbols inside shared libraries.
        (EXTRA_DIST): Add `libqthreads.def', which is an export file
        definition for M$-Windows.  It defines exported symbols.  This is
        necessary because the M$VC linker does not know how to export
        assembler symbols into a DLL.

2001-11-04  Stefan Jahn  <stefan@lkcc.org>

        * srfi-13.h, srfi-14.h, srfi-4.h: Follow-up patch.  Renamed
        __FOO__ macros into FOO.

2001-11-04  Stefan Jahn  <stefan@lkcc.org>

        * tests/ports.test: Run (close-port) before (delete-file) if
        necessary/advisory.
This commit is contained in:
Stefan Jahn 2001-11-04 15:52:30 +00:00
parent 836b65573d
commit 8f99e3f38b
31 changed files with 447 additions and 82 deletions

View file

@ -1,3 +1,12 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* NEWS: Corrected remarks about SCM_API.
* configure.in: Defining USE_DLL_IMPORT definition to indicate
usage of DLL import macros in `libguile/__scm.h'.
(LIBOBJS): Removed `fileblocks.o' from the list of object files.
Somehow Jim Blandy's patch from 1997 did not survive.
2001-11-02 Marius Vollmer <mvo@zagadka.ping.de>
Support for native Win32. Thanks to Stefan Jahn!
@ -6,9 +15,9 @@
build systems which do not have symbolic links.
* configure.in: Define AC_LIBTOOL_WIN32_DLL to build clean dlls
on Win32 platforms.
Checking for `ws2_32.dll', `winsock2.h', add `uname.o' and
`dirent.o' and define extra compiler flags necessary to build
clean dlls.
Checking for `ws2_32.dll', `winsock2.h', add `win32-uname.o'
and `win32-dirent.o' and define extra compiler flags necessary
to build clean dlls.
Check for `regcomp()' inside `-lregex'.
2001-10-26 Thien-Thi Nguyen <ttn@glug.org>

6
NEWS
View file

@ -32,12 +32,12 @@ declaration. This macro can expand into different things, the most
common of which is just "extern" for Unix platforms. On Win32, it can
be used to control which symbols are exported from a DLL.
If you `#define __SCM_IMPORT__' before including <libguile.h>, SCM_API
If you `#define SCM_IMPORT' before including <libguile.h>, SCM_API
will expand into "__declspec (dllimport) extern", which is needed for
linking to the Guile DLL in Windows.
There are also __SCM_RL_IMPORT__, __SCM_SRFI1314_IMPORT__, and
__SCM_SRFI4_IMPORT__, for the corresponding libraries.
There are also SCM_RL_IMPORT, QT_IMPORT, SCM_SRFI1314_IMPORT, and
SCM_SRFI4_IMPORT, for the corresponding libraries.
Changes since Guile 1.4:

View file

@ -228,19 +228,18 @@ dnl
dnl Check for Winsock and other functionality on Win32 (*not* CygWin)
dnl
EXTRA_DEFS=""
EXTRA_LIB_DEFS=""
if test "$MINGW32" = "yes" ; then
AC_CHECK_HEADER(winsock2.h, [AC_DEFINE([HAVE_WINSOCK2_H], 1,
[Define if you have the <winsock2.h> header file.])])
AC_CHECK_LIB(ws2_32, main)
LIBOBJS="$LIBOBJS uname.o dirent.o"
LIBOBJS="$LIBOBJS win32-uname.o win32-dirent.o"
if test $enable_shared = yes ; then
EXTRA_DEFS="-D__SCM_IMPORT__ -D__REGEX_IMPORT__ -D__CRYPT_IMPORT__"
EXTRA_LIB_DEFS="-D__REGEX_IMPORT__ -D__CRYPT_IMPORT__"
EXTRA_DEFS="-DSCM_IMPORT"
AC_DEFINE(USE_DLL_IMPORT, 1,
[Define if you need additional CPP macros on Win32 platforms.])
fi
fi
AC_SUBST(EXTRA_DEFS)
AC_SUBST(EXTRA_LIB_DEFS)
dnl Check for dynamic linking
@ -614,6 +613,10 @@ esac
AC_PROG_AWK
## Remove fileblocks.o from the object list. This file gets added by
## the Autoconf macro AC_STRUCT_ST_BLOCKS. But there is no need.
LIBOBJS="`echo ${LIBOBJS} | sed 's/fileblocks\.o//g'`"
## If we're creating a shared library (using libtool!), then we'll
## need to generate a list of .lo files corresponding to the .o files
## given in LIBOBJS. We'll call it LIBLOBJS.

View file

@ -1,3 +1,15 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* configure.in (EXTRA_DEFS): Follow-up patch. Using SCM_IMPORT
instead of __SCM_IMPORT__.
* readline.c (scm_readline_init_ports): Disable input/output
stream redirection for Win32. The readline package for Win32
does not support this. The guile-readline library works fine
for command line editing.
* readline.h (SCM_RL_API): Renamed __FOO__ macros into FOO.
2001-11-02 Marius Vollmer <mvo@zagadka.ping.de>
Support for native Win32. Thanks to Stefan Jahn!

View file

@ -20,7 +20,7 @@ AC_MINGW32
EXTRA_DEFS=""
if test "$MINGW32" = "yes" ; then
if test $enable_shared = yes ; then
EXTRA_DEFS="-D__SCM_IMPORT__ -D__READLINE_IMPORT__"
EXTRA_DEFS="-DSCM_IMPORT"
fi
fi
AC_SUBST(EXTRA_DEFS)

View file

@ -212,8 +212,10 @@ SCM_DEFINE (scm_readline, "%readline", 0, 4, 0,
(void *) SCM_UNPACK (text),
handle_error, 0);
#ifndef __MINGW32__
fclose (rl_instream);
fclose (rl_outstream);
#endif
--in_readline;
return ans;
@ -246,8 +248,10 @@ handle_error (void *data, SCM tag, SCM args)
rl_free_line_state ();
rl_cleanup_after_signal ();
fputc ('\n', rl_outstream); /* We don't want next output on this line */
#ifndef __MINGW32__
fclose (rl_instream);
fclose (rl_outstream);
#endif
--in_readline;
scm_handle_by_throw (data, tag, args);
return SCM_UNSPECIFIED; /* never reached */
@ -317,8 +321,10 @@ scm_readline_init_ports (SCM inp, SCM outp)
}
input_port = inp;
#ifndef __MINGW32__
rl_instream = stream_from_fport (inp, "r", s_scm_readline);
rl_outstream = stream_from_fport (outp, "w", s_scm_readline);
#endif
}
@ -482,9 +488,12 @@ find_matching_paren(int k)
static int
match_paren (int x, int k)
{
int tmp, fno;
int tmp;
#ifndef __MINGW32__
int fno;
SELECT_TYPE readset;
struct timeval timeout;
#endif
rl_insert (x, k);
if (!SCM_READLINE_BOUNCE_PARENS)
@ -495,12 +504,14 @@ match_paren (int x, int k)
&& rl_line_buffer[rl_point - 2] == '\\')
return 0;
#ifndef __MINGW32__
tmp = 1000 * SCM_READLINE_BOUNCE_PARENS;
timeout.tv_sec = tmp / 1000000;
timeout.tv_usec = tmp % 1000000;
FD_ZERO (&readset);
fno = fileno (rl_instream);
FD_SET (fno, &readset);
#endif
if (rl_point > 1)
{
@ -509,7 +520,12 @@ match_paren (int x, int k)
if (rl_point > -1)
{
rl_redisplay ();
#ifndef __MINGW32__
scm_internal_select (fno + 1, &readset, NULL, NULL, &timeout);
#else
WaitForSingleObject (GetStdHandle(STD_INPUT_HANDLE),
SCM_READLINE_BOUNCE_PARENS);
#endif
}
rl_point = tmp;
}
@ -545,7 +561,9 @@ scm_init_readline ()
#include "guile-readline/readline.x"
scm_readline_completion_function_var
= scm_c_define ("*readline-completion-function*", SCM_BOOL_F);
#ifndef __MINGW32__
rl_getc_function = current_input_getc;
#endif
rl_redisplay_function = redisplay;
#if defined (_RL_FUNCTION_TYPEDEF)
rl_completion_entry_function = (rl_compentry_func_t*) completion_function;

View file

@ -24,10 +24,10 @@
which should be exported or imported in the resulting dynamic link
library in the Win32 port. */
#if defined (__SCM_RL_IMPORT__)
# define SCM_RL_API __declspec (dllimport)
#elif defined (__SCM_RL_EXPORT__) || defined (DLL_EXPORT)
# define SCM_RL_API __declspec (dllexport)
#if defined (SCM_RL_IMPORT)
# define SCM_RL_API __declspec (dllimport) extern
#elif defined (SCM_RL_EXPORT) || defined (DLL_EXPORT)
# define SCM_RL_API __declspec (dllexport) extern
#else
# define SCM_RL_API extern
#endif

View file

@ -1,3 +1,39 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* Makefile.am (libguile_la_LIBADD): Added $(THREAD_LIBS_LOCAL)
here (was at guile_LDADD) which describes the dependency
correctly and allows a clean build on Win32.
* __scm.h (SCM_API): Follow-up patch. Renamed __FOO__ macros
into FOO.
* __scm.h: USE_DLL_IMPORT indicates the usage of the DLL
import macros for external libraries (libcrypt, libqthreads,
libreadline and libregex).
* coop-defs.h: Include <winsock2.h> for `struct timeval'.
* posix.c (flock): Added support for flock() in M$-Windows.
* guile.c (SCM_IMPORT): Follow-up patch. Use SCM_IMPORT instead
of __SCM_IMPORT__.
* fports.c (getflags): Differentiate reading and writing pipes
descriptors.
* filesys.c (S_IS*): Redefine all of the S_IS*() macros for
M$-Windows.
* coop.c (coop_condition_variable_timed_wait_mutex): Use
conditionalized error code if `ETIMEDOUT' is not available.
(scm_thread_usleep): Remove bogus declaration of `struct timeval
timeout'.
* numbers.c (PTRDIFF_MIN): Moved this definition where it actually
belongs. That is because NO_PREPRO_MAGIC gets undefined after
each inclusion of `num2integral.i.c'.
(SIZE_MAX): Define NO_PREPRO_MAGIC if SIZE_MAX is undefined.
2001-11-03 Marius Vollmer <mvo@zagadka.ping.de>
* eval.c (scm_m_begin): Allow `(begin)`, with no subforms.

View file

@ -22,7 +22,7 @@
AUTOMAKE_OPTIONS = gnu
## Prevent automake from adding extra -I options
DEFS = @DEFS@ @EXTRA_LIB_DEFS@
DEFS = @DEFS@
## Check for headers in $(srcdir)/.., so that #include
## <libguile/MUMBLE.h> will find MUMBLE.h in this dir when we're
## building.
@ -35,7 +35,7 @@ lib_LTLIBRARIES = libguile.la
bin_PROGRAMS = guile guile_filter_doc_snarfage
guile_SOURCES = guile.c
guile_LDADD = libguile.la ${THREAD_LIBS_LOCAL}
guile_LDADD = libguile.la
guile_LDFLAGS = @DLPREOPEN@
guile_filter_doc_snarfage_SOURCES = c-tokenize.c
@ -115,7 +115,7 @@ noinst_HEADERS = coop-threads.c coop-threads.h coop.c \
num2integral.i.c num2float.i.c win32-uname.h win32-dirent.h
libguile_la_DEPENDENCIES = @LIBLOBJS@
libguile_la_LIBADD = @LIBLOBJS@ $(LIBLTDL)
libguile_la_LIBADD = @LIBLOBJS@ $(LIBLTDL) $(THREAD_LIBS_LOCAL)
libguile_la_LDFLAGS = -version-info @LIBGUILE_INTERFACE_CURRENT@:@LIBGUILE_INTERFACE_REVISION@:@LIBGUILE_INTERFACE_AGE@ -export-dynamic -no-undefined
# These are headers visible as <guile/mumble.h>

View file

@ -159,11 +159,11 @@
/* SCM_API is a macro prepended to all function and data definitions
which should be exported or imported in the resulting dynamic link
library in the Win32 port. */
library (DLL) in the Win32 port. */
#if defined (__SCM_IMPORT__)
#if defined (SCM_IMPORT)
# define SCM_API __declspec (dllimport) extern
#elif defined (__SCM_EXPORT__) || defined (DLL_EXPORT)
#elif defined (SCM_EXPORT) || defined (DLL_EXPORT)
# define SCM_API __declspec (dllexport) extern
#else
# define SCM_API extern
@ -334,6 +334,16 @@ typedef long ptrdiff_t;
/* Define some additional CPP macros on Win32 platforms. */
#if USE_DLL_IMPORT
# define __REGEX_IMPORT__ 1
# define __CRYPT_IMPORT__ 1
# define __READLINE_IMPORT__ 1
# define QT_IMPORT 1
#endif
#include "libguile/tags.h"

View file

@ -63,6 +63,10 @@
#include "libguile/iselect.h"
#endif
#if HAVE_WINSOCK2_H
#include <winsock2.h>
#endif
#ifdef GUILE_PTHREAD_COMPAT
#include <pthread.h>
#endif

View file

@ -40,7 +40,7 @@
* If you do not wish that, delete this exception notice. */
/* $Id: coop.c,v 1.28 2001-10-06 16:30:20 mdj Exp $ */
/* $Id: coop.c,v 1.29 2001-11-04 15:52:29 ela Exp $ */
/* Cooperative thread library, based on QuickThreads */
@ -422,7 +422,13 @@ coop_condition_variable_timed_wait_mutex (coop_c *c,
const struct timespec *abstime)
{
coop_t *old, *t;
#ifdef ETIMEDOUT
int res = ETIMEDOUT;
#elif defined (WSAETIMEDOUT)
int res = WSAETIMEDOUT;
#else
int res = 0;
#endif
/* coop_mutex_unlock (m); */
t = coop_qget (&(m->waiting));
@ -842,7 +848,6 @@ scm_thread_usleep (unsigned long usec)
{
/* We're so cheap. */
scm_thread_sleep (usec / 1000000);
struct timeval timeout;
return 0; /* Maybe we should calculate actual time slept,
but this is faster... :) */
}

View file

@ -128,17 +128,60 @@
/* The MinGW gcc does not define the S_ISSOCK macro. Any other native Windows
compiler like BorlandC or MSVC has none of these macros defined. */
#ifdef __MINGW32__
# define _S_IFSOCK 0xC000
# define S_ISSOCK(mode) (((mode) & _S_IFMT) == _S_IFSOCK)
#endif
#if defined (__BORLANDC__) || defined (_MSC_VER)
# define _S_IFBLK 0x3000
# define S_ISBLK(mode) (((mode) & _S_IFMT) == _S_IFBLK)
# ifdef _S_IFIFO
# undef _S_IFIFO
# endif
# ifdef _S_IFCHR
# undef _S_IFCHR
# endif
# ifdef _S_IFBLK
# undef _S_IFBLK
# endif
# ifdef _S_IFDIR
# undef _S_IFDIR
# endif
# ifdef _S_IFREG
# undef _S_IFREG
# endif
# ifdef _S_IFSOCK
# undef _S_IFSOCK
# endif
# define _S_IFIFO 0x1000 /* FIFO */
# define _S_IFCHR 0x2000 /* Character */
# define _S_IFBLK 0x3000 /* Block */
# define _S_IFDIR 0x4000 /* Directory */
# define _S_IFREG 0x8000 /* Regular */
# define _S_IFSOCK 0xC000 /* Socket */
# ifdef S_ISBLK
# undef S_ISBLK
# endif
# ifdef S_ISFIFO
# undef S_ISFIFO
# endif
# ifdef S_ISCHR
# undef S_ISCHR
# endif
# ifdef S_ISDIR
# undef S_ISDIR
# endif
# ifdef S_ISREG
# undef S_ISREG
# endif
# ifdef S_ISSOCK
# undef S_ISSOCK
# endif
# define S_ISBLK(mode) (((mode) & _S_IFMT) == _S_IFBLK)
# define S_ISFIFO(mode) (((mode) & _S_IFMT) == _S_IFIFO)
# define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
# define S_ISDIR(mode) (((mode) & _S_IFMT) == _S_IFDIR)
# define S_ISREG(mode) (((mode) & _S_IFMT) == _S_IFREG)
#endif
# define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
# define S_ISDIR(mode) (((mode) & _S_IFMT) == _S_IFDIR)
# define S_ISREG(mode) (((mode) & _S_IFMT) == _S_IFREG)
# define S_ISSOCK(mode) (((mode) & _S_IFMT) == _S_IFSOCK)
#endif /* __MINGW32__ */
/* Some more definitions for the native Windows port. */
#ifdef __MINGW32__

View file

@ -380,7 +380,8 @@ static int getflags (int fdes)
{
/* Or an anonymous pipe handle ? */
if (buf.st_mode & _S_IFIFO)
flags = O_RDWR;
flags = PeekNamedPipe ((HANDLE) _get_osfhandle (fdes), NULL, 0,
NULL, NULL, NULL) ? O_RDONLY : O_WRONLY;
/* stdin ? */
else if (fdes == fileno (stdin) && isatty (fdes))
flags = O_RDONLY;

View file

@ -47,7 +47,7 @@
system. For now, please don't put interesting code in here. */
#ifdef __MINGW32__
# define __SCM_IMPORT__ 1
# define SCM_IMPORT 1
#endif
#include <libguile.h>

View file

@ -93,13 +93,13 @@ INTEGRAL2NUM (ITYPE n)
#define NEED_CHECK
#else
#ifdef UNSIGNED
/*#if MAX_VALUE > SCM_MOST_POSITIVE_FIXNUM*/
#if MAX_VALUE>SCM_MOST_POSITIVE_FIXNUM
#define NEED_CHECK
/*#endif*/
#endif
#else
/*#if MIN_VALUE<SCM_MOST_NEGATIVE_FIXNUM || MAX_VALUE>SCM_MOST_POSITIVE_FIXNUM*/
#if MIN_VALUE<SCM_MOST_NEGATIVE_FIXNUM || MAX_VALUE>SCM_MOST_POSITIVE_FIXNUM
#define NEED_CHECK
/*#endif*/
#endif
#endif
#endif

View file

@ -4258,22 +4258,6 @@ scm_i_big2dbl (SCM b)
# endif
#endif
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t) (-1))
#endif
#ifndef PTRDIFF_MIN
/* the below is not really guaranteed to work (I think), but probably does: */
#define PTRDIFF_MIN ((ptrdiff_t) ((ptrdiff_t)1 << (sizeof (ptrdiff_t)*8 - 1)))
/* this prevents num2integral.c.i from using PTRDIFF_MIN in
preprocessor expressions. */
#define NO_PREPRO_MAGIC
#endif
#ifndef PTRDIFF_MAX
#define PTRDIFF_MAX (~ PTRDIFF_MIN)
#endif
#define NUM2INTEGRAL scm_num2short
#define INTEGRAL2NUM scm_short2num
#define INTEGRAL2BIG scm_i_short2big
@ -4322,6 +4306,18 @@ scm_i_big2dbl (SCM b)
#define MAX_VALUE ULONG_MAX
#include "libguile/num2integral.i.c"
#ifndef PTRDIFF_MIN
/* the below is not really guaranteed to work (I think), but probably does: */
#define PTRDIFF_MIN ((ptrdiff_t) ((ptrdiff_t)1 << (sizeof (ptrdiff_t)*8 - 1)))
/* this prevents num2integral.c.i from using PTRDIFF_MIN in
preprocessor expressions. */
#define NO_PREPRO_MAGIC
#endif
#ifndef PTRDIFF_MAX
#define PTRDIFF_MAX (~ PTRDIFF_MIN)
#endif
#define NUM2INTEGRAL scm_num2ptrdiff
#define INTEGRAL2NUM scm_ptrdiff2num
#define INTEGRAL2BIG scm_i_ptrdiff2big
@ -4330,6 +4326,11 @@ scm_i_big2dbl (SCM b)
#define MAX_VALUE PTRDIFF_MAX
#include "libguile/num2integral.i.c"
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t) (-1))
#define NO_PREPRO_MAGIC
#endif
#define NUM2INTEGRAL scm_num2size
#define INTEGRAL2NUM scm_size2num
#define INTEGRAL2BIG scm_i_size2big

View file

@ -1502,7 +1502,73 @@ SCM_DEFINE (scm_getpass, "getpass", 1, 0, 0,
#undef FUNC_NAME
#endif /* HAVE_GETPASS */
#if HAVE_FLOCK
/* Wrapper function for flock() support under M$-Windows. */
#ifdef __MINGW32__
# include <io.h>
# include <sys/locking.h>
# include <errno.h>
# ifndef _LK_UNLCK
/* Current MinGW package fails to define this. *sigh* */
# define _LK_UNLCK 0
# endif
# define LOCK_EX 1
# define LOCK_UN 2
# define LOCK_SH 4
# define LOCK_NB 8
static int flock (int fd, int operation)
{
long pos, len;
int ret, err;
/* Disable invalid arguments. */
if (((operation & (LOCK_EX | LOCK_SH)) == (LOCK_EX | LOCK_SH)) ||
((operation & (LOCK_EX | LOCK_UN)) == (LOCK_EX | LOCK_UN)) ||
((operation & (LOCK_SH | LOCK_UN)) == (LOCK_SH | LOCK_UN)))
{
errno = EINVAL;
return -1;
}
/* Determine mode of operation and discard unsupported ones. */
if (operation == (LOCK_NB | LOCK_EX))
operation = _LK_NBLCK;
else if (operation & LOCK_UN)
operation = _LK_UNLCK;
else if (operation == LOCK_EX)
operation = _LK_LOCK;
else
{
errno = EINVAL;
return -1;
}
/* Save current file pointer and seek to beginning. */
if ((pos = lseek (fd, 0, SEEK_CUR)) == -1 || (len = filelength (fd)) == -1)
return -1;
lseek (fd, 0L, SEEK_SET);
/* Deadlock if necessary. */
do
{
ret = _locking (fd, operation, len);
}
while (ret == -1 && errno == EDEADLOCK);
/* Produce meaningful error message. */
if (errno == EACCES && operation == _LK_NBLCK)
err = EDEADLOCK;
else
err = errno;
/* Return to saved file position pointer. */
lseek (fd, pos, SEEK_SET);
errno = err;
return ret;
}
#endif /* __MINGW32__ */
#if HAVE_FLOCK || defined (__MINGW32__)
SCM_DEFINE (scm_flock, "flock", 2, 0, 0,
(SCM file, SCM operation),
"Apply or remove an advisory lock on an open file.\n"

View file

@ -1,3 +1,21 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* md/Makefile.am (EXTRA_DIST): Added `i386.asm'.
* md/i386.asm: New file. Contains the Intel syntax version for
nasm/tasm/masm of the file `i386.s'.
* qt.h.in: Definition of QT_API, QT_IMPORT and QT_EXPORT.
Prefixed each symbols which is meant to go into a DLL.
* Makefile.am (libqthreads_la_LDFLAGS): Put `-no-undefined'
into LDFLAGS to support linkers which do not allow unresolved
symbols inside shared libraries.
(EXTRA_DIST): Add `libqthreads.def', which is an export file
definition for M$-Windows. It defines exported symbols. This is
necessary because the M$VC linker does not know how to export
assembler symbols into a DLL.
2001-08-25 Marius Vollmer <mvo@zagadka.ping.de>
* Makefile.am, md/Makefile.am, time/Makefile.am:

View file

@ -34,7 +34,7 @@ INCLUDES = -I.. -I$(srcdir)/..
libqthreads_la_SOURCES = qt.c copyright.h
libqthreads_la_LIBADD = qtmds.lo qtmdc.lo
libqthreads_la_DEPENDENCIES = qtmds.lo qtmdc.lo
libqthreads_la_LDFLAGS = -rpath $(libdir) -version-info @LIBGUILEQTHREADS_INTERFACE_CURRENT@:@LIBGUILEQTHREADS_INTERFACE_REVISION@:@LIBGUILEQTHREADS_INTERFACE_AGE@ -export-dynamic
libqthreads_la_LDFLAGS = -rpath $(libdir) -version-info @LIBGUILEQTHREADS_INTERFACE_CURRENT@:@LIBGUILEQTHREADS_INTERFACE_REVISION@:@LIBGUILEQTHREADS_INTERFACE_AGE@ -export-dynamic -no-undefined
OMIT_DEPENDENCIES = axp.h hppa.h i386.h ksr.h m88k.h mips.h sparc.h vax.h
@ -48,4 +48,4 @@ qtdmdb.s:
${LN_S} ${srcdir}/${qtdmdb_s} qtdmdb.s
EXTRA_DIST = CHANGES README.MISC README.PORT b.h meas.c stp.c stp.h \
Makefile.base config
Makefile.base config libqthreads.def

10
qt/libqthreads.def Normal file
View file

@ -0,0 +1,10 @@
LIBRARY libqthreads
DESCRIPTION "libqthreads: QuickThreads Library"
EXPORTS
qt_abort
qt_block
qt_blocki
qt_error
qt_null
qt_vargs
qt_vstart

View file

@ -27,4 +27,4 @@ hppa-cnx.Makefile hppa.Makefile hppa.h hppa.s hppa_b.s i386.README \
i386.h i386.s i386_b.s ksr1.Makefile ksr1.h ksr1.s ksr1_b.s \
m88k.Makefile m88k.c m88k.h m88k.s m88k_b.s mips-irix5.s mips.h mips.s \
mips_b.s null.README null.c solaris.README sparc.h sparc.s sparc_b.s \
vax.h vax.s vax_b.s
vax.h vax.s vax_b.s i386.asm

112
qt/md/i386.asm Normal file
View file

@ -0,0 +1,112 @@
;; i386.asm -- assembly support.
;;
;; QuickThreads -- Threads-building toolkit.
;; Copyright (c) 2001 Free Software Foundation, Inc.
;;
;; Permission to use, copy, modify and distribute this software and
;; its documentation for any purpose and without fee is hereby
;; granted, provided that the above copyright notice and this notice
;; appear in all copies. This software is provided as a
;; proof-of-concept and for demonstration purposes; there is no
;; representation about the suitability of this software for any
;; purpose.
;; NOTE: double-labeled `_name' and `name' for System V compatability.
;; NOTE: Comment lines start like this one, or with '//' ONLY. Sorry!
;; Callee-save: %esi, %edi, %ebx, %ebp
;; Caller-save: %eax, %ecx
;; Can't tell: %edx (seems to work w/o saving it.)
;;
;; Assignment:
;;
;; See ``i386.h'' for the somewhat unconventional stack layout.
.386p
.model flat
.code
public _qt_abort
public qt_abort
public _qt_block
public qt_block
public _qt_blocki
public qt_blocki
;; These all have the type signature
;;
;; void *blocking (helper, arg0, arg1, new)
;;
;; On procedure entry, the helper is at 4(sp), args at 8(sp) and
;; 12(sp) and the new thread's sp at 16(sp). It *appears* that the
;; calling convention for the 8X86 requires the caller to save all
;; floating-point registers, this makes our life easy.
;; Halt the currently-running thread. Save it's callee-save regs on
;; to the stack, 32 bytes. Switch to the new stack (next == 16+32(sp))
;; and call the user function (f == 4+32(sp) with arguments: old sp
;; arg1 (8+32(sp)) and arg2 (12+32(sp)). When the user function is
;; done, restore the new thread's state and return.
;;
;; `qt_abort' is (currently) an alias for `qt_block' because most of
;; the work is shared. We could save the insns up to `qt_common' by
;; replicating, but w/o replicating we need an inital subtract (to
;; offset the stack as if it had been a qt_block) and then a jump
;; to qt_common. For the cost of a jump, we might as well just do
;; all the work.
;;
;; The helper function (4(sp)) can return a void* that is returned
;; by the call to `qt_blockk{,i}'. Since we don't touch %eax in
;; between, we get that ``for free''.
_qt_abort:
qt_abort:
_qt_block:
qt_block:
_qt_blocki:
qt_blocki:
push ebp ; Save callee-save, sp-=4.
push esi ; Save callee-save, sp-=4.
push edi ; Save callee-save, sp-=4.
push ebx ; Save callee-save, sp-=4.
mov eax, esp ; Remember old stack pointer.
qt_common:
mov esp, [esp+32] ; Move to new thread.
push [eax+28] ; Push arg 2.
push [eax+24] ; Push arg 1.
push eax ; Push arg 0.
mov ebx, [eax+20] ; Get function to call.
call ebx ; Call f.
add esp, 12 ; Pop args.
pop ebx ; Restore callee-save, sp+=4.
pop edi ; Restore callee-save, sp+=4.
pop esi ; Restore callee-save, sp+=4.
pop ebp ; Restore callee-save, sp+=4.
ret ; Resume the stopped function.
hlt
;; Start a varargs thread.
public _qt_vstart
public qt_vstart
_qt_vstart:
qt_vstart:
push edi ; Push `pt' arg to `startup'.
call ebp ; Call `startup'.
pop eax ; Clean up the stack.
call ebx ; Call the user's function.
push eax ; Push return from user's.
push edi ; Push `pt' arg to `cleanup'.
call esi ; Call `cleanup'.
hlt ; `cleanup' never returns.
end

View file

@ -58,7 +58,7 @@ typedef unsigned long qt_word_t;
/* What to do to start a varargs thread running. */
extern void qt_vstart (void);
QT_API void qt_vstart (void);
/* Hold 4 saved regs plus two return pcs (qt_error, qt_start) plus
@ -101,7 +101,7 @@ extern void qt_vstart (void);
pop off (preincrement, postdecrement). */
#define QT_GROW_DOWN
extern void qt_error (void);
QT_API void qt_error (void);
/* Push on the error return address. */
#define QT_ARGS_MD(sto) \

View file

@ -1,6 +1,14 @@
#ifndef QT_H
#define QT_H
#if defined (QT_IMPORT)
# define QT_API __declspec (dllimport) extern
#elif defined (QT_EXPORT) || defined (DLL_EXPORT)
# define QT_API __declspec (dllexport) extern
#else
# define QT_API extern
#endif
#ifdef __cplusplus
extern "C" {
#endif
@ -126,7 +134,7 @@ typedef void (qt_cleanup_t)(void *pt, void *vuserf_return);
#define QT_VADJ(sp) (((char *)sp) + QT_VSTKBASE)
#endif
extern qt_t *qt_vargs (qt_t *sp, int nbytes, void *vargs,
QT_API qt_t *qt_vargs (qt_t *sp, int nbytes, void *vargs,
void *pt, qt_startup_t *startup,
qt_vuserf_t *vuserf, qt_cleanup_t *cleanup);
@ -137,8 +145,8 @@ extern qt_t *qt_vargs (qt_t *sp, int nbytes, void *vargs,
#endif
extern void qt_null (void);
extern void qt_error (void);
QT_API void qt_null (void);
QT_API void qt_error (void);
/* Save the state of the thread and call the helper function
using the stack of the new thread. */
@ -149,7 +157,7 @@ typedef void *(qt_block_t)(qt_helper_t *helper, void *a0, void *a1,
/* Rearrange the parameters so that things passed to the helper
function are already in the right argument registers. */
#ifndef QT_ABORT
extern void qt_abort (qt_helper_t *h, void *a0, void *a1, qt_t *newthread);
QT_API void qt_abort (qt_helper_t *h, void *a0, void *a1, qt_t *newthread);
/* The following does, technically, `return' a value, but the
user had better not rely on it, since the function never
returns. */
@ -158,14 +166,14 @@ extern void qt_abort (qt_helper_t *h, void *a0, void *a1, qt_t *newthread);
#endif
#ifndef QT_BLOCK
extern void *qt_block (qt_helper_t *h, void *a0, void *a1,
QT_API void *qt_block (qt_helper_t *h, void *a0, void *a1,
qt_t *newthread);
#define QT_BLOCK(h, a0, a1, newthread) \
(qt_block (h, a0, a1, newthread))
#endif
#ifndef QT_BLOCKI
extern void *qt_blocki (qt_helper_t *h, void *a0, void *a1,
QT_API void *qt_blocki (qt_helper_t *h, void *a0, void *a1,
qt_t *newthread);
#define QT_BLOCKI(h, a0, a1, newthread) \
(qt_blocki (h, a0, a1, newthread))

View file

@ -1,3 +1,8 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* srfi-13.h, srfi-14.h, srfi-4.h: Follow-up patch. Renamed
__FOO__ macros into FOO.
2001-11-03 Marius Vollmer <mvo@zagadka.ping.de>
* Makefile.am (libguile_srfi_srfi_4_la_LIBADD,

View file

@ -50,9 +50,9 @@
which should be exported or imported in the resulting dynamic link
library in the Win32 port. */
#if defined (__SCM_SRFI1314_IMPORT__)
#if defined (SCM_SRFI1314_IMPORT)
# define SCM_SRFI1314_API __declspec (dllimport) extern
#elif defined (__SCM_SRFI1314_EXPORT__) || defined (DLL_EXPORT)
#elif defined (SCM_SRFI1314_EXPORT) || defined (DLL_EXPORT)
# define SCM_SRFI1314_API __declspec (dllexport) extern
#else
# define SCM_SRFI1314_API extern
@ -137,8 +137,4 @@ SCM_SRFI1314_API SCM scm_string_tokenize (SCM s, SCM token_char, SCM start, SCM
SCM_SRFI1314_API SCM scm_string_filter (SCM s, SCM char_pred, SCM start, SCM end);
SCM_SRFI1314_API SCM scm_string_delete (SCM s, SCM char_pred, SCM start, SCM end);
#endif /* SCM_SRFI_13_H */

View file

@ -50,9 +50,9 @@
which should be exported or imported in the resulting dynamic link
library in the Win32 port. */
#if defined (__SCM_SRFI1314_IMPORT__)
#if defined (SCM_SRFI1314_IMPORT)
# define SCM_SRFI1314_API __declspec (dllimport) extern
#elif defined (__SCM_SRFI1314_EXPORT__) || defined (DLL_EXPORT)
#elif defined (SCM_SRFI1314_EXPORT) || defined (DLL_EXPORT)
# define SCM_SRFI1314_API __declspec (dllexport) extern
#else
# define SCM_SRFI1314_API extern

View file

@ -50,9 +50,9 @@
which should be exported or imported in the resulting dynamic link
library in the Win32 port. */
#if defined (__SCM_SRFI4_IMPORT__)
#if defined (SCM_SRFI4_IMPORT)
# define SCM_SRFI4_API __declspec (dllimport) extern
#elif defined (__SCM_SRFI4_EXPORT__) || defined (DLL_EXPORT)
#elif defined (SCM_SRFI4_EXPORT) || defined (DLL_EXPORT)
# define SCM_SRFI4_API __declspec (dllexport) extern
#else
# define SCM_SRFI4_API extern

View file

@ -1,3 +1,8 @@
2001-11-04 Stefan Jahn <stefan@lkcc.org>
* tests/ports.test: Run (close-port) before (delete-file) if
necessary/advisory.
2001-10-26 Dirk Herrmann <D.Herrmann@tu-bs.de>
* tests/eval.test: Added tests for promises.

View file

@ -91,6 +91,7 @@
(seek port -2 SEEK_END)
(pass-if "file: r/w 4"
(char=? (read-char port) #\s))
(close-port port)
(delete-file filename))
;;; Unbuffered input/output port with seeking.
@ -110,6 +111,7 @@
(seek port -2 SEEK_END)
(pass-if "file: ub r/w 4"
(char=? (read-char port) #\s))
(close-port port)
(delete-file filename))
;;; Buffered output-only and input-only ports with seeking.
@ -155,7 +157,8 @@
(pass-if "file: read back NUL 2"
(char=? (string-ref line 3) #\nul))
(pass-if "file: EOF"
(eof-object? (read-char port))))
(eof-object? (read-char port)))
(close-port port))
(delete-file filename))
;;; line buffering mode.