18 create_test_area(const char* name
, int** address
, uint32 protection
)
20 area_id area
= create_area(name
, (void**)address
, B_ANY_ADDRESS
,
21 B_PAGE_SIZE
, B_NO_LOCK
, protection
);
23 fprintf(stderr
, "Error: Failed to create area %s: %s\n", name
,
33 clone_test_area(const char* name
, int** address
, uint32 protection
,
36 area_id area
= clone_area(name
, (void**)address
, B_ANY_ADDRESS
,
39 fprintf(stderr
, "Error: Failed to clone area %s: %s\n", name
,
51 // allocate read-only areas
52 const int kAreaCount
= 4;
53 area_id areas
[kAreaCount
];
54 int* areaAddresses
[kAreaCount
];
56 areas
[0] = create_test_area("area0", &areaAddresses
[0], B_READ_AREA
);
57 areas
[1] = create_test_area("area1", &areaAddresses
[1], B_READ_AREA
);
58 areas
[2] = create_test_area("area2", &areaAddresses
[2], B_READ_AREA
);
59 areaAddresses
[3] = (int*)test_function
;
60 areas
[3] = area_for(areaAddresses
[3]);
62 int* area2CloneAddress
;
63 /*area_id area2Clone =*/ clone_test_area("area2clone", &area2CloneAddress
,
64 B_READ_AREA
| B_WRITE_AREA
, areas
[2]);
66 int area3Value
= *areaAddresses
[3];
68 for (int i
= 0; i
< kAreaCount
; i
++) {
69 printf("parent: areas[%d]: %ld, %p (0x%08x)\n", i
, areas
[i
],
70 areaAddresses
[i
], *areaAddresses
[i
]);
76 fprintf(stderr
, "Error: Failed to fork(): %s\n", strerror(errno
));
82 pid
= find_thread(NULL
);
84 int expectedValues
[kAreaCount
] = {
85 0, // CoW -- the child should see the original value
86 pid
, // clone -- the child should see the change
87 pid
, // clone -- the child should see the change
88 area3Value
// CoW -- the child should see the original value
89 // Note: It looks alright in BeOS in the first run,
90 // but the parent actually seems to modify some
91 // cached page, and in the next run, we'll see
95 // get the IDs of the copied areas
96 area_id parentAreas
[kAreaCount
];
97 for (int i
= 0; i
< kAreaCount
; i
++) {
98 parentAreas
[i
] = areas
[i
];
99 areas
[i
] = area_for(areaAddresses
[i
]);
102 for (int i
= 0; i
< kAreaCount
; i
++) {
103 printf("child: areas[%d]: %ld, %p\n", i
, areas
[i
],
108 delete_area(areas
[1]);
109 areas
[1] = clone_test_area("child:area1", &areaAddresses
[1],
110 B_READ_AREA
, parentAreas
[1]);
113 delete_area(areas
[2]);
114 areas
[2] = clone_test_area("child:area2", &areaAddresses
[2],
115 B_READ_AREA
, parentAreas
[2]);
119 for (int i
= 0; i
< kAreaCount
; i
++) {
120 printf("child: area[%d] contains: 0x%08x (expected: 0x%08x)\n", i
,
121 *areaAddresses
[i
], expectedValues
[i
]);
129 for (int i
= 0; i
< kAreaCount
; i
++) {
130 status_t error
= set_area_protection(areas
[i
],
131 B_READ_AREA
| B_WRITE_AREA
);
133 *areaAddresses
[i
] = pid
;
135 fprintf(stderr
, "parent: Error: set_area_protection(areas[%d]) "
136 "failed: %s\n", i
, strerror(error
));
141 wait_for_thread(pid
, &result
);