X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FHsBase.h;h=c8fabba65845d1dd7b41987a2ae2730e99b97179;hb=HEAD;hp=57873e039b64b04270954077999289396e3c8dcb;hpb=b7564a80c1ce808319a396bafedd08fc97df05b3;p=ghc-base.git diff --git a/include/HsBase.h b/include/HsBase.h index 57873e0..c8fabba 100644 --- a/include/HsBase.h +++ b/include/HsBase.h @@ -9,9 +9,11 @@ #ifndef __HSBASE_H__ #define __HSBASE_H__ -#include "ghcconfig.h" - +#ifdef __NHC__ +# include "Nhc98BaseConfig.h" +#else #include "HsBaseConfig.h" +#endif /* ultra-evil... */ #undef PACKAGE_BUGREPORT @@ -20,6 +22,11 @@ #undef PACKAGE_TARNAME #undef PACKAGE_VERSION +/* Needed to get the macro version of errno on some OSs (eg. Solaris). + We must do this, because these libs are only compiled once, but + must work in both single-threaded and multi-threaded programs. */ +#define _REENTRANT 1 + #include "HsFFI.h" #include @@ -55,9 +62,6 @@ #if HAVE_STRING_H #include #endif -#if HAVE_DIRENT_H -#include -#endif #if HAVE_UTIME_H #include #endif @@ -86,7 +90,7 @@ #if HAVE_SYS_TIMES_H #include #endif -#if HAVE_WINSOCK_H && defined(mingw32_HOST_OS) +#if HAVE_WINSOCK_H && defined(__MINGW32__) #include #endif #if HAVE_LIMITS_H @@ -95,17 +99,24 @@ #if HAVE_WCTYPE_H #include #endif +#if HAVE_INTTYPES_H +# include +#elif HAVE_STDINT_H +# include +#endif -#if !defined(mingw32_HOST_OS) && !defined(irix_HOST_OS) +#if !defined(__MINGW32__) && !defined(irix_HOST_OS) # if HAVE_SYS_RESOURCE_H # include # endif #endif -#ifdef hpux_HOST_OS -#include -#define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b) -#define HAVE_GETRUSAGE +#if !HAVE_GETRUSAGE && HAVE_SYS_SYSCALL_H +# include +# if defined(SYS_GETRUSAGE) /* hpux_HOST_OS */ +# define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b) +# define HAVE_GETRUSAGE 1 +# endif #endif /* For System */ @@ -115,16 +126,17 @@ #if HAVE_VFORK_H #include #endif -#include "lockFile.h" -#include "dirUtils.h" #include "WCsubst.h" -#include "runProcess.h" +#if defined(__MINGW32__) +/* in Win32Utils.c */ +extern void maperrno (void); +extern HsWord64 getUSecOfDay(void); +#endif -#if defined(mingw32_HOST_OS) +#if defined(__MINGW32__) #include #include -#include "timeUtils.h" #include #include #endif @@ -134,71 +146,11 @@ #endif /* in inputReady.c */ -int inputReady(int fd, int msecs, int isSock); +extern int fdReady(int fd, int write, int msecs, int isSock); /* in Signals.c */ extern HsInt nocldstop; -#if !defined(mingw32_HOST_OS) -/* in execvpe.c */ -extern int execvpe(char *name, char *const argv[], char **envp); -extern void pPrPr_disableITimers (void); -#endif - -/* ----------------------------------------------------------------------------- - 64-bit operations, defined in longlong.c - -------------------------------------------------------------------------- */ - -#ifdef SUPPORT_LONG_LONGS - -StgInt stg_gtWord64 (StgWord64, StgWord64); -StgInt stg_geWord64 (StgWord64, StgWord64); -StgInt stg_eqWord64 (StgWord64, StgWord64); -StgInt stg_neWord64 (StgWord64, StgWord64); -StgInt stg_ltWord64 (StgWord64, StgWord64); -StgInt stg_leWord64 (StgWord64, StgWord64); - -StgInt stg_gtInt64 (StgInt64, StgInt64); -StgInt stg_geInt64 (StgInt64, StgInt64); -StgInt stg_eqInt64 (StgInt64, StgInt64); -StgInt stg_neInt64 (StgInt64, StgInt64); -StgInt stg_ltInt64 (StgInt64, StgInt64); -StgInt stg_leInt64 (StgInt64, StgInt64); - -StgWord64 stg_remWord64 (StgWord64, StgWord64); -StgWord64 stg_quotWord64 (StgWord64, StgWord64); - -StgInt64 stg_remInt64 (StgInt64, StgInt64); -StgInt64 stg_quotInt64 (StgInt64, StgInt64); -StgInt64 stg_negateInt64 (StgInt64); -StgInt64 stg_plusInt64 (StgInt64, StgInt64); -StgInt64 stg_minusInt64 (StgInt64, StgInt64); -StgInt64 stg_timesInt64 (StgInt64, StgInt64); - -StgWord64 stg_and64 (StgWord64, StgWord64); -StgWord64 stg_or64 (StgWord64, StgWord64); -StgWord64 stg_xor64 (StgWord64, StgWord64); -StgWord64 stg_not64 (StgWord64); - -StgWord64 stg_uncheckedShiftL64 (StgWord64, StgInt); -StgWord64 stg_uncheckedShiftRL64 (StgWord64, StgInt); -StgInt64 stg_uncheckedIShiftL64 (StgInt64, StgInt); -StgInt64 stg_uncheckedIShiftRL64 (StgInt64, StgInt); -StgInt64 stg_uncheckedIShiftRA64 (StgInt64, StgInt); - -StgInt64 stg_intToInt64 (StgInt); -StgInt stg_int64ToInt (StgInt64); -StgWord64 stg_int64ToWord64 (StgInt64); - -StgWord64 stg_wordToWord64 (StgWord); -StgWord stg_word64ToWord (StgWord64); -StgInt64 stg_word64ToInt64 (StgWord64); - -StgInt64 stg_integerToInt64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da); -StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da); - -#endif /* SUPPORT_LONG_LONGS */ - /* ----------------------------------------------------------------------------- INLINE functions. @@ -210,10 +162,8 @@ StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ #ifndef INLINE # if defined(_MSC_VER) # define INLINE extern __inline -# elif defined(__GNUC__) -# define INLINE extern inline # else -# define INLINE inline +# define INLINE static inline # endif #endif @@ -221,17 +171,17 @@ INLINE int __hscore_get_errno(void) { return errno; } INLINE void __hscore_set_errno(int e) { errno = e; } #if !defined(_MSC_VER) -INLINE int __hscore_s_isreg(m) { return S_ISREG(m); } -INLINE int __hscore_s_isdir(m) { return S_ISDIR(m); } -INLINE int __hscore_s_isfifo(m) { return S_ISFIFO(m); } -INLINE int __hscore_s_isblk(m) { return S_ISBLK(m); } -INLINE int __hscore_s_ischr(m) { return S_ISCHR(m); } -#ifdef S_ISSOCK -INLINE int __hscore_s_issock(m) { return S_ISSOCK(m); } +INLINE int __hscore_s_isreg(mode_t m) { return S_ISREG(m); } +INLINE int __hscore_s_isdir(mode_t m) { return S_ISDIR(m); } +INLINE int __hscore_s_isfifo(mode_t m) { return S_ISFIFO(m); } +INLINE int __hscore_s_isblk(mode_t m) { return S_ISBLK(m); } +INLINE int __hscore_s_ischr(mode_t m) { return S_ISCHR(m); } +#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__) +INLINE int __hscore_s_issock(mode_t m) { return S_ISSOCK(m); } #endif #endif -#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) +#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32) INLINE int __hscore_sigemptyset( sigset_t *set ) { return sigemptyset(set); } @@ -251,8 +201,13 @@ __hscore_sigdelset( sigset_t * set, int s ) INLINE int __hscore_sigismember( sigset_t * set, int s ) { return sigismember(set,s); } + +INLINE int +__hscore_utime( const char *file, const struct utimbuf *timep ) +{ return utime(file,timep); } #endif +// This is used by dph:Data.Array.Parallel.Arr.BUArr, and shouldn't be INLINE void * __hscore_memcpy_dst_off( char *dst, int dst_off, char *src, size_t sz ) { return memcpy(dst+dst_off, src, sz); } @@ -261,29 +216,19 @@ INLINE void * __hscore_memcpy_src_off( char *dst, char *src, int src_off, size_t sz ) { return memcpy(dst, src+src_off, sz); } -INLINE HsBool -__hscore_supportsTextMode() -{ -#if defined(mingw32_HOST_OS) - return HS_BOOL_FALSE; -#else - return HS_BOOL_TRUE; -#endif -} - INLINE HsInt __hscore_bufsiz() { return BUFSIZ; } -INLINE HsInt +INLINE int __hscore_seek_cur() { return SEEK_CUR; } -INLINE HsInt +INLINE int __hscore_o_binary() { #if defined(_MSC_VER) @@ -383,13 +328,13 @@ __hscore_o_nonblock( void ) #endif } -INLINE HsInt +INLINE int __hscore_seek_set( void ) { return SEEK_SET; } -INLINE HsInt +INLINE int __hscore_seek_end( void ) { return SEEK_END; @@ -403,14 +348,17 @@ __hscore_ftruncate( int fd, off_t where ) #elif defined(HAVE__CHSIZE) return _chsize(fd,where); #else +// ToDo: we should use _chsize_s() on Windows which allows a 64-bit +// offset, but it doesn't seem to be available from mingw at this time +// --SDM (01/2008) #error at least ftruncate or _chsize functions are required to build #endif } -INLINE HsInt -__hscore_setmode( HsInt fd, HsBool toBin ) +INLINE int +__hscore_setmode( int fd, HsBool toBin ) { -#if defined(mingw32_HOST_OS) || defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32) return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT); #else return 0; @@ -419,123 +367,63 @@ __hscore_setmode( HsInt fd, HsBool toBin ) #if __GLASGOW_HASKELL__ -INLINE HsInt -__hscore_PrelHandle_write( HsInt fd, HsAddr ptr, HsInt off, int sz ) -{ - return write(fd,(char *)ptr + off, sz); -} - -INLINE HsInt -__hscore_PrelHandle_read( HsInt fd, HsAddr ptr, HsInt off, int sz ) -{ - return read(fd,(char *)ptr + off, sz); - -} - -#if defined(mingw32_HOST_OS) || defined(_MSC_VER) -INLINE HsInt -__hscore_PrelHandle_send( HsInt fd, HsAddr ptr, HsInt off, int sz ) -{ - return send(fd,(char *)ptr + off, sz, 0); -} - -INLINE HsInt -__hscore_PrelHandle_recv( HsInt fd, HsAddr ptr, HsInt off, int sz ) -{ - return recv(fd,(char *)ptr + off, sz, 0); -} -#endif - #endif /* __GLASGOW_HASKELL__ */ -#if defined(mingw32_HOST_OS) || defined(_MSC_VER) -INLINE long * -__hscore_Time_ghcTimezone( void ) { return &_timezone; } - -INLINE char ** -__hscore_Time_ghcTzname( void ) { return _tzname; } -#endif - -INLINE HsInt -__hscore_mkdir( HsAddr pathName, HsInt mode ) -{ -#if defined(mingw32_HOST_OS) || defined(_MSC_VER) - return mkdir(pathName); +#if defined(__MINGW32__) +// We want the versions of stat/fstat/lseek that use 64-bit offsets, +// and you have to ask for those explicitly. Unfortunately there +// doesn't seem to be a 64-bit version of truncate/ftruncate, so while +// hFileSize and hSeek will work with large files, hSetFileSize will not. +typedef struct _stati64 struct_stat; +typedef off64_t stsize_t; #else - return mkdir(pathName,mode); +typedef struct stat struct_stat; +typedef off_t stsize_t; #endif -} INLINE HsInt -__hscore_lstat( HsAddr fname, HsAddr st ) +__hscore_sizeof_stat( void ) { -#if HAVE_LSTAT - return lstat((const char*)fname, (struct stat*)st); -#else - return stat((const char*)fname, (struct stat*)st); -#endif + return sizeof(struct_stat); } -#ifdef PATH_MAX -/* A size that will contain many path names, but not necessarily all - * (PATH_MAX is not defined on systems with unlimited path length, - * e.g. the Hurd). - */ -INLINE HsInt __hscore_long_path_size() { return PATH_MAX; } -#else -INLINE HsInt __hscore_long_path_size() { return 4096; } -#endif - -#ifdef R_OK -INLINE mode_t __hscore_R_OK() { return R_OK; } -#endif -#ifdef W_OK -INLINE mode_t __hscore_W_OK() { return W_OK; } -#endif -#ifdef X_OK -INLINE mode_t __hscore_X_OK() { return X_OK; } -#endif - -#ifdef S_IRUSR -INLINE mode_t __hscore_S_IRUSR() { return S_IRUSR; } -#endif -#ifdef S_IWUSR -INLINE mode_t __hscore_S_IWUSR() { return S_IWUSR; } -#endif -#ifdef S_IXUSR -INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; } +INLINE time_t __hscore_st_mtime ( struct_stat* st ) { return st->st_mtime; } +INLINE stsize_t __hscore_st_size ( struct_stat* st ) { return st->st_size; } +#if !defined(_MSC_VER) +INLINE mode_t __hscore_st_mode ( struct_stat* st ) { return st->st_mode; } +INLINE dev_t __hscore_st_dev ( struct_stat* st ) { return st->st_dev; } +INLINE ino_t __hscore_st_ino ( struct_stat* st ) { return st->st_ino; } #endif -INLINE HsAddr -__hscore_d_name( struct dirent* d ) -{ - return (HsAddr)(d->d_name); +#if defined(__MINGW32__) +INLINE int __hscore_stat(wchar_t *file, struct_stat *buf) { + return _wstati64(file,buf); } -INLINE HsInt -__hscore_end_of_dir( void ) +INLINE int __hscore_fstat(int fd, struct_stat *buf) { + return _fstati64(fd,buf); +} +INLINE int __hscore_lstat(wchar_t *fname, struct_stat *buf ) { - return READDIR_ERRNO_EOF; + return _wstati64(fname,buf); +} +#else +INLINE int __hscore_stat(char *file, struct_stat *buf) { + return stat(file,buf); } -INLINE void -__hscore_free_dirent(HsAddr dEnt) -{ -#if HAVE_READDIR_R - free(dEnt); -#endif +INLINE int __hscore_fstat(int fd, struct_stat *buf) { + return fstat(fd,buf); } -INLINE HsInt -__hscore_sizeof_stat( void ) +INLINE int __hscore_lstat( const char *fname, struct stat *buf ) { - return sizeof(struct stat); +#if HAVE_LSTAT + return lstat(fname, buf); +#else + return stat(fname, buf); +#endif } - -INLINE time_t __hscore_st_mtime ( struct stat* st ) { return st->st_mtime; } -INLINE off_t __hscore_st_size ( struct stat* st ) { return st->st_size; } -#if !defined(_MSC_VER) -INLINE mode_t __hscore_st_mode ( struct stat* st ) { return st->st_mode; } #endif #if HAVE_TERMIOS_H @@ -551,7 +439,7 @@ __hscore_ptr_c_cc( struct termios* ts ) INLINE HsInt __hscore_sizeof_termios( void ) { -#ifndef mingw32_HOST_OS +#ifndef __MINGW32__ return sizeof(struct termios); #else return 0; @@ -559,7 +447,7 @@ __hscore_sizeof_termios( void ) } #endif -#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) +#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32) INLINE HsInt __hscore_sizeof_sigset_t( void ) { @@ -644,6 +532,13 @@ INLINE int __hscore_sig_setmask( void ) #endif } +#ifndef __MINGW32__ +INLINE size_t __hscore_sizeof_siginfo_t (void) +{ + return sizeof(siginfo_t); +} +#endif + INLINE int __hscore_f_getfl( void ) { @@ -664,106 +559,133 @@ __hscore_f_setfl( void ) #endif } +INLINE int +__hscore_f_setfd( void ) +{ +#ifdef F_SETFD + return F_SETFD; +#else + return 0; +#endif +} + +INLINE long +__hscore_fd_cloexec( void ) +{ +#ifdef FD_CLOEXEC + return FD_CLOEXEC; +#else + return 0; +#endif +} + // defined in rts/RtsStartup.c. extern void* __hscore_get_saved_termios(int fd); extern void __hscore_set_saved_termios(int fd, void* ts); INLINE int __hscore_hs_fileno (FILE *f) { return fileno (f); } -INLINE int __hscore_open(char *file, int how, mode_t mode) { -#ifdef mingw32_HOST_OS +#ifdef __MINGW32__ +INLINE int __hscore_open(wchar_t *file, int how, mode_t mode) { if ((how & O_WRONLY) || (how & O_RDWR) || (how & O_APPEND)) - return _sopen(file,how,_SH_DENYRW,mode); + return _wsopen(file,how | _O_NOINHERIT,_SH_DENYRW,mode); + // _O_NOINHERIT: see #2650 else - return _sopen(file,how,_SH_DENYWR,mode); + return _wsopen(file,how | _O_NOINHERIT,_SH_DENYWR,mode); + // _O_NOINHERIT: see #2650 +} #else +INLINE int __hscore_open(char *file, int how, mode_t mode) { return open(file,how,mode); -#endif } +#endif // These are wrapped because on some OSs (eg. Linux) they are // macros which redirect to the 64-bit-off_t versions when large file // support is enabled. // +#if defined(__MINGW32__) +INLINE off64_t __hscore_lseek(int fd, off64_t off, int whence) { + return (_lseeki64(fd,off,whence)); +} +#else INLINE off_t __hscore_lseek(int fd, off_t off, int whence) { return (lseek(fd,off,whence)); } - -INLINE int __hscore_stat(char *file, struct stat *buf) { - return (stat(file,buf)); -} - -INLINE int __hscore_fstat(int fd, struct stat *buf) { - return (fstat(fd,buf)); -} +#endif // select-related stuff -#if !defined(mingw32_HOST_OS) +#if !defined(__MINGW32__) INLINE int hsFD_SETSIZE(void) { return FD_SETSIZE; } -INLINE void hsFD_CLR(int fd, fd_set *fds) { FD_CLR(fd, fds); } INLINE int hsFD_ISSET(int fd, fd_set *fds) { return FD_ISSET(fd, fds); } INLINE void hsFD_SET(int fd, fd_set *fds) { FD_SET(fd, fds); } -INLINE int sizeof_fd_set(void) { return sizeof(fd_set); } +INLINE HsInt sizeof_fd_set(void) { return sizeof(fd_set); } extern void hsFD_ZERO(fd_set *fds); #endif +INLINE int __hscore_select(int nfds, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds, struct timeval *timeout) { + return (select(nfds,readfds,writefds,exceptfds,timeout)); +} + // gettimeofday()-related -#if !defined(mingw32_HOST_OS) -#define TICK_FREQ 50 +#if !defined(__MINGW32__) INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); } -INLINE HsInt getTicksOfDay(void) +INLINE HsWord64 getUSecOfDay(void) { struct timeval tv; gettimeofday(&tv, (struct timezone *) NULL); - return (tv.tv_sec * TICK_FREQ + - tv.tv_usec * TICK_FREQ / 1000000); + // Don't forget to cast *before* doing the arithmetic, otherwise + // the arithmetic happens at the type of tv_sec, which is probably + // only 'int'. + return ((HsWord64)tv.tv_sec * 1000000 + (HsWord64)tv.tv_usec); } -INLINE void setTimevalTicks(struct timeval *p, HsInt ticks) +INLINE void setTimevalTicks(struct timeval *p, HsWord64 usecs) { - p->tv_sec = ticks / TICK_FREQ; - p->tv_usec = (ticks % TICK_FREQ) * (1000000 / TICK_FREQ); + p->tv_sec = usecs / 1000000; + p->tv_usec = usecs % 1000000; } -#endif /* !defined(mingw32_HOST_OS) */ +#endif /* !defined(__MINGW32__) */ + +#if darwin_HOST_OS +// You should not access _environ directly on Darwin in a bundle/shared library. +// See #2458 and http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/environ.7.html +#include +INLINE char **__hscore_environ() { return *(_NSGetEnviron()); } +#else +/* ToDo: write a feature test that doesn't assume 'environ' to + * be in scope at link-time. */ +extern char** environ; +INLINE char **__hscore_environ() { return environ; } +#endif -// Directory-related +/* lossless conversions between pointers and integral types */ +INLINE void * __hscore_from_uintptr(uintptr_t n) { return (void *)n; } +INLINE void * __hscore_from_intptr (intptr_t n) { return (void *)n; } +INLINE uintptr_t __hscore_to_uintptr (void *p) { return (uintptr_t)p; } +INLINE intptr_t __hscore_to_intptr (void *p) { return (intptr_t)p; } -#if defined(mingw32_HOST_OS) +void errorBelch2(const char*s, char *t); +void debugBelch2(const char*s, char *t); -/* Make sure we've got the reqd CSIDL_ constants in scope; - * w32api header files are lagging a bit in defining the full set. - */ -#if !defined(CSIDL_APPDATA) -#define CSIDL_APPDATA 0x001a -#endif -#if !defined(CSIDL_PERSONAL) -#define CSIDL_PERSONAL 0x0005 -#endif -#if !defined(CSIDL_PROFILE) -#define CSIDL_PROFILE 0x0028 -#endif -#if !defined(CSIDL_WINDOWS) -#define CSIDL_WINDOWS 0x0024 -#endif +#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__) -INLINE int __hscore_CSIDL_PROFILE() { return CSIDL_PROFILE; } -INLINE int __hscore_CSIDL_APPDATA() { return CSIDL_APPDATA; } -INLINE int __hscore_CSIDL_WINDOWS() { return CSIDL_WINDOWS; } -INLINE int __hscore_CSIDL_PERSONAL() { return CSIDL_PERSONAL; } -#endif +INLINE int fcntl_read(int fd, int cmd) { + return fcntl(fd, cmd); +} +INLINE int fcntl_write(int fd, int cmd, long arg) { + return fcntl(fd, cmd, arg); +} +INLINE int fcntl_lock(int fd, int cmd, struct flock *lock) { + return fcntl(fd, cmd, lock); +} -#if defined(mingw32_HOST_OS) -INLINE unsigned int __hscore_get_osver(void) { return _osver; } #endif -/* ToDo: write a feature test that doesn't assume 'environ' to - * be in scope at link-time. */ -extern char** environ; -INLINE char **__hscore_environ() { return environ; } - #endif /* __HSBASE_H__ */