SCO OpenServer


lockb, unlockb -- lock and unlock critical code section for single processor access


#include <sys/ci/cilock.h>

int lockb(struct lockb *lock_xxtab);

int lockb5(struct lockb *lock_xxtab);

void unlockb(struct lockb *lock_xxtab, int oldspl);


lockb( ) and unlockb( ) implement a spin lock that is used to ensure atomic access of a critical code section (see ``Critical code section'' in HDK Technical Reference) in multithreaded drivers.


Pointer to a lockb(D4oddi) structure that indicates the address of the lock.

The spl level, returned by the lockb( ) function, to be restored by unlockb. If the value of oldspl is set to -1, then unlockb does not restore the spl value; the driver must restore the spl value after the call to unlockb completes.

Return values

lockb and lockb5 return the previous spl value. unlockb does not return a value.


The lockb( ) acquires the requested lock, spins at spl7, and returns the previous spl level. While this lock is held, a process on another processor that attempts to obtain the lock will spin (busy wait). This ensures that only one processor executes the critical code section at a time.

lockb5( ) is identical to lockb( ) except it spins at spl5. This is the recommended lock interface for network drivers since it allows clock interrupts.

Locks must be released in the same order as they are acquired. See ``Spin locks (ODDI)'' in HDK Technical Reference for a full list of guidelines that must be followed when using spin locks.

The unlockb( ) function releases the lock and returns the processor to the previous spl level, restoring multiprocessor access. The address of lock_xxtab parameter to the unlockb function must be the same address used in the lockb or lockb5 call.

clockb(D3oddi) can be used to conditionally acquire a lock that was acquired by lockb( ). clockb( ) will acquire the lock if it is not already held, but does not block waiting for the lock to be available.

Context and synchronization

Non-blockable, interrupt, user, or blockable context.

Hardware applicability


Version applicability

oddi: 2mp, 3, 3mp, 4, 4mp, 5, 5mp, 6, 6mp

SVR5 DDI compatibility

DDI does not support these locking functions; see ``Spin locks (DDI)'' in HDK Technical Reference for information about the functions used to implement spin locks in DDI drivers. Note that DDI provides specialized spin locks (read locks, write locks, and trylocks) that can be used to reduce contention of the locks in the driver. DDI provides additional types of locks and other synchronization primitives; when porting a driver to DDI, you may want to replace some spin locks with sleep locks or synchronization variables; see ``Synchronization primitives'' in HDK Technical Reference for a list.


clockb(D3oddi), ilockb(D3oddi), spl(D3oddi)

``Critical code section'' in HDK Technical Reference
``Spin locks (ODDI)'' in HDK Technical Reference


Refer to the can_doio(D3oddi) manual page for an example of the use of lockb and unlockb. The sample MDI drivers provided in the HDK illustrate the use of unlockb5.
19 June 2005
© 2005 The SCO Group, Inc. All rights reserved.
OpenServer 5 HDK - June 2005