8sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget(/translations/zh_CN/userspace-api/ntsyncmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/userspace-api/ntsyncmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/userspace-api/ntsyncmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/userspace-api/ntsyncmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/userspace-api/ntsyncmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/userspace-api/ntsyncmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h#NT synchronization primitive driverh]h#NT synchronization primitive driver}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhB/var/lib/git/docbuild/linux/Documentation/userspace-api/ntsync.rsthKubh paragraph)}(h=This page documents the user-space API for the ntsync driver.h]h=This page documents the user-space API for the ntsync driver.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX?ntsync is a support driver for emulation of NT synchronization primitives by user-space NT emulators. It exists because implementation in user-space, using existing tools, cannot match Windows performance while offering accurate semantics. It is implemented entirely in software, and does not drive any hardware device.h]hX?ntsync is a support driver for emulation of NT synchronization primitives by user-space NT emulators. It exists because implementation in user-space, using existing tools, cannot match Windows performance while offering accurate semantics. It is implemented entirely in software, and does not drive any hardware device.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThis interface is meant as a compatibility tool only, and should not be used for general synchronization. Instead use generic, versatile interfaces such as futex(2) and poll(2).h]hThis interface is meant as a compatibility tool only, and should not be used for general synchronization. Instead use generic, versatile interfaces such as futex(2) and poll(2).}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(hSynchronization primitivesh]hSynchronization primitives}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(heThe ntsync driver exposes three types of synchronization primitives: semaphores, mutexes, and events.h]heThe ntsync driver exposes three types of synchronization primitives: semaphores, mutexes, and events.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXA semaphore holds a single volatile 32-bit counter, and a static 32-bit integer denoting the maximum value. It is considered signaled (that is, can be acquired without contention, or will wake up a waiting thread) when the counter is nonzero. The counter is decremented by one when a wait is satisfied. Both the initial and maximum count are established when the semaphore is created.h]hXA semaphore holds a single volatile 32-bit counter, and a static 32-bit integer denoting the maximum value. It is considered signaled (that is, can be acquired without contention, or will wake up a waiting thread) when the counter is nonzero. The counter is decremented by one when a wait is satisfied. Both the initial and maximum count are established when the semaphore is created.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX)A mutex holds a volatile 32-bit recursion count, and a volatile 32-bit identifier denoting its owner. A mutex is considered signaled when its owner is zero (indicating that it is not owned). The recursion count is incremented when a wait is satisfied, and ownership is set to the given identifier.h]hX)A mutex holds a volatile 32-bit recursion count, and a volatile 32-bit identifier denoting its owner. A mutex is considered signaled when its owner is zero (indicating that it is not owned). The recursion count is incremented when a wait is satisfied, and ownership is set to the given identifier.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX-A mutex also holds an internal flag denoting whether its previous owner has died; such a mutex is said to be abandoned. Owner death is not tracked automatically based on thread death, but rather must be communicated using ``NTSYNC_IOC_MUTEX_KILL``. An abandoned mutex is inherently considered unowned.h](hA mutex also holds an internal flag denoting whether its previous owner has died; such a mutex is said to be abandoned. Owner death is not tracked automatically based on thread death, but rather must be communicated using }(hjhhhNhNubhliteral)}(h``NTSYNC_IOC_MUTEX_KILL``h]hNTSYNC_IOC_MUTEX_KILL}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh6. An abandoned mutex is inherently considered unowned.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hhhhubh)}(hX-Except for the "unowned" semantics of zero, the actual value of the owner identifier is not interpreted by the ntsync driver at all. The intended use is to store a thread identifier; however, the ntsync driver does not actually validate that a calling thread provides consistent or unique identifiers.h]hX1Except for the “unowned” semantics of zero, the actual value of the owner identifier is not interpreted by the ntsync driver at all. The intended use is to store a thread identifier; however, the ntsync driver does not actually validate that a calling thread provides consistent or unique identifiers.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hhhhubh)}(hXUAn event is similar to a semaphore with a maximum count of one. It holds a volatile boolean state denoting whether it is signaled or not. There are two types of events, auto-reset and manual-reset. An auto-reset event is designaled when a wait is satisfied; a manual-reset event is not. The event type is specified when the event is created.h]hXUAn event is similar to a semaphore with a maximum count of one. It holds a volatile boolean state denoting whether it is signaled or not. There are two types of events, auto-reset and manual-reset. An auto-reset event is designaled when a wait is satisfied; a manual-reset event is not. The event type is specified when the event is created.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hhhhubh)}(hUnless specified otherwise, all operations on an object are atomic and totally ordered with respect to other operations on the same object.h]hUnless specified otherwise, all operations on an object are atomic and totally ordered with respect to other operations on the same object.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hhhhubh)}(hlObjects are represented by files. When all file descriptors to an object are closed, that object is deleted.h]hlObjects are represented by files. When all file descriptors to an object are closed, that object is deleted.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hhhhubeh}(h]synchronization-primitivesah ]h"]synchronization primitivesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Char deviceh]h Char device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK=ubh)}(hXThe ntsync driver creates a single char device /dev/ntsync. Each file description opened on the device represents a unique instance intended to back an individual NT virtual machine. Objects created by one ntsync instance may only be used with other objects created by the same instance.h]hXThe ntsync driver creates a single char device /dev/ntsync. Each file description opened on the device represents a unique instance intended to back an individual NT virtual machine. Objects created by one ntsync instance may only be used with other objects created by the same instance.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hjhhubeh}(h] char-deviceah ]h"] char deviceah$]h&]uh1hhhhhhhhK=ubh)}(hhh](h)}(hioctl referenceh]hioctl reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKFubh)}(heAll operations on the device are done through ioctls. There are four structures used in ioctl calls::h]hdAll operations on the device are done through ioctls. There are four structures used in ioctl calls:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjhhubh literal_block)}(hXtstruct ntsync_sem_args { __u32 count; __u32 max; }; struct ntsync_mutex_args { __u32 owner; __u32 count; }; struct ntsync_event_args { __u32 signaled; __u32 manual; }; struct ntsync_wait_args { __u64 timeout; __u64 objs; __u32 count; __u32 owner; __u32 index; __u32 alert; __u32 flags; __u32 pad; };h]hXtstruct ntsync_sem_args { __u32 count; __u32 max; }; struct ntsync_mutex_args { __u32 owner; __u32 count; }; struct ntsync_event_args { __u32 signaled; __u32 manual; }; struct ntsync_wait_args { __u64 timeout; __u64 objs; __u32 count; __u32 owner; __u32 index; __u32 alert; __u32 flags; __u32 pad; };}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhKKhjhhubh)}(h]Depending on the ioctl, members of the structure may be used as input, output, or not at all.h]h]Depending on the ioctl, members of the structure may be used as input, output, or not at all.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehjhhubh)}(h-The ioctls on the device file are as follows:h]h-The ioctls on the device file are as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleNTSYNC_IOC_CREATE_SEM (C macro)c.NTSYNC_IOC_CREATE_SEMhNtauh1jhjhhhhhNubhdesc)}(hhh](hdesc_signature)}(hNTSYNC_IOC_CREATE_SEMh]hdesc_signature_line)}(hNTSYNC_IOC_CREATE_SEMh]h desc_name)}(hNTSYNC_IOC_CREATE_SEMh]h desc_sig_name)}(hjh]hNTSYNC_IOC_CREATE_SEM}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjhhhhhKjubah}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhj hhhhhKjubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j hhhKjhjhhubh desc_content)}(hhh](h)}(hiCreate a semaphore object. Takes a pointer to struct :c:type:`ntsync_sem_args`, which is used as follows:h](h5Create a semaphore object. Takes a pointer to struct }(hjMhhhNhNubh)}(h:c:type:`ntsync_sem_args`h]j')}(hjWh]hntsync_sem_args}(hjYhhhNhNubah}(h]h ](xrefcc-typeeh"]h$]h&]uh1j&hjUubah}(h]h ]h"]h$]h&]refdocuserspace-api/ntsync refdomainjdreftypetype refexplicitrefwarn c:parent_keysphinx.domains.c LookupKey)}data]jw ASTIdentifier)} identifierjsbc.NTSYNC_IOC_CREATE_SEMasb reftargetntsync_sem_argsuh1hhhhKhjMubh, which is used as follows:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKlhjJhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthK2uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(h ``count``h]j')}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKqhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hInitial count of the semaphore.h]hInitial count of the semaphore.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h``max``h]j')}(hjh]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKshjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hMaximum count of the semaphore.h]hMaximum count of the semaphore.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjJhhhNhNubh)}(hxFails with ``EINVAL`` if ``count`` is greater than ``max``. On success, returns a file descriptor the created semaphore.h](h Fails with }(hjLhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjLubh if }(hjLhhhNhNubj')}(h ``count``h]hcount}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjLubh is greater than }(hjLhhhNhNubj')}(h``max``h]hmax}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjLubh>. On success, returns a file descriptor the created semaphore.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKvhjJhhubeh}(h]h ]h"]h$]h&]uh1jHhjhhhhhKjubeh}(h]h ](jdmacroeh"]h$]h&]domainjdobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!NTSYNC_IOC_CREATE_MUTEX (C macro)c.NTSYNC_IOC_CREATE_MUTEXhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_CREATE_MUTEXh]j)}(hNTSYNC_IOC_CREATE_MUTEXh]j)}(hNTSYNC_IOC_CREATE_MUTEXh]j)}(hjh]hNTSYNC_IOC_CREATE_MUTEX}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjhhhhhKyubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjhhhhhKyubah}(h]jah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKyhjhhubjI)}(hhh](h)}(hgCreate a mutex object. Takes a pointer to struct :c:type:`ntsync_mutex_args`, which is used as follows:h](h1Create a mutex object. Takes a pointer to struct }(hjhhhNhNubh)}(h:c:type:`ntsync_mutex_args`h]j')}(hjh]hntsync_mutex_args}(hjhhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jjsbc.NTSYNC_IOC_CREATE_MUTEXasbjntsync_mutex_argsuh1hhhhKhjubh, which is used as follows:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK{hjhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``count``h]j')}(hj=h]hcount}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj;ubah}(h]h ]h"]h$]h&]uh1hhhhKhj8ubah}(h]h ]h"]h$]h&]uh1jhj5ubj)}(hhh]h)}(h%Initial recursion count of the mutex.h]h%Initial recursion count of the mutex.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh](j)}(hhh]h)}(h ``owner``h]j')}(hj}h]howner}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj{ubah}(h]h ]h"]h$]h&]uh1hhhhKhjxubah}(h]h ]h"]h$]h&]uh1jhjuubj)}(hhh]h)}(hInitial owner of the mutex.h]hInitial owner of the mutex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhhhNhNubh)}(hIf ``owner`` is nonzero and ``count`` is zero, or if ``owner`` is zero and ``count`` is nonzero, the function fails with ``EINVAL``. On success, returns a file descriptor the created mutex.h](hIf }(hjhhhNhNubj')}(h ``owner``h]howner}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh is nonzero and }(hjhhhNhNubj')}(h ``count``h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh is zero, or if }(hjhhhNhNubj')}(h ``owner``h]howner}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh is zero and }(hjhhhNhNubj')}(h ``count``h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh% is nonzero, the function fails with }(hjhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh:. On success, returns a file descriptor the created mutex.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jHhjhhhhhKyubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj9jj9jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!NTSYNC_IOC_CREATE_EVENT (C macro)c.NTSYNC_IOC_CREATE_EVENThNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_CREATE_EVENTh]j)}(hNTSYNC_IOC_CREATE_EVENTh]j)}(hNTSYNC_IOC_CREATE_EVENTh]j)}(hjPh]hNTSYNC_IOC_CREATE_EVENT}(hjZhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjVubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjRhhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjNhhhhhKubah}(h]jIah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhjKhhubjI)}(hhh](h)}(hhCreate an event object. Takes a pointer to struct :c:type:`ntsync_event_args`, which is used as follows:h](h2Create an event object. Takes a pointer to struct }(hj|hhhNhNubh)}(h:c:type:`ntsync_event_args`h]j')}(hjh]hntsync_event_args}(hjhhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jjPsbc.NTSYNC_IOC_CREATE_EVENTasbjntsync_event_argsuh1hhhhKhj|ubh, which is used as follows:}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjyhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``signaled``h]j')}(hjh]hsignaled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hCIf nonzero, the event is initially signaled, otherwise nonsignaled.h]hCIf nonzero, the event is initially signaled, otherwise nonsignaled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``manual``h]j')}(hjh]hmanual}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hDIf nonzero, the event is a manual-reset event, otherwise auto-reset.h]hDIf nonzero, the event is a manual-reset event, otherwise auto-reset.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjyhhhNhNubh)}(h8On success, returns a file descriptor the created event.h]h8On success, returns a file descriptor the created event.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyhhubeh}(h]h ]h"]h$]h&]uh1jHhjKhhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjyjjyjjjuh1jhhhjhhhNubh)}(h4The ioctls on the individual objects are as follows:h]h4The ioctls on the individual objects are as follows:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_SEM_POST (C macro)c.NTSYNC_IOC_SEM_POSThNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_SEM_POSTh]j)}(hNTSYNC_IOC_SEM_POSTh]j)}(hNTSYNC_IOC_SEM_POSTh]j)}(hjh]hNTSYNC_IOC_SEM_POST}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjhhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjhhhhhKubah}(h]jah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhjhhubjI)}(hhh](h)}(hPost to a semaphore object. Takes a pointer to a 32-bit integer, which on input holds the count to be added to the semaphore, and on output contains its previous count.h]hPost to a semaphore object. Takes a pointer to a 32-bit integer, which on input holds the count to be added to the semaphore, and on output contains its previous count.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXXIf adding to the semaphore's current count would raise the latter past the semaphore's maximum count, the ioctl fails with ``EOVERFLOW`` and the semaphore is not affected. If raising the semaphore's count causes it to become signaled, eligible threads waiting on this semaphore will be woken and the semaphore's count decremented appropriately.h](hIf adding to the semaphore’s current count would raise the latter past the semaphore’s maximum count, the ioctl fails with }(hjhhhNhNubj')}(h ``EOVERFLOW``h]h EOVERFLOW}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh and the semaphore is not affected. If raising the semaphore’s count causes it to become signaled, eligible threads waiting on this semaphore will be woken and the semaphore’s count decremented appropriately.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jHhjhhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjjjjjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!NTSYNC_IOC_MUTEX_UNLOCK (C macro)c.NTSYNC_IOC_MUTEX_UNLOCKhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_MUTEX_UNLOCKh]j)}(hNTSYNC_IOC_MUTEX_UNLOCKh]j)}(hNTSYNC_IOC_MUTEX_UNLOCKh]j)}(hjh]hNTSYNC_IOC_MUTEX_UNLOCK}(hj"hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjhhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjhhhhhKubah}(h]jah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhjhhubjI)}(hhh](h)}(hhRelease a mutex object. Takes a pointer to struct :c:type:`ntsync_mutex_args`, which is used as follows:h](h2Release a mutex object. Takes a pointer to struct }(hjDhhhNhNubh)}(h:c:type:`ntsync_mutex_args`h]j')}(hjNh]hntsync_mutex_args}(hjPhhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hjLubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jjsbc.NTSYNC_IOC_MUTEX_UNLOCKasbjntsync_mutex_argsuh1hhhhKhjDubh, which is used as follows:}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``owner``h]j')}(hjh]howner}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h1Specifies the owner trying to release this mutex.h]h1Specifies the owner trying to release this mutex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``count``h]j')}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h1On output, contains the previous recursion count.h]h1On output, contains the previous recursion count.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhjAhhhNhNubh)}(hIf ``owner`` is zero, the ioctl fails with ``EINVAL``. If ``owner`` is not the current owner of the mutex, the ioctl fails with ``EPERM``.h](hIf }(hj*hhhNhNubj')}(h ``owner``h]howner}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj*ubh is zero, the ioctl fails with }(hj*hhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj*ubh. If }(hj*hhhNhNubj')}(h ``owner``h]howner}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj*ubh= is not the current owner of the mutex, the ioctl fails with }(hj*hhhNhNubj')}(h ``EPERM``h]hEPERM}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj*ubh.}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubh)}(hThe mutex's count will be decremented by one. If decrementing the mutex's count causes it to become zero, the mutex is marked as unowned and signaled, and eligible threads waiting on it will be woken as appropriate.h]hThe mutex’s count will be decremented by one. If decrementing the mutex’s count causes it to become zero, the mutex is marked as unowned and signaled, and eligible threads waiting on it will be woken as appropriate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubeh}(h]h ]h"]h$]h&]uh1jHhjhhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjjjjjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_SET_EVENT (C macro)c.NTSYNC_IOC_SET_EVENThNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_SET_EVENTh]j)}(hNTSYNC_IOC_SET_EVENTh]j)}(hNTSYNC_IOC_SET_EVENTh]j)}(hjh]hNTSYNC_IOC_SET_EVENT}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjhhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjhhhhhKubah}(h]jah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhjhhubjI)}(hhh](h)}(hvSignal an event object. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.h]hvSignal an event object. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hWEligible threads will be woken, and auto-reset events will be designaled appropriately.h]hWEligible threads will be woken, and auto-reset events will be designaled appropriately.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jHhjhhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjjjjjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j NTSYNC_IOC_RESET_EVENT (C macro)c.NTSYNC_IOC_RESET_EVENThNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_RESET_EVENTh]j)}(hNTSYNC_IOC_RESET_EVENTh]j)}(hNTSYNC_IOC_RESET_EVENTh]j)}(hj h]hNTSYNC_IOC_RESET_EVENT}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhj hhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hj hhhhhKubah}(h]j ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhj hhubjI)}(hhh]h)}(hxDesignal an event object. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.h]hxDesignal an event object. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj? hhubah}(h]h ]h"]h$]h&]uh1jHhj hhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjY jjY jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j NTSYNC_IOC_PULSE_EVENT (C macro)c.NTSYNC_IOC_PULSE_EVENThNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_PULSE_EVENTh]j)}(hNTSYNC_IOC_PULSE_EVENTh]j)}(hNTSYNC_IOC_PULSE_EVENTh]j)}(hjp h]hNTSYNC_IOC_PULSE_EVENT}(hjz hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjv ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjr hhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjn hhhhhKubah}(h]ji ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhjk hhubjI)}(hhh](h)}(hWake threads waiting on an event object while leaving it in an unsignaled state. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.h]hWake threads waiting on an event object while leaving it in an unsignaled state. Takes a pointer to a 32-bit integer, which on output contains the previous state of the event.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hXA pulse operation can be thought of as a set followed by a reset, performed as a single atomic operation. If two threads are waiting on an auto-reset event which is pulsed, only one will be woken. If two threads are waiting a manual-reset event which is pulsed, both will be woken. However, in both cases, the event will be unsignaled afterwards, and a simultaneous read operation will always report the event as unsignaled.h]hXA pulse operation can be thought of as a set followed by a reset, performed as a single atomic operation. If two threads are waiting on an auto-reset event which is pulsed, only one will be woken. If two threads are waiting a manual-reset event which is pulsed, both will be woken. However, in both cases, the event will be unsignaled afterwards, and a simultaneous read operation will always report the event as unsignaled.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]h ]h"]h$]h&]uh1jHhjk hhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj jj jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_READ_SEM (C macro)c.NTSYNC_IOC_READ_SEMhNtauh1jhjhhhNhNubj)}(hhh](j )}(hNTSYNC_IOC_READ_SEMh]j)}(hNTSYNC_IOC_READ_SEMh]j)}(hNTSYNC_IOC_READ_SEMh]j)}(hj h]hNTSYNC_IOC_READ_SEM}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhj hhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hj hhhhhKubah}(h]j ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhj hhubjI)}(hhh](h)}(h|Read the current state of a semaphore object. Takes a pointer to struct :c:type:`ntsync_sem_args`, which is used as follows:h](hHRead the current state of a semaphore object. Takes a pointer to struct }(hj hhhNhNubh)}(h:c:type:`ntsync_sem_args`h]j')}(hj h]hntsync_sem_args}(hj hhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jj sbc.NTSYNC_IOC_READ_SEMasbjntsync_sem_argsuh1hhhhKhj ubh, which is used as follows:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhj? ubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhj? ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``count``h]j')}(hj_ h]hcount}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj] ubah}(h]h ]h"]h$]h&]uh1hhhhKhjZ ubah}(h]h ]h"]h$]h&]uh1jhjW ubj)}(hhh]h)}(h7On output, contains the current count of the semaphore.h]h7On output, contains the current count of the semaphore.}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjz ubah}(h]h ]h"]h$]h&]uh1jhjW ubeh}(h]h ]h"]h$]h&]uh1jhjT ubj)}(hhh](j)}(hhh]h)}(h``max``h]j')}(hj h]hmax}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h7On output, contains the maximum count of the semaphore.h]h7On output, contains the maximum count of the semaphore.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjT ubeh}(h]h ]h"]h$]h&]uh1jhj? ubeh}(h]h ]h"]h$]h&]colsKuh1jhj< ubah}(h]h ]h"]h$]h&]uh1jhj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jHhj hhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj jj jjjuh1jhhhjhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_READ_MUTEX (C macro)c.NTSYNC_IOC_READ_MUTEXhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_READ_MUTEXh]j)}(hNTSYNC_IOC_READ_MUTEXh]j)}(hNTSYNC_IOC_READ_MUTEXh]j)}(hj h]hNTSYNC_IOC_READ_MUTEX}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhj hhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hj hhhhhKubah}(h]j ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhj hhubjI)}(hhh](h)}(hzRead the current state of a mutex object. Takes a pointer to struct :c:type:`ntsync_mutex_args`, which is used as follows:h](hDRead the current state of a mutex object. Takes a pointer to struct }(hj6 hhhNhNubh)}(h:c:type:`ntsync_mutex_args`h]j')}(hj@ h]hntsync_mutex_args}(hjB hhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hj> ubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jj sbc.NTSYNC_IOC_READ_MUTEXasbjntsync_mutex_argsuh1hhhhKhj6 ubh, which is used as follows:}(hj6 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj3 hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjq ubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjq ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``owner``h]j')}(hj h]howner}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h`On output, contains the current owner of the mutex, or zero if the mutex is not currently owned.h]h`On output, contains the current owner of the mutex, or zero if the mutex is not currently owned.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h ``count``h]j')}(hj h]hcount}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h=On output, contains the current recursion count of the mutex.h]h=On output, contains the current recursion count of the mutex.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjq ubeh}(h]h ]h"]h$]h&]colsKuh1jhjn ubah}(h]h ]h"]h$]h&]uh1jhj3 hhhNhNubh)}(hIf the mutex is marked as abandoned, the function fails with ``EOWNERDEAD``. In this case, ``count`` and ``owner`` are set to zero.h](h=If the mutex is marked as abandoned, the function fails with }(hj hhhNhNubj')}(h``EOWNERDEAD``h]h EOWNERDEAD}(hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh. In this case, }(hj hhhNhNubj')}(h ``count``h]hcount}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh and }(hj hhhNhNubj')}(h ``owner``h]howner}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh are set to zero.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj3 hhubeh}(h]h ]h"]h$]h&]uh1jHhj hhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjji jji jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_READ_EVENT (C macro)c.NTSYNC_IOC_READ_EVENThNtauh1jhjhhhNhNubj)}(hhh](j )}(hNTSYNC_IOC_READ_EVENTh]j)}(hNTSYNC_IOC_READ_EVENTh]j)}(hNTSYNC_IOC_READ_EVENTh]j)}(hj h]hNTSYNC_IOC_READ_EVENT}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhj hhhhhKubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hj~ hhhhhKubah}(h]jy ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhKhj{ hhubjI)}(hhh](h)}(h{Read the current state of an event object. Takes a pointer to struct :c:type:`ntsync_event_args`, which is used as follows:h](hERead the current state of an event object. Takes a pointer to struct }(hj hhhNhNubh)}(h:c:type:`ntsync_event_args`h]j')}(hj h]hntsync_event_args}(hj hhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jj sbc.NTSYNC_IOC_READ_EVENTasbjntsync_event_argsuh1hhhhKhj ubh, which is used as follows:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhj ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``signaled``h]j')}(hj h]hsignaled}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h3On output, contains the current state of the event.h]h3On output, contains the current state of the event.}(hj% hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj" ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h ``manual``h]j')}(hjG h]hmanual}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjE ubah}(h]h ]h"]h$]h&]uh1hhhhKhjB ubah}(h]h ]h"]h$]h&]uh1jhj? ubj)}(hhh]h)}(hLOn output, contains 1 if the event is a manual-reset event, and 0 otherwise.h]hLOn output, contains 1 if the event is a manual-reset event, and 0 otherwise.}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjb ubah}(h]h ]h"]h$]h&]uh1jhj? ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jHhj{ hhhhhKubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj jj jjjuh1jhhhjhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_KILL_OWNER (C macro)c.NTSYNC_IOC_KILL_OWNERhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_KILL_OWNERh]j)}(hNTSYNC_IOC_KILL_OWNERh]j)}(hNTSYNC_IOC_KILL_OWNERh]j)}(hj h]hNTSYNC_IOC_KILL_OWNER}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj ubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhj hhhhhMubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hj hhhhhMubah}(h]j ah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhMhj hhubjI)}(hhh](h)}(hX Mark a mutex as unowned and abandoned if it is owned by the given owner. Takes an input-only pointer to a 32-bit integer denoting the owner. If the owner is zero, the ioctl fails with ``EINVAL``. If the owner does not own the mutex, the function fails with ``EPERM``.h](hMark a mutex as unowned and abandoned if it is owned by the given owner. Takes an input-only pointer to a 32-bit integer denoting the owner. If the owner is zero, the ioctl fails with }(hj hhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh?. If the owner does not own the mutex, the function fails with }(hj hhhNhNubj')}(h ``EPERM``h]hEPERM}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hEligible threads waiting on the mutex will be woken as appropriate (and such waits will fail with ``EOWNERDEAD``, as described below).h](hbEligible threads waiting on the mutex will be woken as appropriate (and such waits will fail with }(hjhhhNhNubj')}(h``EOWNERDEAD``h]h EOWNERDEAD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh, as described below).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM hj hhubeh}(h]h ]h"]h$]h&]uh1jHhj hhhhhMubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj9jj9jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_WAIT_ANY (C macro)c.NTSYNC_IOC_WAIT_ANYhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_WAIT_ANYh]j)}(hNTSYNC_IOC_WAIT_ANYh]j)}(hNTSYNC_IOC_WAIT_ANYh]j)}(hjPh]hNTSYNC_IOC_WAIT_ANY}(hjZhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjVubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjRhhhhhM ubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjNhhhhhM ubah}(h]jIah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhM hjKhhubjI)}(hhh](h)}(hPoll on any of a list of objects, atomically acquiring at most one. Takes a pointer to struct :c:type:`ntsync_wait_args`, which is used as follows:h](h^Poll on any of a list of objects, atomically acquiring at most one. Takes a pointer to struct }(hj|hhhNhNubh)}(h:c:type:`ntsync_wait_args`h]j')}(hjh]hntsync_wait_args}(hjhhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jjPsbc.NTSYNC_IOC_WAIT_ANYasbjntsync_wait_argsuh1hhhhKhj|ubh, which is used as follows:}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjyhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK2uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h ``timeout``h]j')}(hjh]htimeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hXAbsolute timeout in nanoseconds. If ``NTSYNC_WAIT_REALTIME`` is set, the timeout is measured against the REALTIME clock; otherwise it is measured against the MONOTONIC clock. If the timeout is equal to or earlier than the current time, the function returns immediately without sleeping. If ``timeout`` is U64_MAX, the function will sleep until an object is signaled, and will not fail with ``ETIMEDOUT``.h](h$Absolute timeout in nanoseconds. If }(hjhhhNhNubj')}(h``NTSYNC_WAIT_REALTIME``h]hNTSYNC_WAIT_REALTIME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh is set, the timeout is measured against the REALTIME clock; otherwise it is measured against the MONOTONIC clock. If the timeout is equal to or earlier than the current time, the function returns immediately without sleeping. If }(hjhhhNhNubj')}(h ``timeout``h]htimeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubhY is U64_MAX, the function will sleep until an object is signaled, and will not fail with }(hjhhhNhNubj')}(h ``ETIMEDOUT``h]h ETIMEDOUT}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h``objs``h]j')}(hjMh]hobjs}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjKubah}(h]h ]h"]h$]h&]uh1hhhhMhjHubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(hPointer to an array of ``count`` file descriptors (specified as an integer so that the structure has the same size regardless of architecture). If any object is invalid, the function fails with ``EINVAL``.h](hPointer to an array of }(hjkhhhNhNubj')}(h ``count``h]hcount}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjkubh file descriptors (specified as an integer so that the structure has the same size regardless of architecture). If any object is invalid, the function fails with }(hjkhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjkubh.}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``count``h]j')}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNumber of objects specified in the ``objs`` array. If greater than ``NTSYNC_MAX_WAIT_COUNT``, the function fails with ``EINVAL``.h](h#Number of objects specified in the }(hjhhhNhNubj')}(h``objs``h]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh array. If greater than }(hjhhhNhNubj')}(h``NTSYNC_MAX_WAIT_COUNT``h]hNTSYNC_MAX_WAIT_COUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh, the function fails with }(hjhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM"hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``owner``h]j')}(hj'h]howner}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj%ubah}(h]h ]h"]h$]h&]uh1hhhhM%hj"ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hMutex owner identifier. If any object in ``objs`` is a mutex, the ioctl will attempt to acquire that mutex on behalf of ``owner``. If ``owner`` is zero, the ioctl fails with ``EINVAL``.h](h)Mutex owner identifier. If any object in }(hjEhhhNhNubj')}(h``objs``h]hobjs}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjEubhG is a mutex, the ioctl will attempt to acquire that mutex on behalf of }(hjEhhhNhNubj')}(h ``owner``h]howner}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjEubh. If }(hjEhhhNhNubj')}(h ``owner``h]howner}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjEubh is zero, the ioctl fails with }(hjEhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM&hjBubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``index``h]j')}(hjh]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhM*hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOn success, contains the index (into ``objs``) of the object which was signaled. If ``alert`` was signaled instead, this contains ``count``.h](h%On success, contains the index (into }(hjhhhNhNubj')}(h``objs``h]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh') of the object which was signaled. If }(hjhhhNhNubj')}(h ``alert``h]halert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh% was signaled instead, this contains }(hjhhhNhNubj')}(h ``count``h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``alert``h]j')}(hj%h]halert}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj#ubah}(h]h ]h"]h$]h&]uh1hhhhM.hj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOptional event object file descriptor. If nonzero, this specifies an "alert" event object which, if signaled, will terminate the wait. If nonzero, the identifier must point to a valid event.h]hOptional event object file descriptor. If nonzero, this specifies an “alert” event object which, if signaled, will terminate the wait. If nonzero, the identifier must point to a valid event.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM/hj@ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h ``flags``h]j')}(hjeh]hflags}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjcubah}(h]h ]h"]h$]h&]uh1hhhhM3hj`ubah}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh]h)}(hZero or more flags. Currently the only flag is ``NTSYNC_WAIT_REALTIME``, which causes the timeout to be measured against the REALTIME clock instead of MONOTONIC.h](h/Zero or more flags. Currently the only flag is }(hjhhhNhNubj')}(h``NTSYNC_WAIT_REALTIME``h]hNTSYNC_WAIT_REALTIME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubhZ, which causes the timeout to be measured against the REALTIME clock instead of MONOTONIC.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM4hjubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h``pad``h]j')}(hjh]hpad}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hhhhM7hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hUnused, must be set to zero.h]hUnused, must be set to zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjyhhhNhNubh)}(hX3This function attempts to acquire one of the given objects. If unable to do so, it sleeps until an object becomes signaled, subsequently acquiring it, or the timeout expires. In the latter case the ioctl fails with ``ETIMEDOUT``. The function only acquires one object, even if multiple objects are signaled.h](hThis function attempts to acquire one of the given objects. If unable to do so, it sleeps until an object becomes signaled, subsequently acquiring it, or the timeout expires. In the latter case the ioctl fails with }(hjhhhNhNubj')}(h ``ETIMEDOUT``h]h ETIMEDOUT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubhO. The function only acquires one object, even if multiple objects are signaled.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hjyhhubh)}(hXA semaphore is considered to be signaled if its count is nonzero, and is acquired by decrementing its count by one. A mutex is considered to be signaled if it is unowned or if its owner matches the ``owner`` argument, and is acquired by incrementing its recursion count by one and setting its owner to the ``owner`` argument. An auto-reset event is acquired by designaling it; a manual-reset event is not affected by acquisition.h](hA semaphore is considered to be signaled if its count is nonzero, and is acquired by decrementing its count by one. A mutex is considered to be signaled if it is unowned or if its owner matches the }(hj"hhhNhNubj')}(h ``owner``h]howner}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj"ubhc argument, and is acquired by incrementing its recursion count by one and setting its owner to the }(hj"hhhNhNubj')}(h ``owner``h]howner}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj"ubhr argument. An auto-reset event is acquired by designaling it; a manual-reset event is not affected by acquisition.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM@hjyhhubh)}(hXCAcquisition is atomic and totally ordered with respect to other operations on the same object. If two wait operations (with different ``owner`` identifiers) are queued on the same mutex, only one is signaled. If two wait operations are queued on the same semaphore, and a value of one is posted to it, only one is signaled.h](hAcquisition is atomic and totally ordered with respect to other operations on the same object. If two wait operations (with different }(hjThhhNhNubj')}(h ``owner``h]howner}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjTubh identifiers) are queued on the same mutex, only one is signaled. If two wait operations are queued on the same semaphore, and a value of one is posted to it, only one is signaled.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMHhjyhhubh)}(hX?If an abandoned mutex is acquired, the ioctl fails with ``EOWNERDEAD``. Although this is a failure return, the function may otherwise be considered successful. The mutex is marked as owned by the given owner (with a recursion count of 1) and as no longer abandoned, and ``index`` is still set to the index of the mutex.h](h8If an abandoned mutex is acquired, the ioctl fails with }(hjthhhNhNubj')}(h``EOWNERDEAD``h]h EOWNERDEAD}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjtubh. Although this is a failure return, the function may otherwise be considered successful. The mutex is marked as owned by the given owner (with a recursion count of 1) and as no longer abandoned, and }(hjthhhNhNubj')}(h ``index``h]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjtubh( is still set to the index of the mutex.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMNhjyhhubh)}(hlThe ``alert`` argument is an "extra" event which can terminate the wait, independently of all other objects.h](hThe }(hjhhhNhNubj')}(h ``alert``h]halert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubhc argument is an “extra” event which can terminate the wait, independently of all other objects.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMThjyhhubh)}(hIt is valid to pass the same object more than once, including by passing the same event in the ``objs`` array and in ``alert``. If a wakeup occurs due to that object being signaled, ``index`` is set to the lowest index corresponding to that object.h](h_It is valid to pass the same object more than once, including by passing the same event in the }(hjhhhNhNubj')}(h``objs``h]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh array and in }(hjhhhNhNubj')}(h ``alert``h]halert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh8. If a wakeup occurs due to that object being signaled, }(hjhhhNhNubj')}(h ``index``h]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh9 is set to the lowest index corresponding to that object.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMWhjyhhubh)}(h=The function may fail with ``EINTR`` if a signal is received.h](hThe function may fail with }(hj hhhNhNubj')}(h ``EINTR``h]hEINTR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubh if a signal is received.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM\hjyhhubeh}(h]h ]h"]h$]h&]uh1jHhjKhhhhhM ubeh}(h]h ](jdmacroeh"]h$]h&]jjdjj3jj3jjjuh1jhhhjhhhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jNTSYNC_IOC_WAIT_ALL (C macro)c.NTSYNC_IOC_WAIT_ALLhNtauh1jhjhhhhhNubj)}(hhh](j )}(hNTSYNC_IOC_WAIT_ALLh]j)}(hNTSYNC_IOC_WAIT_ALLh]j)}(hNTSYNC_IOC_WAIT_ALLh]j)}(hjJh]hNTSYNC_IOC_WAIT_ALL}(hjThhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjPubah}(h]h ](j/j0eh"]h$]h&]jjuh1jhjLhhhhhM^ubah}(h]h ]h"]h$]h&]jjj:uh1jj;j<hjHhhhhhM^ubah}(h]jCah ](j@jAeh"]h$]h&]jEjF)jGhuh1j hhhM^hjEhhubjI)}(hhh](h)}(hPoll on a list of objects, atomically acquiring all of them. Takes a pointer to struct :c:type:`ntsync_wait_args`, which is used identically to ``NTSYNC_IOC_WAIT_ANY``, except that ``index`` is always filled with zero on success if not woken via alert.h](hWPoll on a list of objects, atomically acquiring all of them. Takes a pointer to struct }(hjvhhhNhNubh)}(h:c:type:`ntsync_wait_args`h]j')}(hjh]hntsync_wait_args}(hjhhhNhNubah}(h]h ](jcjdc-typeeh"]h$]h&]uh1j&hj~ubah}(h]h ]h"]h$]h&]refdocjp refdomainjdreftypetype refexplicitrefwarnjvjy)}j|]j)}jjJsbc.NTSYNC_IOC_WAIT_ALLasbjntsync_wait_argsuh1hhhhKhjvubh, which is used identically to }(hjvhhhNhNubj')}(h``NTSYNC_IOC_WAIT_ANY``h]hNTSYNC_IOC_WAIT_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjvubh, except that }(hjvhhhNhNubj')}(h ``index``h]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjvubh> is always filled with zero on success if not woken via alert.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM`hjshhubh)}(hX"This function attempts to simultaneously acquire all of the given objects. If unable to do so, it sleeps until all objects become simultaneously signaled, subsequently acquiring them, or the timeout expires. In the latter case the ioctl fails with ``ETIMEDOUT`` and no objects are modified.h](hThis function attempts to simultaneously acquire all of the given objects. If unable to do so, it sleeps until all objects become simultaneously signaled, subsequently acquiring them, or the timeout expires. In the latter case the ioctl fails with }(hjhhhNhNubj')}(h ``ETIMEDOUT``h]h ETIMEDOUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh and no objects are modified.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMehjshhubh)}(hXJObjects may become signaled and subsequently designaled (through acquisition by other threads) while this thread is sleeping. Only once all objects are simultaneously signaled does the ioctl acquire them and return. The entire acquisition is atomic and totally ordered with respect to other operations on any of the given objects.h]hXJObjects may become signaled and subsequently designaled (through acquisition by other threads) while this thread is sleeping. Only once all objects are simultaneously signaled does the ioctl acquire them and return. The entire acquisition is atomic and totally ordered with respect to other operations on any of the given objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhjshhubh)}(hX If an abandoned mutex is acquired, the ioctl fails with ``EOWNERDEAD``. Similarly to ``NTSYNC_IOC_WAIT_ANY``, all objects are nevertheless marked as acquired. Note that if multiple mutex objects are specified, there is no way to know which were marked as abandoned.h](h8If an abandoned mutex is acquired, the ioctl fails with }(hjhhhNhNubj')}(h``EOWNERDEAD``h]h EOWNERDEAD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh. Similarly to }(hjhhhNhNubj')}(h``NTSYNC_IOC_WAIT_ANY``h]hNTSYNC_IOC_WAIT_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh, all objects are nevertheless marked as acquired. Note that if multiple mutex objects are specified, there is no way to know which were marked as abandoned.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMqhjshhubh)}(hXAs with "any" waits, the ``alert`` argument is an "extra" event which can terminate the wait. Critically, however, an "all" wait will succeed if all members in ``objs`` are signaled, *or* if ``alert`` is signaled. In the latter case ``index`` will be set to ``count``. As with "any" waits, if both conditions are filled, the former takes priority, and objects in ``objs`` will be acquired.h](hAs with “any” waits, the }(hj2hhhNhNubj')}(h ``alert``h]halert}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh argument is an “extra” event which can terminate the wait. Critically, however, an “all” wait will succeed if all members in }(hj2hhhNhNubj')}(h``objs``h]hobjs}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh are signaled, }(hj2hhhNhNubhemphasis)}(h*or*h]hor}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj2ubh if }(hj2hhhNhNubj')}(h ``alert``h]halert}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh! is signaled. In the latter case }(hj2hhhNhNubj')}(h ``index``h]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh will be set to }(hj2hhhNhNubj')}(h ``count``h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubhd. As with “any” waits, if both conditions are filled, the former takes priority, and objects in }(hj2hhhNhNubj')}(h``objs``h]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh will be acquired.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMwhjshhubh)}(hUnlike ``NTSYNC_IOC_WAIT_ANY``, it is not valid to pass the same object more than once, nor is it valid to pass the same object in ``objs`` and in ``alert``. If this is attempted, the function fails with ``EINVAL``.h](hUnlike }(hjhhhNhNubj')}(h``NTSYNC_IOC_WAIT_ANY``h]hNTSYNC_IOC_WAIT_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubhe, it is not valid to pass the same object more than once, nor is it valid to pass the same object in }(hjhhhNhNubj')}(h``objs``h]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh and in }(hjhhhNhNubj')}(h ``alert``h]halert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh0. If this is attempted, the function fails with }(hjhhhNhNubj')}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM~hjshhubeh}(h]h ]h"]h$]h&]uh1jHhjEhhhhhM^ubeh}(h]h ](jdmacroeh"]h$]h&]jjdjjjjjjjuh1jhhhjhhhNubeh}(h]ioctl-referenceah ]h"]ioctl referenceah$]h&]uh1hhhhhhhhKFubeh}(h]#nt-synchronization-primitive-driverah ]h"]#nt synchronization primitive driverah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjUerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j0j-j}jzjjj(j%u nametypes}(j0j}jj(uh}(j-hjzhjjj%jjj jjjIjNjjjjjjj j ji jn j j j j jy j~ j j jIjNjCjHu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.