chpoll -- poll entry point for a non-STREAMS character device driver

Synopsis (Not in current DDI version)

   #include <sys/poll.h>
   #include <sys/ddi.h>

int prefixchpoll(dev_t dev, short events, int anyyet, short *reventsp, struct pollhead **phpp);


The driver's chpoll( ) entry point routine is called in non-STREAMS drivers to determine whether certain I/O events have occurred on a given device. This overrides the standard polling semantics used for regular files. The chpoll( ) routine is a named entry point and must be defined as a global symbol.


Device number for the device to be polled.

Mask (bit-wise OR) indicating the events being polled.

A flag that indicates whether the driver should return a pointer to its pollhead structure to the caller.

A pointer to a bitmask of the returned events satisfied.

A pointer to a pointer to a pollhead structure (defined in sys/poll.h).

Return values

The chpoll routine should return 0 for success, or the appropriate error number from errnos(D5).


This entry point is optional, and is valid for non-STREAMS device drivers only. If this entry point is not provided, the polling behavior for the device is the same as for regular files. This entry point routine is called only when the device is open.

Valid values for events are:

Data is available to be read (either normal or out-of-band).

Data may be written without blocking.

High priority data are available to be read.

A device hangup.

A device error.

Normal data is available to be read.

Normal data may be written without blocking (same as POLLOUT).

Out-of-band data is available to be read.

Out-of-band data may be written without blocking.

A driver that supports polling must provide a pollhead structure for each minor device supported by the driver. Use the phalloc(D3) function to allocate the pollhead structure, and use the phfree(D3) function to free the pollhead structure, if necessary. To drivers, the pollhead structure is an opaque object; none of its members can be referenced directly.

The driver must implement the polling discipline itself. Each time the driver detects a pollable event, it should call pollwakeup(D3), passing to it the event that occurred and the address of the pollhead structure associated with the device. Note that pollwakeup should be called with only one event at a time.

When the driver's chpoll entry point is called, the driver should check if any of the events requested in events have occurred. The driver should store the mask, consisting of the subset of events that are pending, in the short pointed to by reventsp. Note that this mask may be 0 if none of the events are pending. In this case, the driver should check the anyyet flag and, if it is zero, store the address of the device's pollhead structure in the pointer pointed at by phpp. The canonical chpoll algorithm is:

   if (events_are_satisfied_now) {
   	*reventsp = events & mask_of_satisfied_events;
   } else {
   	*reventsp = 0;
   	if (!anyyet)
   		*phpp = my_local_pollhead_pointer;
   return (0);

Context and synchronization

Blockable context. The driver can block but cannot do operations such as copyout(D3) that require access to the requesting process's address space.

If the chpoll( ) entry point routine uses the sleep(D3) function to block, it must either sleep non-interruptible or use PCATCH.

Hardware applicability


Version applicability

ddi: 1, 2, 3, 4, 5, 5mp, 6, 6mp, 7, 7mp, 7.1, 7.1mp

External dependencies

Named entry point routines must be declared in the driver's Master(DSP/4dsp) file. The declaration for this entry point is $entry chpoll.

Differences between versions

Starting with DDI versions 8, the chpoll( ) entry point routine is not supported. There is no replacement.

The phalloc(D3) routine is not supported in DDI versions 1, 2, and 4 so pollhead structures must be allocated directly by the driver and must be initialized to zero before it is used with the bzero(D3) or kmem_zalloc(D3) routine or static allocation.


bzero(D3), phalloc(D3), phfree(D3), poll, pollwakeup(D3)
19 June 2005
© 2005 The SCO Group, Inc. All rights reserved.
OpenServer 6 and UnixWare (SVR5) HDK - June 2005