mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 11:43:31 +00:00
0623a6f3cf
Sun Jan 18 17:05:58 1998 Alexandre Julliard <julliard@lrc.epfl.ch> * [include/stackframe.h] [tools/build.c] Some cleanups in stack frame building. * [misc/port.c] Implemented clone() wrapper for libc5 users. * [scheduler/mutex.c] [scheduler/synchro.c] Implemented abandoned mutexes. * [scheduler/process.c] [scheduler/thread.c] We now create a process and a thread structure as soon as possible during initialization. * [scheduler/thread.c] [scheduler/sysdeps.c] Moved system-specific thread handling to sysdeps.c. Fri Jan 16 10:45:15 1998 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [graphics/ddraw.c][include/ddraw.h] Surface handling enhanced. Some stuff already works ;) * [multimedia/dsound.c][include/dsound.h] Implemented using the Open Sound System. Slowly starts to work (sounds terrible for some programs). * [configure.in][multimedia/audio.c][include/config.h.in] Added check for OpenSoundSystem, fixed -lXxf86dga check. Replaced OS #ifdefs by #ifdef HAVE_OSS in mm/audio.c. * [if1632/relay.c][relay32/relay386.c] Do not print control characters for 'str' or 'wstr' args. * [misc/registry.c] "" seems to equals NULL in keynames. Replace where needed. Seems to help the win95 regedit.exe... * [win32/newfns.c] Implemented QueryPerformance* using gettimeofday(2) (should be done using the pentium timers probably). * [tools/ipcl] Removed useless open_pipe construct. Sun Jan 11 17:10:02 1998 Huw D M Davies <h.davies1@physics.oxford.ac.uk> * [objects/region.c] [include/region.h] [graphics/x11drv/clipping.c] Regions are now internal to Wine. The basis of this code is taken from the X11 distribution. GetRegionData() is implemented as is ExtCreateRegion() (without Xforms). CreatePolyPolygonRgn() should behave correctly now. * [objects/metafile.c] [graphics/metafiledrv/graphics.c] [graphics/metafiledrv/init.c] [include/metafile.h] [include/metafiledrv.h] Playback of META_CREATEREGION should now work. Implemented recording of META_CREATEREGION and META_PAINTREGION. * [graphics/x11drv/graphics.c] FillRgn() (and therefore its friends) respect logical co-ords. Wed Jan 7 01:21:45 1998 Steinar Hamre <steinarh@stud.fim.ntnu.no> * [configure.in] [include/acconfig.h] [tools/build.c] Now checking whether to use .string or .ascii. * [configure.in] [include/acconfig.h] [scheduler/critsection.c] Defining union semun if this is not available from header files. * [misc/lstr.c] Moved wine's own header files below <wctype.h> to avoid parse error on Solaris. Sun Jan 4 15:38:07 1998 Andrew Taylor <ataylor@cadvision.com> * [multimedia/mmsystem.c] [multimedia/mmio.c] Implemented mmioSendMessage and rearranged the mmio subsystem in terms of this function. Wed Dec 24 00:51:29 1997 Charles Duffy <cduffy@bigfoot.com> * [windows/clipboard.c] [relay32/user32.spec] GetPriorityClipboardFormat32 now has something other than just a stub. I have no idea if it works (can't test until SetClipboardData is finished) but HEdit likes things a lot more this way.
92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
/*
|
|
* Misc. functions for systems that don't have them
|
|
*
|
|
* Copyright 1996 Alexandre Julliard
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
|
|
#ifndef HAVE_USLEEP
|
|
#ifdef __EMX__
|
|
unsigned int usleep (unsigned int useconds) { DosSleep(useconds); }
|
|
#else
|
|
unsigned int usleep (unsigned int useconds)
|
|
{
|
|
struct timeval delay;
|
|
|
|
delay.tv_sec = 0;
|
|
delay.tv_usec = useconds;
|
|
|
|
select( 0, 0, 0, 0, &delay );
|
|
return 0;
|
|
}
|
|
#endif
|
|
#endif /* HAVE_USLEEP */
|
|
|
|
#ifndef HAVE_MEMMOVE
|
|
void *memmove( void *dest, const void *src, unsigned int len )
|
|
{
|
|
register char *dst = dest;
|
|
|
|
/* Use memcpy if not overlapping */
|
|
if ((dst + len <= (char *)src) || ((char *)src + len <= dst))
|
|
{
|
|
memcpy( dst, src, len );
|
|
}
|
|
/* Otherwise do it the hard way (FIXME: could do better than this) */
|
|
else if (dst < src)
|
|
{
|
|
while (len--) *dst++ = *((char *)src)++;
|
|
}
|
|
else
|
|
{
|
|
dst += len - 1;
|
|
src = (char *)src + len - 1;
|
|
while (len--) *dst-- = *((char *)src)--;
|
|
}
|
|
return dest;
|
|
}
|
|
#endif /* HAVE_MEMMOVE */
|
|
|
|
#ifndef HAVE_STRERROR
|
|
const char *strerror( int err )
|
|
{
|
|
/* Let's hope we have sys_errlist then */
|
|
return sys_errlist[err];
|
|
}
|
|
#endif /* HAVE_STRERROR */
|
|
|
|
#if !defined(HAVE_CLONE) && defined(__linux__)
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <syscall.h>
|
|
int clone( int (*fn)(void *), void *stack, int flags, void *arg )
|
|
{
|
|
#ifdef __i386__
|
|
int ret;
|
|
void **stack_ptr = (void **)stack;
|
|
*--stack_ptr = arg; /* Push argument on stack */
|
|
*--stack_ptr = fn; /* Push function pointer (popped into ebx) */
|
|
__asm__ __volatile__( "pushl %%ebx\n\t"
|
|
"movl %2,%%ebx\n\t"
|
|
"int $0x80\n\t"
|
|
"popl %%ebx\n\t" /* Contains fn in the child */
|
|
"testl %%eax,%%eax\n\t"
|
|
"jnz 0f\n\t"
|
|
"call *%%ebx\n\t" /* Should never return */
|
|
"xorl %%eax,%%eax\n\t" /* Just in case it does*/
|
|
"0:"
|
|
: "=a" (ret)
|
|
: "0" (SYS_clone), "g" (flags), "c" (stack_ptr) );
|
|
assert( ret ); /* If ret is 0, we returned from the child function */
|
|
if (ret > 0) return ret;
|
|
errno = -ret;
|
|
return -1;
|
|
#else
|
|
errno = EINVAL;
|
|
return -1;
|
|
#endif /* __i386__ */
|
|
}
|
|
#endif /* !HAVE_CLONE && __linux__ */
|