Changeset 2242 for trunk/src


Ignore:
Timestamp:
Dec 29, 1999, 9:36:10 AM (26 years ago)
Author:
phaller
Message:

Fix: memory leak in Dart thread callback functions

Location:
trunk/src/winmm
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/winmm/dwaveout.cpp

    r1463 r2242  
    1 /* $Id: dwaveout.cpp,v 1.10 1999-10-26 22:47:23 phaller Exp $ */
     1/* $Id: dwaveout.cpp,v 1.11 1999-12-29 08:33:55 phaller Exp $ */
    22
    33/*
     
    4949/******************************************************************************/
    5050/******************************************************************************/
    51 DartWaveOut::DartWaveOut(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance)
     51DartWaveOut::DartWaveOut(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance, USHORT usSel)
    5252{
    5353   Init(pwfx);
    5454
    55    mthdCallback         = (LPDRVCALLBACK)nCallback;
     55   mthdCallback         = (LPDRVCALLBACK)nCallback; // callback function
     56   selCallback          = usSel;                    // callback win32 tib selector
    5657   this->dwInstance = dwInstance;
    5758
     
    7475void DartWaveOut::callback(HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2)
    7576{
    76   USHORT selTIB = SetWin32TIB();
     77  USHORT selTIB = GetFS(); // save current FS selector
     78
     79  dprintf(("WINMM:DartWaveOut::callback(HDRVR h=%08xh, UINT uMessage=%08xh, DWORD dwUser=%08xh, DWORD dw1=%08xh, DWORD dw2=%08xh)\n",
     80           h,
     81           uMessage,
     82           dwUser,
     83           dw1,
     84           dw2));
     85
     86  if (selCallback != 0)
     87    SetFS(selCallback);      // switch to callback win32 tib selector (stored in waveOutOpen)
     88  else
     89    dprintf(("WINMM:DartWaveOut::callback - selCallback is invalid"));
     90
     91  //@@@PH 1999/12/28 Shockwave Flashes seem to make assumptions on a
     92  // specific stack layout. Do we have the correct calling convention here?
    7793  mthdCallback(h,uMessage,dwUser,dw1,dw2);
    78   SetFS(selTIB);
     94  SetFS(selTIB);           // switch back to the saved FS selector
    7995}
    8096/******************************************************************************/
     
    94110   mthdCallback  = NULL;
    95111   hwndCallback  = 0;
     112   selCallback   = 0;
    96113   dwInstance    = 0;
    97114   ulError       = 0;
     115   selCallback   = 0;
    98116   State         = STATE_STOPPED;
    99117
     
    695713/******************************************************************************/
    696714/******************************************************************************/
    697 LONG APIENTRY WaveOutHandler(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
     715LONG APIENTRY WaveOutHandler(ULONG ulStatus,
     716                             PMCI_MIX_BUFFER pBuffer,
    698717                             ULONG ulFlags)
    699718{
    700  DartWaveOut *dwave;
    701  PTIB ptib;
    702  PPIB ppib;
    703 
    704   DosGetInfoBlocks(&ptib, &ppib);
    705 //  dprintf(("WaveOutHandler: thread %d prio %X", ptib->tib_ptib2->tib2_ultid, ptib->tib_ptib2->tib2_ulpri));
    706   if(pBuffer && pBuffer->ulUserParm) {
     719  // PTIB ptib;
     720  // PPIB ppib;
     721  // DosGetInfoBlocks(&ptib, &ppib);
     722  // dprintf(("WaveOutHandler: thread %d prio %X", ptib->tib_ptib2->tib2_ultid, ptib->tib_ptib2->tib2_ulpri));
     723
     724  DartWaveOut *dwave;
     725
     726  if(pBuffer && pBuffer->ulUserParm)
     727  {
    707728    dwave = (DartWaveOut *)pBuffer->ulUserParm;
    708729    dwave->handler(ulStatus, pBuffer, ulFlags);
  • trunk/src/winmm/dwaveout.h

    r1404 r2242  
    1 /* $Id: dwaveout.h,v 1.5 1999-10-22 18:09:16 sandervl Exp $ */
     1/* $Id: dwaveout.h,v 1.6 1999-12-29 08:33:56 phaller Exp $ */
    22
    33/*
     
    3232{
    3333public:
    34               DartWaveOut(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance);
     34              DartWaveOut(LPWAVEFORMATEX pwfx, ULONG nCallback, ULONG dwInstance, USHORT usSel);
    3535              DartWaveOut(LPWAVEFORMATEX pwfx, HWND hwndCallback);
    3636              DartWaveOut(LPWAVEFORMATEX pwfx);
     
    7272    int curFillPos, curPlayPos; //fillpos == pos in os2 mix buffer, bufpos == pos in win buffer
    7373
    74   // callback interface
    75   LPDRVCALLBACK mthdCallback;
    76   void          callback(HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
     74    // callback interface
     75    LPDRVCALLBACK mthdCallback; // pointer to win32 routine for the callback
     76    USHORT        selCallback;  // the win32 tib selector for the callback (saved at waveOutOpen)
     77    void          callback(HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
     78    HWND          hwndCallback;
     79    DWORD         dwInstance;
    7780
    78          HWND hwndCallback;
    79         DWORD dwInstance;
    80     WAVEHDR  *wavehdr, *curhdr;
     81    WAVEHDR  *wavehdr,
     82             *curhdr;
    8183
    82      BOOL fMixerSetup;
     84    BOOL fMixerSetup;
    8385
    84       VMutex *wmutex;
     86    VMutex *wmutex;
    8587                              // Linked list management
    8688              DartWaveOut*    next;                   // Next Timer
  • trunk/src/winmm/os2timer.cpp

    r763 r2242  
    1 /* $Id: os2timer.cpp,v 1.12 1999-08-31 20:22:27 phaller Exp $ */
     1/* $Id: os2timer.cpp,v 1.13 1999-12-29 08:33:56 phaller Exp $ */
    22
    33/*
     
    7979  : next(NULL)
    8080{
     81  dprintf(("WINMM:OS2Timer: OS2TimerResolution::OS2TimerResolution(%08xh,%08xh)\n",
     82           this,
     83           dwPeriod));
     84
    8185  // add to linked list
    8286  OS2TimerResolution *timeRes = OS2TimerResolution::sTimerResolutions;
     
    111115OS2TimerResolution::~OS2TimerResolution()
    112116{
     117  dprintf(("WINMM:OS2Timer: OS2TimerResolution::~OS2TimerResolution(%08xh)\n",
     118           this));
     119
     120
    113121  // remove from linked list
    114122  OS2TimerResolution *timeRes = OS2TimerResolution::sTimerResolutions;
     
    143151BOOL OS2TimerResolution::enterResolutionScope(int dwPeriod)
    144152{
     153  dprintf(("WINMM:OS2Timer: OS2TimerResolution::enterResolutionScope(%08xh)\n",
     154           dwPeriod));
     155
    145156  OS2TimerResolution* timeRes = new OS2TimerResolution(dwPeriod);
    146157  if (timeRes != NULL)
     
    165176BOOL OS2TimerResolution::leaveResolutionScope(int dwPeriod)
    166177{
     178  dprintf(("WINMM:OS2Timer: OS2TimerResolution::leaveResolutionScope(%08xh)\n",
     179           dwPeriod));
     180
    167181  OS2TimerResolution* timeRes = OS2TimerResolution::sTimerResolutions;
    168182
     
    210224    }
    211225
     226  dprintf(("WINMM:OS2Timer: OS2TimerResolution::queryCurrentResolution == %08xh\n",
     227           iMin));
     228
    212229  return iMin;
    213230}
     
    223240                  next(NULL)
    224241{
     242  dprintf(("WINMM:OS2Timer: OS2Timer::OS2Timer(%08xh)\n",
     243           this));
     244
    225245  OS2Timer *timer = OS2Timer::timers;
    226246
     
    238258  //TimerThreadID = _beginthread(TimerHlpHandler, NULL, 0x4000, (void *)this);
    239259  hTimerThread = CreateThread(NULL,
    240                               0x1000,
     260                              0x4000,
    241261                              (LPTHREAD_START_ROUTINE)TimerHlpHandler,
    242262                              (LPVOID)this,
     
    253273OS2Timer::~OS2Timer()
    254274{
     275  dprintf(("WINMM:OS2Timer: OS2Timer::~OS2Timer(%08xh)\n",
     276           this));
     277
    255278  OS2Timer *timer = OS2Timer::timers;
    256279
     
    276299                          int fuEvent)
    277300{
     301  dprintf(("WINMM:OS2Timer: OS2Timer::StartTimer(%08xh, %08xh, %08xh, %08xh, %08xh, %08xh)\n",
     302           this,
     303           period,
     304           resolution,
     305           lptc,
     306           dwUser,
     307           fuEvent));
     308
    278309  APIRET rc;
    279310
    280311  if(TimerThreadID == -1)
    281   {
    282312    return(FALSE);
    283   }
    284313
    285314  if(TimerStatus == Stopped)
     
    317346void OS2Timer::StopTimer()
    318347{
     348  dprintf(("WINMM:OS2Timer: OS2Timer::StopTimer(%08xh)\n",
     349           this));
     350
    319351  if(TimerStatus == Running)
    320352  {
     
    327359void OS2Timer::KillTimer()
    328360{
     361  dprintf(("WINMM:OS2Timer: OS2Timer::KillTimer(%08xh)\n",
     362           this));
     363
    329364  fFatal = TRUE;
    330365  DosStopTimer(TimerHandle);
     
    344379  USHORT  selTIB;
    345380
    346   dprintf(("WINMM: TimerHandler thread created\n"));
     381  dprintf(("WINMM: TimerHandler thread created (%08xh)\n",
     382           this));
    347383
    348384  rc = DosSetPriority (PRTYS_THREAD,        /* Change a single thread */
  • trunk/src/winmm/os2timer.h

    r762 r2242  
    1 /* $Id: os2timer.h,v 1.7 1999-08-31 19:24:03 phaller Exp $ */
     1/* $Id: os2timer.h,v 1.8 1999-12-29 08:36:10 phaller Exp $ */
    22
    33#ifndef __OS2TIMER_H__
     
    2424
    2525#define OS2TIMER_RESOLUTION_MINIMUM 32
    26 #define OS2TIMER_RESOLUTION_MAXIMUM 0x7fffffff
     26#define OS2TIMER_RESOLUTION_MAXIMUM 0x7ffffffe
    2727
    2828
  • trunk/src/winmm/time.cpp

    r1852 r2242  
    1 /* $Id: time.cpp,v 1.7 1999-11-26 21:49:22 phaller Exp $ */
     1/* $Id: time.cpp,v 1.8 1999-12-29 08:33:56 phaller Exp $ */
    22
    33/*
     
    164164// @@@PH 1999/10/26 hack for RA95
    165165  if (wDelay      < OS2TIMER_RESOLUTION_MINIMUM)
     166  {
     167    dprintf(("WINMM:Time:timeSetEvent - Warning: requested delay too low (%08xh)\n",
     168             wDelay));
    166169    wDelay = OS2TIMER_RESOLUTION_MINIMUM;
     170  }
    167171
    168172  if (wResolution < OS2TIMER_RESOLUTION_MINIMUM)
     173  {
     174    dprintf(("WINMM:Time:timeSetEvent - Warning: requested resolution too low (%08xh)\n",
     175             wResolution));
    169176    wResolution = OS2TIMER_RESOLUTION_MINIMUM;
     177  }
    170178
    171179
  • trunk/src/winmm/waveout.cpp

    r2168 r2242  
    1 /* $Id: waveout.cpp,v 1.7 1999-12-20 22:22:07 sandervl Exp $ */
     1/* $Id: waveout.cpp,v 1.8 1999-12-29 08:33:56 phaller Exp $ */
    22#undef DEBUG
    33/*
     
    3434/******************************************************************************/
    3535/******************************************************************************/
    36 ODINFUNCTION6(MMRESULT, waveOutOpen,
    37               LPHWAVEOUT, phwo,
    38               UINT, uDeviceID,
    39               const LPWAVEFORMATEX, pwfx,
    40               DWORD, dwCallback,
    41               DWORD, dwInstance,
    42               DWORD, fdwOpen)
     36
     37//@@@PH 1999/12/28 this function needs the win32 tib FS selector for callback purposes
     38//                 therefore, one cannot use ODINFUNCTION macro wrappers! The xxxFS
     39//                 macro passes in USHORT selFS as first parameter.
     40ODINFUNCTION6FS(MMRESULT, waveOutOpen,
     41                LPHWAVEOUT, phwo,
     42                UINT, uDeviceID,
     43                const LPWAVEFORMATEX, pwfx,
     44                DWORD, dwCallback,
     45                DWORD, dwInstance,
     46                DWORD, fdwOpen)
    4347{
    4448  MMRESULT rc;
     
    6266  }
    6367  else
    64   if(fdwOpen == CALLBACK_FUNCTION) {
    65         *phwo = (HWAVEOUT)new DartWaveOut(pwfx, dwCallback, dwInstance);
     68  if(fdwOpen == CALLBACK_FUNCTION)
     69  {
     70    //@@@PH 1999/12/28 save valid FS: to win32 TIB
     71        *phwo = (HWAVEOUT)new DartWaveOut(pwfx, dwCallback, dwInstance, selFS);
    6672  }
    6773  else  *phwo = (HWAVEOUT)new DartWaveOut(pwfx);
Note: See TracChangeset for help on using the changeset viewer.