---
title: getWorkLoop
framework: kernel
role: pseudoSymbol
path: kernel/ioservice/1810145-getworkloop
---

# getWorkLoop

Returns the current work loop or provider->getWorkLoop.

## Declaration

```occ
virtual IOWorkLoop * getWorkLoop() const; 
```

## Return Value

Return Value A work loop, either the current work loop or it walks up the getProvider chain calling getWorkLoop. Eventually it will reach a valid work loop-based driver or the root of the I/O tree, where it will return a system-wide work loop. Returns 0 if it fails to find (or create) a work loop.

## Overview

Overview This function returns a valid work loop that a client can use to add an IOCommandGate to. The intention is that an IOService client has data that needs to be protected but doesn't want to pay the cost of a dedicated thread. This data has to be accessed from a provider's call-out context as well. So to achieve both of these goals the client creates an IOCommandGate to lock access to his data but he registers it with the provider's work loop, i.e. the work loop which will make the completion call-outs. This avoids a potential deadlock because the work loop gate uses a recursive lock, which allows the same lock to be held multiple times by a single thread.

## See Also

### Miscellaneous

- [acknowledgePowerChange](kernel/ioservice/1809710-acknowledgepowerchange.md)
- [acknowledgeSetPowerState](kernel/ioservice/1532596-acknowledgesetpowerstate.md)
- [activityTickle](kernel/ioservice/1809731-activitytickle.md)
- [addLocation](kernel/ioservice/1809740-addlocation.md)
- [addMatchingNotification](kernel/ioservice/1809749-addmatchingnotification.md)
- [addNotification](kernel/ioservice/1809760-addnotification.md)
- [addPowerChild](kernel/ioservice/1809766-addpowerchild.md)
- [adjustBusy](kernel/ioservice/1809776-adjustbusy.md)
- [attach](kernel/ioservice/1809786-attach.md)
- [callPlatformFunction](kernel/ioservice/1809795-callplatformfunction.md)
- [causeInterrupt](kernel/ioservice/1809803-causeinterrupt.md)
- [changePowerStateTo](kernel/ioservice/1809809-changepowerstateto.md)
- [changePowerStateToPriv](kernel/ioservice/1809819-changepowerstatetopriv.md)
- [clampPowerOn](kernel/ioservice/1809824-clamppoweron.md)
- [close](kernel/ioservice/1809831-close.md)
- [command_received](kernel/ioservice/1809840-command_received.md)
- [compareProperties](kernel/ioservice/1809848-compareproperties.md)
- [compareProperty(OSDictionary *, const char *)](kernel/ioservice/1809855-compareproperty.md)
- [compareProperty(OSDictionary *, const OSString *)](kernel/ioservice/1809861-compareproperty.md)
- [configureReport](kernel/ioservice/1809870-configurereport.md)
- [copyClientWithCategory](kernel/ioservice/1809878-copyclientwithcategory.md)
- [copyMatchingService](kernel/ioservice/1809887-copymatchingservice.md)
- [currentCapability](kernel/ioservice/1809891-currentcapability.md)
- [currentPowerConsumption](kernel/ioservice/1809899-currentpowerconsumption.md)
- [deRegisterInterestedDriver](kernel/ioservice/1809905-deregisterinteresteddriver.md)
- [detach](kernel/ioservice/1809913-detach.md)
- [didTerminate](kernel/ioservice/1809918-didterminate.md)
- [didYouWakeSystem](kernel/ioservice/1809924-didyouwakesystem.md)
- [disableInterrupt](kernel/ioservice/1809929-disableinterrupt.md)
- [enableInterrupt](kernel/ioservice/1809937-enableinterrupt.md)
- [errnoFromReturn](kernel/ioservice/1809942-errnofromreturn.md)
- [finalize](kernel/ioservice/1809948-finalize.md)
- [free](kernel/ioservice/1809960-free.md)
- [getAggressiveness](kernel/ioservice/1809962-getaggressiveness.md)
- [getBusyState](kernel/ioservice/1809968-getbusystate.md)
- [getClient](kernel/ioservice/1809973-getclient.md)
- [getClientIterator](kernel/ioservice/1809979-getclientiterator.md)
- [getDeviceMemory](kernel/ioservice/1809984-getdevicememory.md)
- [getDeviceMemoryCount](kernel/ioservice/1809990-getdevicememorycount.md)
- [getDeviceMemoryWithIndex](kernel/ioservice/1809999-getdevicememorywithindex.md)
- [getInterruptType](kernel/ioservice/1810004-getinterrupttype.md)
- [getMatchingServices](kernel/ioservice/1810011-getmatchingservices.md)
- [getOpenClientIterator](kernel/ioservice/1810018-getopenclientiterator.md)
- [getOpenProviderIterator](kernel/ioservice/1810027-getopenprovideriterator.md)
- [getPlatform](kernel/ioservice/1810033-getplatform.md)
- [getPMRootDomain](kernel/ioservice/1810046-getpmrootdomain.md)
- [getPMworkloop](kernel/ioservice/1810059-getpmworkloop.md)
- [getPowerState](kernel/ioservice/1810074-getpowerstate.md)
- [getProvider](kernel/ioservice/1810088-getprovider.md)
- [getProviderIterator](kernel/ioservice/1810097-getprovideriterator.md)
- [getResources](kernel/ioservice/1810107-getresources.md)
- [getResourceService](kernel/ioservice/1810116-getresourceservice.md)
- [getServiceRoot](kernel/ioservice/1810122-getserviceroot.md)
- [getState](kernel/ioservice/1810137-getstate.md)
- [handleClose](kernel/ioservice/1810153-handleclose.md)
- [handleIsOpen](kernel/ioservice/1810164-handleisopen.md)
- [handleOpen](kernel/ioservice/1810174-handleopen.md)
- [initialPowerStateForDomainState](kernel/ioservice/1810182-initialpowerstatefordomainstate.md)
- [isInactive](kernel/ioservice/1810198-isinactive.md)
- [isOpen](kernel/ioservice/1810209-isopen.md)
- [joinPMtree](kernel/ioservice/1810216-joinpmtree.md)
- [lockForArbitration](kernel/ioservice/1810228-lockforarbitration.md)
- [makeUsable](kernel/ioservice/1810246-makeusable.md)
- [mapDeviceMemoryWithIndex](kernel/ioservice/1810261-mapdevicememorywithindex.md)
- [matchLocation](kernel/ioservice/1810275-matchlocation.md)
- [matchPropertyTable](kernel/ioservice/1810286-matchpropertytable.md)
- [maxCapabilityForDomainState](kernel/ioservice/1810302-maxcapabilityfordomainstate.md)
- [message](kernel/ioservice/1810323-message.md)
- [messageClient](kernel/ioservice/1810334-messageclient.md)
- [messageClients](kernel/ioservice/1810353-messageclients.md)
- [nameMatching(const char *, OSDictionary *)](kernel/ioservice/1810365-namematching.md)
- [nameMatching(const OSString *, OSDictionary *)](kernel/ioservice/1810383-namematching.md)
- [newTemperature](kernel/ioservice/1810402-newtemperature.md)
- [newUserClient](kernel/ioservice/1810417-newuserclient.md)
- [nextIdleTimeout](kernel/ioservice/1810435-nextidletimeout.md)
- [open](kernel/ioservice/1810450-open.md)
- [PM_Clamp_Timer_Expired](kernel/ioservice/1810463-pm_clamp_timer_expired.md)
- [PM_idle_timer_expiration](kernel/ioservice/1810474-pm_idle_timer_expiration.md)
- [PMinit](kernel/ioservice/1810486-pminit.md)
- [PMstop](kernel/ioservice/1810502-pmstop.md)
- [powerChangeDone](kernel/ioservice/1810518-powerchangedone.md)
- [powerOverrideOffPriv](kernel/ioservice/1810533-poweroverrideoffpriv.md)
- [powerOverrideOnPriv](kernel/ioservice/1810549-poweroverrideonpriv.md)
- [powerStateDidChangeTo](kernel/ioservice/1810564-powerstatedidchangeto.md)
- [powerStateForDomainState](kernel/ioservice/1810576-powerstatefordomainstate.md)
- [powerStateWillChangeTo](kernel/ioservice/1810597-powerstatewillchangeto.md)
- [probe](kernel/ioservice/1810605-probe.md)
- [propertyMatching](kernel/ioservice/1810622-propertymatching.md)
- [publishResource(const char *, OSObject *)](kernel/ioservice/1810642-publishresource.md)
- [publishResource(const OSSymbol *, OSObject *)](kernel/ioservice/1810661-publishresource.md)
- [registerInterestedDriver](kernel/ioservice/1810675-registerinteresteddriver.md)
- [registerInterrupt](kernel/ioservice/1810691-registerinterrupt.md)
- [registerPowerDriver](kernel/ioservice/1810706-registerpowerdriver.md)
- [registerService](kernel/ioservice/1810726-registerservice.md)
- [registryEntryIDMatching](kernel/ioservice/1810750-registryentryidmatching.md)
- [removePowerChild](kernel/ioservice/1810770-removepowerchild.md)
- [requestPowerDomainState](kernel/ioservice/1810786-requestpowerdomainstate.md)
- [requestProbe](kernel/ioservice/1810804-requestprobe.md)
- [requestTerminate](kernel/ioservice/1810819-requestterminate.md)
- [resourceMatching(const char *, OSDictionary *)](kernel/ioservice/1810840-resourcematching.md)
- [resourceMatching(const OSString *, OSDictionary *)](kernel/ioservice/1810857-resourcematching.md)
- [serviceMatching(const char *, OSDictionary *)](kernel/ioservice/1810880-servicematching.md)
- [serviceMatching(const OSString *, OSDictionary *)](kernel/ioservice/1810901-servicematching.md)
- [setAggressiveness](kernel/ioservice/1810925-setaggressiveness.md)
- [setDeviceMemory](kernel/ioservice/1810946-setdevicememory.md)
- [setIdleTimerPeriod](kernel/ioservice/1810962-setidletimerperiod.md)
- [setPowerParent](kernel/ioservice/1810987-setpowerparent.md)
- [setPowerState](kernel/ioservice/1532866-setpowerstate.md)
- [start](kernel/ioservice/1811009-start.md)
- [start_PM_idle_timer](kernel/ioservice/1811024-start_pm_idle_timer.md)
- [stop](kernel/ioservice/1811034-stop.md)
- [stringFromReturn](kernel/ioservice/1811046-stringfromreturn.md)
- [systemWake](kernel/ioservice/1811056-systemwake.md)
- [systemWillShutdown](kernel/ioservice/1811071-systemwillshutdown.md)
- [temperatureCriticalForZone](kernel/ioservice/1811087-temperaturecriticalforzone.md)
- [temporaryPowerClampOn](kernel/ioservice/1811099-temporarypowerclampon.md)
- [terminate](kernel/ioservice/1811110-terminate.md)
- [terminateClient](kernel/ioservice/1811121-terminateclient.md)
- [unlockForArbitration](kernel/ioservice/1811130-unlockforarbitration.md)
- [unregisterInterrupt](kernel/ioservice/1811142-unregisterinterrupt.md)
- [updateReport](kernel/ioservice/1811152-updatereport.md)
- [waitForMatchingService](kernel/ioservice/1811164-waitformatchingservice.md)
- [waitForService](kernel/ioservice/1811172-waitforservice.md)
- [waitQuiet](kernel/ioservice/1811184-waitquiet.md)
- [willTerminate](kernel/ioservice/1811202-willterminate.md)
- [youAreRoot](kernel/ioservice/1811214-youareroot.md)
