X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=os2%2Fos2ish.h;h=0da62aad27b0ed5ee5d7b8f3d6e259f551c01b9e;hb=9483776f29dbf67c9f5f68dcc7dd77bf0eb0eeb5;hp=360da42aef074899468fe79eea5ade57185ac40e;hpb=23b847786cf7d86c6da9c7a772a1aef6918eee65;p=p5sagit%2Fp5-mst-13.2.git diff --git a/os2/os2ish.h b/os2/os2ish.h index 360da42..0da62aa 100644 --- a/os2/os2ish.h +++ b/os2/os2ish.h @@ -99,7 +99,7 @@ # undef I_SYS_UN #endif -#ifdef USE_5005THREADS +#ifdef USE_ITHREADS #define do_spawn(a) os2_do_spawn(aTHX_ (a)) #define do_aspawn(a,b,c) os2_do_aspawn(aTHX_ (a),(b),(c)) @@ -184,7 +184,7 @@ extern int rc; # define pthread_getspecific(k) (*(k)) # define pthread_setspecific(k,v) (*(k)=(v),0) # define pthread_key_create(keyp,flag) \ - ( DosAllocThreadLocalMemory(1,(U32*)keyp) \ + ( DosAllocThreadLocalMemory(1,(unsigned long**)keyp) \ ? Perl_croak_nocontext("LocalMemory"),1 \ : 0 \ ) @@ -202,12 +202,10 @@ int pthread_create(pthread_t *tid, const pthread_attr_t *attr, #define THREADS_ELSEWHERE -#else /* USE_5005THREADS */ +#else /* USE_ITHREADS */ #define do_spawn(a) os2_do_spawn(a) #define do_aspawn(a,b,c) os2_do_aspawn((a),(b),(c)) - -#endif /* USE_5005THREADS */ void Perl_OS2_init(char **); void Perl_OS2_init3(char **envp, void **excH, int flags); @@ -220,6 +218,7 @@ void Perl_OS2_term(void **excH, int exitstatus, int flags); # define PERL_SYS_INIT3(argcp, argvp, envp) \ { void *xreg[2]; \ + MALLOC_CHECK_TAINT(*argcp, *argvp, *envp) \ _response(argcp, argvp); \ _wildcard(argcp, argvp); \ Perl_OS2_init3(*envp, xreg, 0) @@ -299,7 +298,7 @@ void *sys_alloc(int size); #endif #define TMPPATH1 "plXXXXXX" -extern char *tmppath; +extern const char *tmppath; PerlIO *my_syspopen(pTHX_ char *cmd, char *mode); /* Cannot prototype with I32 at this point. */ int my_syspclose(PerlIO *f); @@ -312,6 +311,28 @@ void my_setpwent (void); void my_endpwent (void); char *gcvt_os2(double value, int digits, char *buffer); +#define MAX_SLEEP (((1<30) / (1000/4))-1) /* 1<32 msec */ + +static __inline__ unsigned +my_sleep(unsigned sec) +{ + int remain; + while (sec > MAX_SLEEP) { + sec -= MAX_SLEEP; + remain = sleep(MAX_SLEEP); + if (remain) + return remain + sec; + } + return sleep(sec); +} + +#define sleep my_sleep + +#ifndef INCL_DOS +unsigned long DosSleep(unsigned long); +unsigned long DosAllocThreadLocalMemory (unsigned long cb, unsigned long **p); +#endif + struct group *getgrent (void); void setgrent (void); void endgrent (void); @@ -330,6 +351,9 @@ struct passwd *my_getpwnam (__const__ char *); #define strtoll _strtoll #define strtoull _strtoull +#define usleep(usec) ((void)_sleep2(((usec)+500)/1000)) + + /* * fwrite1() should be a routine with the same calling sequence as fwrite(), * but which outputs all of the bytes requested as a single stream (unlike @@ -357,6 +381,8 @@ void *emx_realloc (void *, size_t); #include /* before the following definitions */ #include /* before the following definitions */ +#include +#include #define chdir _chdir2 #define getcwd _getcwd2 @@ -372,6 +398,16 @@ void *emx_realloc (void *, size_t); #define PERLIO_IS_BINMODE_FD(fd) _PERLIO_IS_BINMODE_FD(fd) +#ifdef __GNUG__ +# define HAS_BOOL +#endif +#ifndef HAS_BOOL +# define bool char +# define HAS_BOOL 1 +#endif + +#include /* for _fd_flags() prototype */ + static inline bool _PERLIO_IS_BINMODE_FD(int fd) { @@ -389,15 +425,19 @@ char *ctermid(char *s); #if OS2_STAT_HACK #define Stat(fname,bufptr) os2_stat((fname),(bufptr)) -#define Fstat(fd,bufptr) fstat((fd),(bufptr)) +#define Fstat(fd,bufptr) os2_fstat((fd),(bufptr)) #define Fflush(fp) fflush(fp) #define Mkdir(path,mode) mkdir((path),(mode)) +#define chmod(path,mode) os2_chmod((path),(mode)) #undef S_IFBLK #undef S_ISBLK -#define S_IFBLK 0120000 +#define S_IFBLK 0120000 /* Hacks to make things compile... */ #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) +int os2_chmod(const char *name, int pmode); +int os2_fstat(int handle, struct stat *st); + #else #define Stat(fname,bufptr) stat((fname),(bufptr)) @@ -424,6 +464,7 @@ typedef struct OS2_Perl_data { unsigned long phmq_refcnt; unsigned long phmq_servers; unsigned long initial_mode; /* VIO etc. mode we were started in */ + unsigned long morph_refcnt; } OS2_Perl_data_t; extern OS2_Perl_data_t OS2_Perl_data; @@ -447,6 +488,7 @@ extern OS2_Perl_data_t OS2_Perl_data; #define Perl_hmq_refcnt (OS2_Perl_data.phmq_refcnt) #define Perl_hmq_servers (OS2_Perl_data.phmq_servers) #define Perl_os2_initial_mode (OS2_Perl_data.initial_mode) +#define Perl_morph_refcnt (OS2_Perl_data.morph_refcnt) unsigned long Perl_hab_GET(); unsigned long Perl_Register_MQ(int serve); @@ -599,6 +641,44 @@ enum entries_ordinals { ORD_WinQueryDesktopWindow, ORD_WinSetActiveWindow, ORD_DosQueryModFromEIP, + ORD_Dos32QueryHeaderInfo, + ORD_DosTmrQueryFreq, + ORD_DosTmrQueryTime, + ORD_WinQueryActiveDesktopPathname, + ORD_WinInvalidateRect, + ORD_WinCreateFrameControls, + ORD_WinQueryClipbrdFmtInfo, + ORD_WinQueryClipbrdOwner, + ORD_WinQueryClipbrdViewer, + ORD_WinQueryClipbrdData, + ORD_WinOpenClipbrd, + ORD_WinCloseClipbrd, + ORD_WinSetClipbrdData, + ORD_WinSetClipbrdOwner, + ORD_WinSetClipbrdViewer, + ORD_WinEnumClipbrdFmts, + ORD_WinEmptyClipbrd, + ORD_WinAddAtom, + ORD_WinFindAtom, + ORD_WinDeleteAtom, + ORD_WinQueryAtomUsage, + ORD_WinQueryAtomName, + ORD_WinQueryAtomLength, + ORD_WinQuerySystemAtomTable, + ORD_WinCreateAtomTable, + ORD_WinDestroyAtomTable, + ORD_WinOpenWindowDC, + ORD_DevOpenDC, + ORD_DevQueryCaps, + ORD_DevCloseDC, + ORD_WinMessageBox, + ORD_WinMessageBox2, + ORD_WinQuerySysValue, + ORD_WinSetSysValue, + ORD_WinAlarm, + ORD_WinFlashWindow, + ORD_WinLoadPointer, + ORD_WinQuerySysPointer, ORD_NENTRIES }; @@ -658,17 +738,39 @@ void CroakWinError(int die, char *name); #define PERLLIB_MANGLE(s, n) perllib_mangle((s), (n)) char *perllib_mangle(char *, unsigned int); +#define fork fork_with_resources + +#ifdef EINTR /* x2p do not include perl.h!!! */ +static __inline__ int +my_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) +{ + if (nfds == 0 && timeout && (_emx_env & 0x200)) { + if (DosSleep(1000 * timeout->tv_sec + (timeout->tv_usec + 500)/1000) == 0) + return 0; + errno = EINTR; + return -1; + } + return select(nfds, readfds, writefds, exceptfds, timeout); +} + +#define select my_select +#endif + + typedef int (*Perl_PFN)(); Perl_PFN loadByOrdinal(enum entries_ordinals ord, int fail); extern const Perl_PFN * const pExtFCN; char *os2error(int rc); int os2_stat(const char *name, struct stat *st); +int fork_with_resources(); int setpriority(int which, int pid, int val); int getpriority(int which /* ignored */, int pid); +void croak_with_os2error(char *s) __attribute__((noreturn)); + #ifdef PERL_CORE int os2_do_spawn(pTHX_ char *cmd); -int os2_do_aspawn(pTHX_ SV *really, void **vmark, void **vsp); +int os2_do_aspawn(pTHX_ SV *really, SV **vmark, SV **vsp); #endif #ifndef LOG_DAEMON