1/*
2 * Copyright 2009, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <stdio.h>
8#include <string.h>
9
10#include <OS.h>
11
12
13#define THREAD_COUNT	20
14
15
16status_t
17read_thread(void* _data)
18{
19	port_id port = (port_id)_data;
20
21	printf("[%ld] read port...\n", find_thread(NULL));
22
23	while (true) {
24		ssize_t bytes = port_buffer_size(port);
25		printf("[%ld] buffer size %ld waiting\n", find_thread(NULL), bytes);
26
27		char buffer[256];
28		int32 code;
29		bytes = read_port(port, &code, buffer, sizeof(buffer));
30		printf("[%ld] read port result (code %lx): %s\n", find_thread(NULL),
31			code, strerror(bytes));
32		if (bytes >= 0)
33			break;
34	}
35
36	return B_OK;
37}
38
39
40int
41main()
42{
43	port_id port = create_port(1, "test port");
44	printf("created port %ld\n", port);
45
46	thread_id threads[THREAD_COUNT];
47	for (int32 i = 0; i < THREAD_COUNT; i++) {
48		threads[i] = spawn_thread(read_thread, "read thread", B_NORMAL_PRIORITY,
49			(void*)port);
50		resume_thread(threads[i]);
51	}
52
53	printf("snooze for a bit, all threads should be waiting now.\n");
54	snooze(100000);
55
56	for (int32 i = 0; i < THREAD_COUNT; i++) {
57		size_t bytes = 20 + i;
58		char buffer[bytes];
59		memset(buffer, 0x55, bytes);
60
61		printf("send %ld bytes\n", bytes);
62		write_port(port, 0x42, buffer, bytes);
63		snooze(10000);
64	}
65
66	printf("waiting for threads to terminate\n");
67	for (int32 i = 0; i < THREAD_COUNT; i++) {
68		wait_for_thread(threads[i], NULL);
69	}
70
71	return 0;
72}
73