|
|
1.1 root 1: vv_sslleeeepp() -- Accessible Kernel Routine
2:
3: #iinncclluuddee <ssyyss/sscchheedd.hh>
4: vvooiidd
5: vv_sslleeeepp(_e, _c_v, _i_v, _s_v, _s_t_r)
6: cchhaarr *_e;
7: iinntt _c_v, _i_v, _s_v;
8: cchhaarr *_s_t_r;
9:
10: vv_sslleeeepp() suspends processing of a process until event _e has completed. _e
11: normally represents a data item's address in the static kernel data space.
12:
13: _s_t_r is a human readable event name displayed by command ppss. _c_v is the
14: scheduling value set to obtain the CPU as soon as the process awakes. _i_v
15: is the swap value obtained to keep the process in memory for the duration
16: of the sleep. _s_v is the swap value that allows the process to be swapped
17: in if it has been swapped out. The following table gives the manifest
18: constants to use with _c_v, _i_v, and _s_v for normal processing tasks, as set in
19: the header file <ssyyss/sscchheedd.hh>:
20:
21: Child Process CCVVCCHHIILLDD IIVVCCHHIILLDD SSVVCCHHIILLDD
22: Swapper CCVVSSWWAAPP IIVVSSWWAAPP SSVVSSWWAAPP
23: Wait for Block I/O to Complete CCVVBBLLKKIIOO IIVVBBLLKKIIOOSSVVBBLLKKIIOO
24: Wait for Gate to Open CCVVGGAATTEE IIVVGGAATTEE SSVVGGAATTEE
25: Terminal Output CCVVTTTTOOUUTT IIVVTTTTOOUUTT SSVVTTTTOOUUTT
26: Wait for Free clists CCVVCCLLIISSTT IIVVCCLLIISSTT SSVVCCLLIISSTT
27: Process Trace CCVVPPTTSSEETT IIVVPPTTSSEETT SSVVPPTTSSEETT
28: Process Trace Stop CCVVPPTTRREETT IIVVPPTTRREETT SSVVPPTTRREETT
29: Waiting for a Pipe CCVVPPIIPPEE IIVVPPIIPPEE SSVVPPIIPPEE
30: Terminal Input CCVVTTTTIINN IIVVTTTTIINN SSVVTTTTIINN
31: Pause CCVVPPAAUUSSEE IIVVPPAAUUSSEE SSVVPPAAUUSSEE
32: Wait CCVVWWAAIITT IIVVWWAAIITT SSVVWWAAIITT
33:
34: If _c_v is less than _C_V_N_O_S_I_G, then signals may abort the process without
35: returning from the sleep.
36:
37: Please note the following caveats when using vv_sslleeeepp(). Disobeying these
38: rules can jeopardize the health of your system.
39:
40: First, your driver can vv_sslleeeepp() while it waits for some condition to be
41: satisfied. However, the vv_sslleeeepp() may return prematurely; therefore, you
42: must place the call to vv_sslleeeepp() within a loop and check for the initial
43: condition to still be valid. Normally, a sleep is performed in the
44: following manner:
45:
46: set interrupt priority to keep out the gremlins
47: while (work is not yet completed)
48: v_sleep( &some_variable_in_the_kernel_data_area, ... )
49: restore interrupt mask
50:
51: The interrupt routine will, in turn, call wwaakkeeuupp() or defer wakeup for
52: later background processing if time is not an issue. This will cause the
53: aforementioned code to return from the call to vv_sslleeeepp().
54:
55: As you can see, there is an inherent race condition between the wwhhiillee and
56: vv_sslleeeepp(). If the work is serviced while the driver is vv_sslleeeepp()ing, the
57: wwhhiillee loop will work correctly. However, should the last interrupt happen
58: after the wwhhiillee but before the vv_sslleeeepp(), the driver will deadlock -- it
59: will, in effect, be waiting for Godot.
60:
61: vv_sslleeeepp() returns for various reasons, but you cannot always depend on it
62: to return for reasons other than a process calling wwaakkeeuupp() on the variable
63: that your driver fell asleep on. So, if your driver is waiting for
64: something to happen based upon an interrupt, be sure to bracket the call to
65: vv_sslleeeepp() with calls to the kernel routines sspphhii() and ssppll().
66:
67: _S_e_e _A_l_s_o
68: aacccceessssiibbllee kkeerrnneell rroouuttiinneess, sspphhii(), ssppll(), wwaakkeeuupp()
69:
70: _N_o_t_e_s
71: Please note the following warnings:
72:
73: -> Do not call vv_sslleeeepp(), either directly or indirectly, from the block
74: routine of a driver.
75:
76: -> Do not call vv_sslleeeepp(), either directly or indirectly, from with an
77: interrupt handler. When the interrupt occurs, the driver does not
78: know which process was running at the time, so it does not whose _u
79: _a_r_e_a it will be sleeping on. Thus, calling vv_sslleeeepp() from within an
80: interrupt handler will deadlock your driver.
81:
82: -> Calling vv_sslleeeepp() from the load routine of a driver linked to the
83: kernel will cause a panic.
84:
85: -> Always check for signals while sleeping. Failure to do so will result
86: in user processes which cannot be terminated due to an uncooperative
87: device driver. For example, the following code fragment can be used
88: in a blocking driver _x_xooppeenn() routine to allow the user to break out
89: of a sleep by hitting the interrupt character on the keyboard.
90:
91: if (SELF->p_ssig && nondsig()) { /* received a signal? */
92: u.u_error = EINTR; /* indicate that we were interrupted */
93: return; /* return to user process */
94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.