From 52cd2f88cd6f67147534ca854da7f51aafead01e Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 24 May 2001 05:20:17 +0000 Subject: [PATCH] * exceptions.cc (handle_exceptions): Bump repeat count for debugging kick out. * fhandler.h (fhandler_dev_dsp): Add a fixup_after_exec. * fhandler_dsp.cc (class Audio): Add TOT_BLOCK_SIZE to enum. (operator new): New. (bigwavebuffer): Declare using TOT_BLOCK_SIZE to avoid buffer overruns. (Audio::Audio): Optimize slightly. (fhandler_dev_dsp::open): Allocate s_audio using static buffer. (fhandler_dev_dsp::fixup_after_exec): New function. Ditto. --- winsup/cygwin/ChangeLog | 13 +++++++++++++ winsup/cygwin/exceptions.cc | 2 +- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_dsp.cc | 32 +++++++++++++++++++++----------- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7ccbbb12c..cd668d360 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +Thu May 24 01:17:33 2001 Christopher Faylor + + * exceptions.cc (handle_exceptions): Bump repeat count for debugging + kick out. + + * fhandler.h (fhandler_dev_dsp): Add a fixup_after_exec. + * fhandler_dsp.cc (class Audio): Add TOT_BLOCK_SIZE to enum. + (operator new): New. + (bigwavebuffer): Declare using TOT_BLOCK_SIZE to avoid buffer overruns. + (Audio::Audio): Optimize slightly. + (fhandler_dev_dsp::open): Allocate s_audio using static buffer. + (fhandler_dev_dsp::fixup_after_exec): New function. Ditto. + Wed May 23 17:45:00 2001 Corinna Vinschen * syscalls.cc (seteuid): Restrict overriding external provided diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 3ddc28361..c124b9266 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -405,7 +405,7 @@ handle_exceptions (EXCEPTION_RECORD *e, void *, CONTEXT *in, void *) static int NO_COPY debugging = 0; static int NO_COPY recursed = 0; - if (debugging && ++debugging < 50000) + if (debugging && ++debugging < 500000) { SetThreadPriority (hMainThread, THREAD_PRIORITY_NORMAL); return 0; diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 7ed4d203a..aed8bfe6e 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -973,6 +973,7 @@ public: int close (void); int dup (fhandler_base * child); void dump (void); + void fixup_after_exec (HANDLE); }; #if 0 diff --git a/winsup/cygwin/fhandler_dsp.cc b/winsup/cygwin/fhandler_dsp.cc index c6d96c4e6..91049ae04 100644 --- a/winsup/cygwin/fhandler_dsp.cc +++ b/winsup/cygwin/fhandler_dsp.cc @@ -28,7 +28,12 @@ static void CALLBACK wave_callback (HWAVE hWave, UINT msg, DWORD instance, class Audio { public: - enum { MAX_BLOCKS = 12, BLOCK_SIZE = 16384 }; + enum + { + MAX_BLOCKS = 12, + BLOCK_SIZE = 16384, + TOT_BLOCK_SIZE = BLOCK_SIZE + sizeof (WAVEHDR) + }; Audio (); ~Audio (); @@ -43,6 +48,8 @@ public: void setformat (int format) {formattype_ = format;} int numbytesoutput (); + void *operator new (size_t, void *p) {return p;} + private: char *initialisebuffer (); void waitforcallback (); @@ -57,21 +64,17 @@ private: char *freeblocks_[MAX_BLOCKS]; int formattype_; - char bigwavebuffer_[MAX_BLOCKS * BLOCK_SIZE]; + char bigwavebuffer_[MAX_BLOCKS * TOT_BLOCK_SIZE]; }; +static char audio_buf[sizeof (class Audio)]; + Audio::Audio () { - int size = BLOCK_SIZE + sizeof (WAVEHDR); - InitializeCriticalSection (&lock_); - memset (freeblocks_, 0, sizeof (freeblocks_)); + memset (bigwavebuffer_, 0, sizeof (bigwavebuffer_)); for (int i = 0; i < MAX_BLOCKS; i++) - { - char *pBuffer = &bigwavebuffer_[i * size]; - memset (pBuffer, 0, size); - freeblocks_[i] = pBuffer; - } + freeblocks_[i] = &bigwavebuffer_[i * TOT_BLOCK_SIZE]; } Audio::~Audio () @@ -436,7 +439,7 @@ fhandler_dev_dsp::open (const char *path, int flags, mode_t mode = 0) set_flags (flags); if (!s_audio) - s_audio = new Audio; + s_audio = new (audio_buf) Audio; // Work out initial sample format & frequency if (strcmp (path, "/dev/dsp") == 0L) @@ -632,3 +635,10 @@ fhandler_dev_dsp::dump () { paranoid_printf ("here, fhandler_dev_dsp"); } + +void +fhandler_dev_dsp::fixup_after_exec (HANDLE) +{ + /* FIXME: Is there a better way to do this? */ + s_audio = new (audio_buf) Audio; +}