1/*
2 * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7//!	Test application that reproduces bug #4778.
8
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13
14#include <OS.h>
15
16#include <syscalls.h>
17
18
19status_t
20memory_eater(void*)
21{
22	size_t total = 0;
23
24	while (true) {
25		size_t size = rand() % 16384 + 8;
26		if (malloc(size) == NULL) {
27			printf("out of memory after having allocated %ld bytes\n", total);
28			break;
29		} else
30			total += size;
31
32		putchar('.');
33	}
34
35	return B_OK;
36}
37
38
39status_t
40area_creator(void*)
41{
42	while (true) {
43		status_t status = B_ERROR;
44		uint32 addressSpec = B_ANY_ADDRESS;
45		void* base;
46		bool readOnly = false;//(rand() % 256) > 127;
47		if (!readOnly) {
48			// reserve 128 MB of space for the area
49			base = (void*)0x60000000;
50			status = _kern_reserve_address_range((addr_t*)&base, B_BASE_ADDRESS,
51				128 * 1024 * 1024);
52			addressSpec = status == B_OK ? B_EXACT_ADDRESS : B_BASE_ADDRESS;
53			printf("\naddress spec = %lx, base %p (status %s)\n", addressSpec,
54				base, strerror(status));
55		}
56
57		area_id area = create_area(readOnly ? "read-only memory" : "r/w memory",
58			&base, addressSpec, B_PAGE_SIZE * 4, B_NO_LOCK,
59			B_READ_AREA | (readOnly ? 0 : B_WRITE_AREA));
60		if (area >= 0) {
61			printf("new %s area %ld at %p\n", readOnly ? "read-only" : "r/w",
62				area, base);
63		} else
64			break;
65
66		snooze(10000);
67	}
68
69	return B_OK;
70}
71
72
73int
74main(int argc, char** argv)
75{
76	thread_id eater = spawn_thread(&memory_eater, "memory eater",
77		B_NORMAL_PRIORITY, NULL);
78	resume_thread(eater);
79
80	thread_id creator = spawn_thread(&area_creator, "area creator",
81		B_NORMAL_PRIORITY, NULL);
82	resume_thread(creator);
83
84	object_wait_info waitInfos[2] = {
85		{ eater, B_OBJECT_TYPE_THREAD, 0 },
86		{ creator, B_OBJECT_TYPE_THREAD, 0 }
87	};
88	ssize_t which = wait_for_objects(waitInfos, 2);
89	printf("wait for objects: %ld\n", which);
90
91	debugger("Welcome to the land of tomorrow");
92	return 0;
93}
94