xref: /haiku/src/tests/system/kernel/port_wakeup_test_2.cpp (revision c8b86e7067b56da2e6192cede4ae629fa39cefad)
1 /*
2  * Copyright 2006, Marcus Overhagen, <marcus@overhagen.de>
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <OS.h>
8 #include <stdio.h>
9 #include <string.h>
10 
11 
12 /*
13  *
14  */
15 
16 port_id id;
17 char data[100];
18 
19 int32
test_thread(void *)20 test_thread(void *)
21 {
22 	ssize_t size;
23 	int32 code;
24 
25 	// BeBook: does block when port is empty, and unblocks when port is written to or deleted
26 	printf("read port...\n");
27 	size = read_port(id, &code, data, sizeof(data));
28 	printf("read port code %lx, size %ld (0x%08lx) (%s)\n", code, size, size, strerror(size));
29 
30 	return 0;
31 }
32 
33 
34 int
main()35 main()
36 {
37 	status_t s;
38 	ssize_t size;
39 	int32 code;
40 
41 	id = create_port(1, "test port");
42 	printf("created port %ld\n", id);
43 
44 	s = write_port(id, 0x1234, data, 10);
45 	printf("write port result 0x%08lx (%s)\n", s, strerror(s));
46 
47 	size = read_port(id, &code, data, sizeof(data));
48 	printf("read port code %lx, size %ld (0x%08lx) (%s)\n", code, size, size, strerror(size));
49 
50 	printf("read should block for 5 seconds now, as port is empty\n");
51 
52 	thread_id thread = spawn_thread(test_thread, "test thread", B_NORMAL_PRIORITY, NULL);
53 	resume_thread(thread);
54 	snooze(5000000);
55 
56 	printf("write port...\n");
57 	s = write_port(id, 0x5678, data, 20);
58 	printf("write port result 0x%08lx (%s)\n", s, strerror(s));
59 
60 	printf("waiting for thread to terminate\n");
61 	wait_for_thread(thread, &s);
62 
63 	return 0;
64 }
65