[haiku-commits] r34680 - haiku/trunk/src/tests/system/kernel

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 16 Dec 2009 12:45:46 +0100 (CET)

Author: axeld
Date: 2009-12-16 12:45:45 +0100 (Wed, 16 Dec 2009)
New Revision: 34680
Changeset: http://dev.haiku-os.org/changeset/34680/haiku
Ticket: http://dev.haiku-os.org/ticket/5119

Added:
   haiku/trunk/src/tests/system/kernel/port_multi_read_test.cpp
Modified:
   haiku/trunk/src/tests/system/kernel/Jamfile
Log:
* Added test that has multiple readers on a single port, and that drops into the
  same panic as #5119.


Modified: haiku/trunk/src/tests/system/kernel/Jamfile
===================================================================
--- haiku/trunk/src/tests/system/kernel/Jamfile 2009-12-15 22:19:08 UTC (rev 
34679)
+++ haiku/trunk/src/tests/system/kernel/Jamfile 2009-12-16 11:45:45 UTC (rev 
34680)
@@ -30,6 +30,8 @@
 
 SimpleTest port_delete_test : port_delete_test.cpp ;
 
+SimpleTest port_multi_read_test : port_multi_read_test.cpp ;
+
 SimpleTest port_wakeup_test_1 : port_wakeup_test_1.cpp ;
 SimpleTest port_wakeup_test_2 : port_wakeup_test_2.cpp ;
 SimpleTest port_wakeup_test_3 : port_wakeup_test_3.cpp ;

Added: haiku/trunk/src/tests/system/kernel/port_multi_read_test.cpp
===================================================================
--- haiku/trunk/src/tests/system/kernel/port_multi_read_test.cpp                
                (rev 0)
+++ haiku/trunk/src/tests/system/kernel/port_multi_read_test.cpp        
2009-12-16 11:45:45 UTC (rev 34680)
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+#include <OS.h>
+
+
+#define THREAD_COUNT   20
+
+
+status_t
+read_thread(void* _data)
+{
+       port_id port = (port_id)_data;
+
+       printf("[%ld] read port...\n", find_thread(NULL));
+       
+       while (true) {
+               ssize_t bytesWaiting = port_buffer_size(port);
+               printf("[%ld] buffer size %ld waiting\n", find_thread(NULL),
+                       bytesWaiting);
+
+               char buffer[256];
+               int32 code;
+               status_t status = read_port(port, &code, buffer, 
sizeof(buffer));
+               printf("[%ld] read port result (code %lx): %s\n", 
find_thread(NULL),
+                       code, strerror(status));
+               if (status == B_OK)
+                       break;
+       }
+
+       return B_OK;
+}
+
+
+int
+main()
+{
+       port_id port = create_port(1, "test port");
+       printf("created port %ld\n", port);
+
+       thread_id threads[THREAD_COUNT];
+       for (int32 i = 0; i < THREAD_COUNT; i++) {
+               threads[i] = spawn_thread(read_thread, "read thread", 
B_NORMAL_PRIORITY,
+                       (void*)port);
+               resume_thread(threads[i]);
+       }
+
+       printf("snooze for a bit, all threads should be waiting now.");
+       snooze(100000);
+
+       for (int32 i = 0; i < THREAD_COUNT; i++) {
+               size_t bytes = 20 + i;
+               char buffer[bytes];
+               memset(buffer, 0x55, bytes);
+
+               printf("send %ld bytes\n", bytes);
+               write_port(port, 0x42, buffer, bytes);
+               snooze(10000);
+       }
+
+       printf("waiting for threads to terminate\n");
+       for (int32 i = 0; i < THREAD_COUNT; i++) {
+               wait_for_thread(threads[i], NULL);
+       }
+
+       return 0;
+}


Other related posts:

  • » [haiku-commits] r34680 - haiku/trunk/src/tests/system/kernel - axeld