root / lab4 / .minix-src / include / minix / endpoint.h @ 14
History | View | Annotate | Download (3.04 KB)
1 | 13 | up20180614 | |
---|---|---|---|
2 | #ifndef _MINIX_ENDPOINT_H
|
||
3 | #define _MINIX_ENDPOINT_H 1 |
||
4 | |||
5 | #include <minix/sys_config.h> |
||
6 | #include <minix/com.h> |
||
7 | #include <limits.h> |
||
8 | #include <minix/type.h> |
||
9 | |||
10 | /*
|
||
11 | * Endpoints are split into two parts: a process slot and a generation number.
|
||
12 | *
|
||
13 | * The process slot number identifies the slot in various process tables.
|
||
14 | * It is positive or zero for user processes, and negative for kernel tasks.
|
||
15 | * Constants dictate that with the current endpoint layout, the maximum range
|
||
16 | * of process slot numbers is [-MAX_NR_TASKS,MAX_NR_PROCS>. The used part of
|
||
17 | * the range is currently [-NR_TASKS,NR_PROCS> -- these two constants may be
|
||
18 | * changed within the maximum range without changing the endpoint layout.
|
||
19 | *
|
||
20 | * The generation number is a per-slot number that gets increased by one every
|
||
21 | * time a slot is reused for a new process. The generation number minimizes
|
||
22 | * the chance that the endpoint of a dead process can (accidentially) be used
|
||
23 | * to communicate with a different, live process. Preventing such accidents
|
||
24 | * is essential for proper system service restartability support.
|
||
25 | *
|
||
26 | * The split between the two parts of the endpoint is such that when the
|
||
27 | * generation number is zero, the endpoint number equals the process slot
|
||
28 | * number, even for negative task numbers. This is required for the endpoint
|
||
29 | * numbers hardcoded in <minix/com.h>, and it makes endpoint numbers easy to
|
||
30 | * read in general.
|
||
31 | *
|
||
32 | * There are three special endpoint numbers: ANY, NONE, and SELF. These
|
||
33 | * numbers are used to identify "any process", "no process at all", and
|
||
34 | * "own process", respectively. They fall outside the normal range of
|
||
35 | * process slot numbers, and are always of generation zero.
|
||
36 | */
|
||
37 | |||
38 | /*
|
||
39 | * The following constant defines the split between the two parts of the
|
||
40 | * endpoint numbers. It can be adjusted to allow for either more processes
|
||
41 | * or more per-process generation numbers. Changing it will change the
|
||
42 | * endpoint number layout, and thus break binary compatibility with existing
|
||
43 | * processes.
|
||
44 | */
|
||
45 | #define _ENDPOINT_GENERATION_SHIFT 15 |
||
46 | |||
47 | /* Derived constants. */
|
||
48 | #define _ENDPOINT_GENERATION_SIZE (1 << _ENDPOINT_GENERATION_SHIFT) |
||
49 | /* INT_MAX is used here to prevent signedness issues with the macros below. */
|
||
50 | #define _ENDPOINT_MAX_GENERATION (INT_MAX/_ENDPOINT_GENERATION_SIZE-1) |
||
51 | #define _ENDPOINT_SLOT_TOP (_ENDPOINT_GENERATION_SIZE-MAX_NR_TASKS)
|
||
52 | |||
53 | /* The special endpoint numbers, and the resulting maximum slot number. */
|
||
54 | #define ANY ((endpoint_t) (_ENDPOINT_SLOT_TOP - 1)) |
||
55 | #define NONE ((endpoint_t) (_ENDPOINT_SLOT_TOP - 2)) |
||
56 | #define SELF ((endpoint_t) (_ENDPOINT_SLOT_TOP - 3)) |
||
57 | #define MAX_NR_PROCS (_ENDPOINT_SLOT_TOP - 3) /* (int)SELF */ |
||
58 | |||
59 | /* Sanity check. */
|
||
60 | #if NR_PROCS > MAX_NR_PROCS
|
||
61 | #error "NR_PROCS exceeds MAX_NR_PROCS, increase _ENDPOINT_GENERATION_SHIFT" |
||
62 | #endif
|
||
63 | |||
64 | /* Generation + Process slot number <-> endpoint. */
|
||
65 | #define _ENDPOINT(g, p) \
|
||
66 | ((endpoint_t)(((g) << _ENDPOINT_GENERATION_SHIFT) + (p))) |
||
67 | #define _ENDPOINT_G(e) (((e)+MAX_NR_TASKS) >> _ENDPOINT_GENERATION_SHIFT)
|
||
68 | #define _ENDPOINT_P(e) \
|
||
69 | ((((e)+MAX_NR_TASKS) & (_ENDPOINT_GENERATION_SIZE - 1)) - MAX_NR_TASKS)
|
||
70 | |||
71 | #endif |