|
|
1.1 root 1: rraaccee ccoonnddiittiioonn -- Definition
2:
3:
4: The term _r_a_c_e _c_o_n_d_i_t_i_o_n refers to the condition that exists when the the
5: outcome of a sequence of instructions cannot be guaranteed. This occurs
6: when program has two sections of code that can run in any order and either
7: share a variable or change the state of the machine: the code executed
8: first wins the ``race'' and so controls execution of the program.
9: Obviously, it is desirable to avoid this situation; you can do so if you
10: can force a certain ordering of the code sections.
11:
12: Race conditions most often happen in operating system related environments.
13: If, as in the case of a device driver, your program has a main section of
14: code that manipulates a few variables and it also has an interrupt handler
15: that does the same, your program must lock out interrupts during certain
16: critical times to guarantee that the variables will not be compromised.
17:
18: Consider, for example, the following pseudo-code:
19:
20: set interrupt priority to keep out the gremlins
21: while (work is not yet completed)
22: v_sleep( &some_variable_in_the_kernel_data_area )
23: restore interrupt mask
24:
25: If an interrupt were to occur between the wwhhiillee statement and the call to
26: vv_sslleeeepp(), the driver would never wake up because the event it was waiting
27: for (sleeping on) will have already occurred. To avoid this situation,
28: your code must this block of code with calls to the kernel functions
29: sspphhii()/ssppll(). This will ensure that interrupts cannot occur until after
30: vv_sslleeeepp() has been called. The system will re-enable interrupts when the
31: driver calls vv_sslleeeepp(), but it is guaranteed to have the same interrupt
32: level (mask) when it awakens, thus preserving the lockout of the interrupt
33: handler.
34:
35: In most cases, drivers lock out interrupts when manipulating the internal
36: linked lists associated with tasks to be performed or buffers in use. This
37: keeps the interrupt handler from using stale data or, worse yet, a linked
38: list that isn't correctly linked.
39:
40: _S_e_e _A_l_s_o
41: ddeevviiccee ddrriivveerrss
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.