/* * The lwp_scheduler thread periodically checks to see if any threads * are due to be resumed. If there are, it resumes them. Otherwise, * it computes the lesser of ( 1 second ) or ( the minimum time until * a thread need to be resumed ) and puts itself to sleep for that amount * of time. */ static void lwp_scheduler( int stackno ) { time_t now, min; struct timeval interval; tl_t *t; while ( !sglob->slurpd_shutdown ) { mon_enter( &sglob->tsl_mon ); time( &now ); min = 0L; if ( sglob->tsl_list != NULL ) { for ( t = sglob->tsl_list; t != NULL; t = t->tl_next ) { if (( t->tl_wake > 0L ) && ( t->tl_wake < now )) { lwp_resume( t->tl_tid ); t->tl_wake = 0L; } if (( t->tl_wake > now ) && ( t->tl_wake < min )) { min = t->tl_wake; } } } mon_exit( &sglob->tsl_mon ); interval.tv_usec = 0L; if ( min == 0L ) { interval.tv_sec = 1L; } else { interval.tv_sec = min; } lwp_sleep( &interval ); } mon_enter( &sglob->tsl_mon ); for ( t = sglob->tsl_list; t != NULL; t = t->tl_next ) { lwp_resume( t->tl_tid ); } mon_exit( &sglob->tsl_mon ); free_stack( stackno ); }
unsigned int ldap_pvt_thread_sleep( unsigned int interval ) { thread_t mylwp; tl_t *t, *nt; time_t now; if ( lwp_self( &mylwp ) < 0 ) { return -1; } time( &now ); mon_enter( &sglob->tsl_mon ); if ( sglob->tsl_list != NULL ) { for ( t = sglob->tsl_list; t != NULL; t = t->tl_next ) { if ( SAMETHREAD( t->tl_tid, mylwp )) { /* We're already sleeping? */ t->tl_wake = now + interval; mon_exit( &sglob->tsl_mon ); lwp_suspend( mylwp ); return 0; } } } nt = (tl_t *) LDAP_MALLOC( sizeof( tl_t )); if( nt == NULL ) return -1; nt->tl_next = sglob->tsl_list; nt->tl_wake = now + interval; nt->tl_tid = mylwp; sglob->tsl_list = nt; mon_exit( &sglob->tsl_mon ); lwp_suspend( mylwp ); return 0; }
static void Quit(void) { // Exit PowerPC emulation exit_emul_ppc(); // Stop 60Hz thread if (tick_thread_active) { tick_thread_cancel = true; wait_thread(tick_thread); } // Stop NVRAM watchdog thread if (nvram_thread_active) { nvram_thread_cancel = true; wait_thread(nvram_thread); } // Deinitialize everything ExitAll(); // Delete SheepShaver globals SheepMem::Exit(); // Delete RAM area if (ram_area_mapped) vm_mac_release(RAMBase, RAMSize); // Delete ROM area if (rom_area_mapped) vm_mac_release(ROMBase, ROM_AREA_SIZE); // Delete DR cache areas if (dr_emulator_area_mapped) vm_mac_release(DR_EMULATOR_BASE, DR_EMULATOR_SIZE); if (dr_cache_area_mapped) vm_mac_release(DR_CACHE_BASE, DR_CACHE_SIZE); // Delete Kernel Data area kernel_data_exit(); // Exit system routines SysExit(); // Exit preferences PrefsExit(); // Release win32 libraries KernelExit(); #ifdef ENABLE_MON // Exit mon mon_exit(); #endif exit(0); }
void ExitAll(void) { #if ENABLE_MON // Deinitialize mon mon_exit(); #endif // Save XPRAM XPRAMExit(); // Exit video VideoExit(); // Exit audio AudioExit(); // Exit ADB ADBExit(); // Exit clipboard ClipExit(); // Exit Time Manager TimerExit(); // Exit serial ports SerialExit(); // Exit network EtherExit(); #if SUPPORTS_EXTFS // Exit external file system ExtFSExit(); #endif // Exit drivers SCSIExit(); CDROMExit(); DiskExit(); SonyExit(); }
nsresult GonkAudioDecoderManager::Input(MediaRawData* aSample) { MonitorAutoLock mon(mMonitor); nsRefPtr<MediaRawData> sample; if (aSample) { sample = aSample; } else { // It means EOS with empty sample. sample = new MediaRawData(); } mQueueSample.AppendElement(sample); status_t rv; while (mQueueSample.Length()) { nsRefPtr<MediaRawData> data = mQueueSample.ElementAt(0); { MonitorAutoUnlock mon_exit(mMonitor); rv = mDecoder->Input(reinterpret_cast<const uint8_t*>(data->mData), data->mSize, data->mTime, 0); } if (rv == OK) { mQueueSample.RemoveElementAt(0); } else if (rv == -EAGAIN || rv == -ETIMEDOUT) { // In most cases, EAGAIN or ETIMEOUT are safe because OMX can't fill // buffer on time. return NS_OK; } else { return NS_ERROR_UNEXPECTED; } } return NS_OK; }
int ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex ) { return( mon_exit( *mutex ) ); }