169725587SAxel Dörfler /*
269725587SAxel Dörfler * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
369725587SAxel Dörfler * Distributed under the terms of the MIT License.
469725587SAxel Dörfler */
569725587SAxel Dörfler
669725587SAxel Dörfler
769725587SAxel Dörfler #include <stdio.h>
869725587SAxel Dörfler #include <string.h>
969725587SAxel Dörfler
1069725587SAxel Dörfler #include <OS.h>
1169725587SAxel Dörfler
1269725587SAxel Dörfler
1369725587SAxel Dörfler #define THREAD_COUNT 20
1469725587SAxel Dörfler
1569725587SAxel Dörfler
1669725587SAxel Dörfler status_t
read_thread(void * _data)1769725587SAxel Dörfler read_thread(void* _data)
1869725587SAxel Dörfler {
1969725587SAxel Dörfler port_id port = (port_id)_data;
2069725587SAxel Dörfler
2169725587SAxel Dörfler printf("[%ld] read port...\n", find_thread(NULL));
2269725587SAxel Dörfler
2369725587SAxel Dörfler while (true) {
24*7d592ec4SAxel Dörfler ssize_t bytes = port_buffer_size(port);
25*7d592ec4SAxel Dörfler printf("[%ld] buffer size %ld waiting\n", find_thread(NULL), bytes);
2669725587SAxel Dörfler
2769725587SAxel Dörfler char buffer[256];
2869725587SAxel Dörfler int32 code;
29*7d592ec4SAxel Dörfler bytes = read_port(port, &code, buffer, sizeof(buffer));
3069725587SAxel Dörfler printf("[%ld] read port result (code %lx): %s\n", find_thread(NULL),
31*7d592ec4SAxel Dörfler code, strerror(bytes));
32*7d592ec4SAxel Dörfler if (bytes >= 0)
3369725587SAxel Dörfler break;
3469725587SAxel Dörfler }
3569725587SAxel Dörfler
3669725587SAxel Dörfler return B_OK;
3769725587SAxel Dörfler }
3869725587SAxel Dörfler
3969725587SAxel Dörfler
4069725587SAxel Dörfler int
main()4169725587SAxel Dörfler main()
4269725587SAxel Dörfler {
4369725587SAxel Dörfler port_id port = create_port(1, "test port");
4469725587SAxel Dörfler printf("created port %ld\n", port);
4569725587SAxel Dörfler
4669725587SAxel Dörfler thread_id threads[THREAD_COUNT];
4769725587SAxel Dörfler for (int32 i = 0; i < THREAD_COUNT; i++) {
4869725587SAxel Dörfler threads[i] = spawn_thread(read_thread, "read thread", B_NORMAL_PRIORITY,
4969725587SAxel Dörfler (void*)port);
5069725587SAxel Dörfler resume_thread(threads[i]);
5169725587SAxel Dörfler }
5269725587SAxel Dörfler
53*7d592ec4SAxel Dörfler printf("snooze for a bit, all threads should be waiting now.\n");
5469725587SAxel Dörfler snooze(100000);
5569725587SAxel Dörfler
5669725587SAxel Dörfler for (int32 i = 0; i < THREAD_COUNT; i++) {
5769725587SAxel Dörfler size_t bytes = 20 + i;
5869725587SAxel Dörfler char buffer[bytes];
5969725587SAxel Dörfler memset(buffer, 0x55, bytes);
6069725587SAxel Dörfler
6169725587SAxel Dörfler printf("send %ld bytes\n", bytes);
6269725587SAxel Dörfler write_port(port, 0x42, buffer, bytes);
6369725587SAxel Dörfler snooze(10000);
6469725587SAxel Dörfler }
6569725587SAxel Dörfler
6669725587SAxel Dörfler printf("waiting for threads to terminate\n");
6769725587SAxel Dörfler for (int32 i = 0; i < THREAD_COUNT; i++) {
6869725587SAxel Dörfler wait_for_thread(threads[i], NULL);
6969725587SAxel Dörfler }
7069725587SAxel Dörfler
7169725587SAxel Dörfler return 0;
7269725587SAxel Dörfler }
73