xref: /haiku/src/tests/system/kernel/port_multi_read_test.cpp (revision 7d592ec4d20e77818a090c3a0c43b6f3c4a6cd27)
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