Here's some news on the effor to porting libdispatch to other platforms: * libkqueue has been submitted for inclusion in Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=684446 * libpthread_workqueue has been uploaded to the Debian archive: http://ftp-master.debian.org/new/libpthread-workqueue_0.4.1-1.html * All of the libdispatch unit tests are working on Linux using the latest SVN sources of libkqueue and libpthread_workqueue. Here's the output: ================================================== [TEST] Dispatch (Public) API [PID] 23983 ================================================== Actual: 0x602540 Expected: 0x602540 [PASS] dispatch_get_main_queue PASS: dispatch_api ================================================== [TEST] Dispatch C99 [PID] 24003 ================================================== Actual: 0x602540 Expected: 0x602540 [PASS] dispatch_get_main_queue PASS: dispatch_c99 ================================================== [TEST] Dispatch Cascade [PID] 24023 ================================================== maxcount = 2993 * * * * * * * * * * * * * * * * * ** * ** * * ** * * * ** * * ** ** ****** * * ** ****** * ** * * * * PASS: dispatch_cascade ================================================== [TEST] Dispatch Debug [PID] 24045 ================================================== PASS: dispatch_debug ================================================== [TEST] Dispatch Starfish [PID] 24066 ================================================== lap: 10 count: 1000 delta: 753127910 ns math: 376.187767 ns / lap Actual: 376 Expected: <1000 [PASS] Latency lap: 9 count: 1000 delta: 237370287 ns math: 118.566577 ns / lap Actual: 118 Expected: <1000 [PASS] Latency lap: 8 count: 1000 delta: 204984482 ns math: 102.389851 ns / lap Actual: 102 Expected: <1000 [PASS] Latency lap: 7 count: 1000 delta: 388445296 ns math: 194.028619 ns / lap Actual: 194 Expected: <1000 [PASS] Latency lap: 6 count: 1000 delta: 361531258 ns math: 180.585044 ns / lap Actual: 180 Expected: <1000 [PASS] Latency lap: 5 count: 1000 delta: 187446526 ns math: 93.629633 ns / lap Actual: 93 Expected: <1000 [PASS] Latency lap: 4 count: 1000 delta: 155628229 ns math: 77.736378 ns / lap Actual: 77 Expected: <1000 [PASS] Latency lap: 3 count: 1000 delta: 241324652 ns math: 120.541784 ns / lap Actual: 120 Expected: <1000 [PASS] Latency lap: 2 count: 1000 delta: 179030487 ns math: 89.425818 ns / lap Actual: 89 Expected: <1000 [PASS] Latency lap: 1 count: 1000 delta: 147013706 ns math: 73.433420 ns / lap Actual: 73 Expected: <1000 [PASS] Latency PASS: dispatch_starfish ================================================== [TEST] Dispatch Priority [PID] 24140 ================================================== LOW: 77 ************************************************* DEFAULT: 0 HIGH: 115 ************************************************************************ Actual: 192 Expected: 192 [PASS] blocks completed Actual: 77 Expected: <115 [PASS] high priority precedence PASS: dispatch_priority ================================================== [TEST] Dispatch Priority (Set Target Queue) [PID] 24175 ================================================== Actual: 0x2242420 Expected: 0x2242420 [PASS] q[i] Actual: 0x22426f0 Expected: 0x22426f0 [PASS] q[i] Actual: 0x22427f0 Expected: 0x22427f0 [PASS] q[i] LOW: 45 ***************************** DEFAULT: 72 ********************************************* HIGH: 75 *********************************************** Actual: 192 Expected: 192 [PASS] blocks completed Actual: 45 Expected: <75 [PASS] high priority precedence PASS: dispatch_priority2 ================================================== [TEST] Dispatch Source Read [PID] 24205 ================================================== Actual: 0x602e90 Expected: 0x602e90 [PASS] dispatch_get_main_queue Actual: 0x134f420 Expected: 0x134f420 [PASS] DISPATCH_SOURCE_TYPE_READ bytes available: 931708 bytes read: 512000 bytes available: 419708 bytes read: 419708 Actual: 0 Expected: 0 [PASS] EOF Actual: 931708 Expected: 931708 [PASS] Bytes read Actual: 0 Expected: 0 [PASS] close PASS: dispatch_read ================================================== [TEST] Dispatch Queue Finalizer [PID] 24227 ================================================== Actual: 0xa8d420 Expected: 0xa8d420 [PASS] dispatch_queue_new Actual: 0x311694489c071ab7 Expected: 0x311694489c071ab7 [PASS] finalizer ran PASS: queue_finalizer ================================================== [TEST] Dispatch After [PID] 24247 ================================================== Actual: 0 Expected: <503549891 [PASS] can't finish faster than 5.5s Actual: 0 Expected: <496451540 [PASS] must finish faster than 6.5s Actual: 0 Expected: <500150111 [PASS] can't finish faster than 1.5s Actual: 0 Expected: <499850531 [PASS] must finish faster than 2.5s Actual: 0 Expected: <21119 [PASS] can't finish faster than 0s Actual: 0 Expected: <499979465 [PASS] must finish faster than .5s PASS: dispatch_after ================================================== [TEST] Dispatch Apply [PID] 24269 ================================================== Actual: 0x2af379697750 Expected: 0x2af379697750 [PASS] dispatch_get_concurrent_queue Actual: 32 Expected: 32 [PASS] count PASS: dispatch_apply ================================================== [TEST] Timer drift test [PID] 24289 ================================================== Actual: 0x7c7420 Expected: 0x7c7420 [PASS] DISPATCH_SOURCE_TYPE_TIMER 1: jitter 0.000000, drift 0.000000 2: jitter -0.000054, drift -0.000054 3: jitter 0.000025, drift 0.000079 4: jitter 0.000026, drift 0.000001 5: jitter 0.000023, drift -0.000003 6: jitter 0.000021, drift -0.000002 7: jitter 0.000023, drift 0.000002 8: jitter 0.000024, drift 0.000001 9: jitter 0.000025, drift 0.000001 10: jitter 0.000025, drift 0.000000 11: jitter 0.000026, drift 0.000001 12: jitter 0.000024, drift -0.000002 13: jitter 0.000023, drift -0.000001 14: jitter 0.000025, drift 0.000002 15: jitter 0.000024, drift -0.000001 16: jitter 0.000024, drift 0.000000 17: jitter 0.000024, drift -0.000000 18: jitter 0.000039, drift 0.000015 19: jitter 0.000034, drift -0.000005 20: jitter 0.000032, drift -0.000002 21: jitter 0.000035, drift 0.000003 22: jitter 0.000028, drift -0.000007 23: jitter 0.000034, drift 0.000006 24: jitter 0.000037, drift 0.000003 25: jitter 0.000033, drift -0.000004 26: jitter 0.000033, drift -0.000000 27: jitter 0.000031, drift -0.000002 28: jitter 0.000035, drift 0.000004 29: jitter 0.000036, drift 0.000001 30: jitter 0.000034, drift -0.000002 31: jitter 0.000036, drift 0.000002 32: jitter -0.000006, drift -0.000042 33: jitter 0.000033, drift 0.000039 34: jitter 0.000036, drift 0.000003 35: jitter 0.000033, drift -0.000003 36: jitter 0.000034, drift 0.000001 37: jitter -0.000200, drift -0.000234 38: jitter 0.000035, drift 0.000235 39: jitter 0.000035, drift 0.000000 40: jitter 0.000036, drift 0.000001 41: jitter 0.000034, drift -0.000002 42: jitter 0.000039, drift 0.000005 43: jitter 0.000038, drift -0.000001 44: jitter 0.000035, drift -0.000003 45: jitter 0.000092, drift 0.000057 46: jitter 0.000031, drift -0.000061 47: jitter -0.000002, drift -0.000033 48: jitter 0.000033, drift 0.000035 49: jitter 0.000036, drift 0.000003 50: jitter 0.000036, drift 0.000000 51: jitter -0.001187, drift -0.001223 52: jitter 0.000042, drift 0.001229 53: jitter 0.000027, drift -0.000015 54: jitter 0.000023, drift -0.000004 55: jitter 0.000031, drift 0.000008 56: jitter 0.000018, drift -0.000013 57: jitter -0.001240, drift -0.001258 58: jitter 0.000032, drift 0.001272 59: jitter 0.000034, drift 0.000002 60: jitter 0.000036, drift 0.000002 61: jitter 0.000034, drift -0.000002 62: jitter 0.000034, drift -0.000000 63: jitter 0.000049, drift 0.000015 64: jitter 0.000035, drift -0.000014 65: jitter -0.001232, drift -0.001267 66: jitter 0.000030, drift 0.001262 67: jitter 0.000035, drift 0.000005 68: jitter 0.000033, drift -0.000002 69: jitter 0.000035, drift 0.000002 70: jitter 0.000034, drift -0.000001 71: jitter 0.000035, drift 0.000001 72: jitter 0.000033, drift -0.000002 73: jitter 0.000029, drift -0.000004 74: jitter 0.000036, drift 0.000007 75: jitter 0.000033, drift -0.000003 76: jitter 0.000039, drift 0.000006 77: jitter 0.000026, drift -0.000013 78: jitter 0.000026, drift 0.000000 79: jitter 0.000027, drift 0.000001 80: jitter 0.000026, drift -0.000001 81: jitter 0.000027, drift 0.000001 82: jitter 0.000026, drift -0.000001 83: jitter 0.000025, drift -0.000001 84: jitter 0.000026, drift 0.000001 85: jitter 0.000029, drift 0.000003 86: jitter 0.000021, drift -0.000008 87: jitter 0.000024, drift 0.000003 88: jitter 0.000026, drift 0.000002 89: jitter 0.000027, drift 0.000001 90: jitter 0.000026, drift -0.000001 91: jitter 0.000027, drift 0.000001 92: jitter 0.000027, drift 0.000000 93: jitter 0.000026, drift -0.000001 94: jitter 0.000026, drift 0.000000 95: jitter 0.000025, drift -0.000001 96: jitter 0.000025, drift 0.000000 97: jitter 0.000025, drift -0.000000 98: jitter 0.000025, drift 0.000000 99: jitter 0.000028, drift 0.000003 100: jitter 0.000026, drift -0.000002 101: jitter 0.000027, drift 0.000001 102: jitter 0.000027, drift 0.000000 103: jitter 0.000023, drift -0.000004 104: jitter 0.000026, drift 0.000003 105: jitter 0.000025, drift -0.000001 106: jitter 0.000024, drift -0.000001 107: jitter 0.000025, drift 0.000001 108: jitter 0.000025, drift 0.000000 109: jitter 0.000026, drift 0.000001 110: jitter 0.000025, drift -0.000001 111: jitter 0.000026, drift 0.000001 112: jitter 0.000024, drift -0.000002 113: jitter 0.000025, drift 0.000001 114: jitter 0.000024, drift -0.000001 115: jitter 0.000025, drift 0.000001 116: jitter 0.000024, drift -0.000001 117: jitter 0.000024, drift -0.000000 118: jitter 0.000025, drift 0.000001 119: jitter 0.000037, drift 0.000012 120: jitter 0.000025, drift -0.000012 121: jitter 0.000026, drift 0.000001 122: jitter 0.000026, drift 0.000000 123: jitter 0.000025, drift -0.000001 124: jitter 0.000026, drift 0.000001 125: jitter 0.000026, drift 0.000000 126: jitter 0.000023, drift -0.000003 127: jitter 0.000023, drift 0.000000 128: jitter 0.000025, drift 0.000002 129: jitter 0.000027, drift 0.000002 130: jitter 0.000027, drift 0.000000 131: jitter 0.000026, drift -0.000001 132: jitter 0.000026, drift 0.000000 133: jitter 0.000024, drift -0.000002 134: jitter 0.000045, drift 0.000021 135: jitter 0.000025, drift -0.000020 136: jitter 0.000024, drift -0.000001 137: jitter 0.000024, drift -0.000000 138: jitter 0.000024, drift 0.000000 139: jitter 0.000026, drift 0.000002 140: jitter 0.000025, drift -0.000001 141: jitter 0.000027, drift 0.000002 142: jitter 0.000029, drift 0.000002 143: jitter 0.000027, drift -0.000002 144: jitter 0.000026, drift -0.000001 145: jitter 0.000026, drift 0.000000 146: jitter 0.000021, drift -0.000005 147: jitter 0.000024, drift 0.000003 148: jitter 0.000023, drift -0.000001 149: jitter 0.000025, drift 0.000002 150: jitter 0.000025, drift 0.000000 151: jitter 0.000025, drift 0.000000 152: jitter 0.000025, drift -0.000000 153: jitter 0.000025, drift 0.000000 154: jitter 0.000025, drift 0.000000 155: jitter 0.000026, drift 0.000001 156: jitter 0.000024, drift -0.000002 157: jitter 0.000023, drift -0.000001 158: jitter 0.000024, drift 0.000001 159: jitter 0.000024, drift -0.000000 160: jitter 0.000025, drift 0.000001 161: jitter 0.000026, drift 0.000001 162: jitter 0.000026, drift 0.000000 163: jitter 0.000023, drift -0.000003 164: jitter 0.000027, drift 0.000004 165: jitter 0.000026, drift -0.000001 166: jitter 0.000023, drift -0.000003 167: jitter 0.000025, drift 0.000002 168: jitter 0.000026, drift 0.000001 169: jitter 0.000027, drift 0.000001 170: jitter 0.000026, drift -0.000001 171: jitter 0.000026, drift 0.000000 172: jitter 0.000026, drift 0.000000 173: jitter 0.000039, drift 0.000013 174: jitter 0.000027, drift -0.000012 175: jitter 0.000026, drift -0.000001 176: jitter 0.000024, drift -0.000002 177: jitter 0.000026, drift 0.000002 178: jitter 0.000026, drift 0.000000 179: jitter 0.000027, drift 0.000001 180: jitter 0.000026, drift -0.000001 181: jitter 0.000026, drift 0.000000 182: jitter 0.000030, drift 0.000004 183: jitter 0.000026, drift -0.000004 184: jitter 0.000026, drift 0.000000 185: jitter 0.000027, drift 0.000001 186: jitter 0.000021, drift -0.000006 187: jitter 0.000022, drift 0.000001 188: jitter 0.000025, drift 0.000003 189: jitter 0.000025, drift 0.000000 190: jitter 0.000027, drift 0.000002 191: jitter 0.000027, drift -0.000000 192: jitter 0.000026, drift -0.000001 193: jitter 0.000025, drift -0.000001 194: jitter 0.000025, drift 0.000000 195: jitter 0.000027, drift 0.000002 196: jitter 0.000024, drift -0.000003 197: jitter 0.000024, drift -0.000000 198: jitter 0.000025, drift 0.000001 199: jitter 0.000025, drift 0.000000 200: jitter 0.000025, drift 0.000000 201: jitter 0.000027, drift 0.000002 202: jitter 0.000026, drift -0.000001 203: jitter 0.000025, drift -0.000001 204: jitter 0.000026, drift 0.000001 205: jitter 0.000026, drift 0.000000 206: jitter 0.000022, drift -0.000004 207: jitter 0.000023, drift 0.000001 208: jitter 0.000025, drift 0.000002 209: jitter 0.000027, drift 0.000002 210: jitter 0.000026, drift -0.000001 211: jitter 0.000027, drift 0.000001 212: jitter 0.000027, drift 0.000000 213: jitter 0.000029, drift 0.000002 214: jitter 0.000053, drift 0.000024 215: jitter 0.000025, drift -0.000028 216: jitter 0.000025, drift 0.000000 217: jitter 0.000024, drift -0.000001 218: jitter 0.000025, drift 0.000001 219: jitter 0.000026, drift 0.000001 220: jitter 0.000026, drift 0.000000 221: jitter 0.000050, drift 0.000024 222: jitter 0.000025, drift -0.000025 223: jitter 0.000024, drift -0.000001 224: jitter 0.000026, drift 0.000002 225: jitter 0.000025, drift -0.000001 226: jitter 0.000022, drift -0.000003 227: jitter 0.000024, drift 0.000002 228: jitter 0.000025, drift 0.000001 229: jitter 0.000026, drift 0.000001 230: jitter 0.000051, drift 0.000025 231: jitter 0.000027, drift -0.000024 232: jitter 0.000025, drift -0.000002 233: jitter 0.000026, drift 0.000001 234: jitter 0.000025, drift -0.000001 235: jitter 0.000026, drift 0.000001 236: jitter 0.000051, drift 0.000025 237: jitter 0.000019, drift -0.000032 238: jitter 0.000127, drift 0.000108 239: jitter 0.000026, drift -0.000101 240: jitter 0.000026, drift 0.000000 241: jitter 0.000026, drift 0.000000 242: jitter 0.000026, drift 0.000000 243: jitter 0.000026, drift 0.000000 244: jitter 0.000027, drift 0.000001 245: jitter 0.000027, drift 0.000000 246: jitter 0.000023, drift -0.000004 247: jitter 0.000024, drift 0.000001 248: jitter 0.000025, drift 0.000001 249: jitter 0.000026, drift 0.000001 250: jitter 0.000026, drift 0.000000 Actual: 0.000012 Expected: <0.000100 [PASS] average jitter Actual: 0.000000 Expected: <0.000100 [PASS] average drift PASS: dispatch_drift ================================================== [TEST] Dispatch Group [PID] 24311 ================================================== Actual: 0x103a420 Expected: 0x103a420 [PASS] dispatch_group_async Actual: 0x2b1490002260 Expected: 0x2b1490002260 [PASS] dispatch_group_async sleeping... sleeping... sleeping... Actual: 0 Expected: 0 [PASS] dispatch_group_wait done. done. done. Actual: 0 Expected: 0 [PASS] dispatch_group_wait Actual: 0x2b1490001420 Expected: 0x2b1490001420 [PASS] dispatch_group_async Actual: 0x602eb0 Expected: 0x602eb0 [PASS] Notification Received PASS: dispatch_group ================================================== [TEST] Dispatch Ping Pong [PID] 24334 ================================================== Actual: 0xf7d420 Expected: 0xf7d420 [PASS] dispatch_queue_create(ping) Actual: 0xf7d4d0 Expected: 0xf7d4d0 [PASS] dispatch_queue_create(pong) Actual: 0xf7d580 Expected: 0xf7d580 [PASS] dispatch_group_create Actual: 1000000 Expected: 1000000 [PASS] count PASS: dispatch_pingpong ================================================== [TEST] Dispatch Reader/Writer Queues [PID] 24355 ================================================== PASS: dispatch_readsync ================================================== [TEST] Dispatch Semaphore [PID] 24380 ================================================== Actual: 10000 Expected: 10000 [PASS] count PASS: dispatch_sema ================================================== [TEST] Dispatch Source Timer, bit 31 [PID] 24401 ================================================== Actual: 0x602a50 Expected: 0x602a50 [PASS] dispatch_get_main_queue Actual: 0x17c3420 Expected: 0x17c3420 [PASS] DISPATCH_SOURCE_TYPE_TIMER Actual: 2 Expected: <4 [PASS] elapsed time < 4s Actual: 1 Expected: <2 [PASS] elapsed time > 2s PASS: dispatch_timer_bit31 ================================================== [TEST] Dispatch Source Timer, bit 63 [PID] 24423 ================================================== 0 PASS: dispatch_timer_bit63 =================== All 18 tests passed ===================
Thanks Mark, working quite nicely now! For completeness, below are the latest results from Solaris 10/x86_64 also using clang (libkqueue r469, libpthread_workqueue r113, libdispatch r197 - current ’trunk’) - all tests succeeded. Cheers, Joakim SunOS ply 5.10 Generic_144489-06 i86pc i386 i86pc ================================================== [TEST] Dispatch (Public) API [PID] 16510 ================================================== Actual: 412970 Expected: 412970 [PASS] dispatch_get_main_queue PASS: dispatch_api ================================================== [TEST] Dispatch C99 [PID] 16526 ================================================== Actual: 412970 Expected: 412970 [PASS] dispatch_get_main_queue PASS: dispatch_c99 ================================================== [TEST] Dispatch Cascade [PID] 16542 ================================================== maxcount = 4115 * * * * * * * * * * * * * * * * * *** * * ** *** ** * ** **** ** * * PASS: dispatch_cascade ================================================== [TEST] Dispatch Debug [PID] 16558 ================================================== PASS: dispatch_debug ================================================== [TEST] Dispatch Priority [PID] 16574 ================================================== LOW: 15 ********** DEFAULT: 49 ******************************* HIGH: 128 ******************************************************************************** Actual: 192 Expected: 192 [PASS] blocks completed Actual: 15 Expected: <128 [PASS] high priority precedence PASS: dispatch_priority ================================================== [TEST] Dispatch Priority (Set Target Queue) [PID] 16590 ================================================== Actual: 415a90 Expected: 415a90 [PASS] q[i] Actual: 418590 Expected: 418590 [PASS] q[i] Actual: 418640 Expected: 418640 [PASS] q[i] LOW: 46 ***************************** DEFAULT: 62 *************************************** HIGH: 84 ***************************************************** Actual: 192 Expected: 192 [PASS] blocks completed Actual: 46 Expected: <84 [PASS] high priority precedence PASS: dispatch_priority2 ================================================== [TEST] Dispatch Starfish [PID] 16606 ================================================== lap: 10 count: 1000 delta: 1041826041 ns math: 520.392628 ns / lap Actual: 520 Expected: <1000 [PASS] Latency lap: 9 count: 1000 delta: 1092185393 ns math: 545.547149 ns / lap Actual: 545 Expected: <1000 [PASS] Latency lap: 8 count: 1000 delta: 1084189055 ns math: 541.552975 ns / lap Actual: 541 Expected: <1000 [PASS] Latency lap: 7 count: 1000 delta: 1115418469 ns math: 557.152082 ns / lap Actual: 557 Expected: <1000 [PASS] Latency lap: 6 count: 1000 delta: 1042504620 ns math: 520.731578 ns / lap Actual: 520 Expected: <1000 [PASS] Latency lap: 5 count: 1000 delta: 1104164173 ns math: 551.530556 ns / lap Actual: 551 Expected: <1000 [PASS] Latency lap: 4 count: 1000 delta: 1035682573 ns math: 517.323963 ns / lap Actual: 517 Expected: <1000 [PASS] Latency lap: 3 count: 1000 delta: 1013383389 ns math: 506.185509 ns / lap Actual: 506 Expected: <1000 [PASS] Latency lap: 2 count: 1000 delta: 1105151225 ns math: 552.023589 ns / lap Actual: 552 Expected: <1000 [PASS] Latency lap: 1 count: 1000 delta: 1095489547 ns math: 547.197576 ns / lap Actual: 547 Expected: <1000 [PASS] Latency PASS: dispatch_starfish ================================================== [TEST] Dispatch Queue Finalizer [PID] 16668 ================================================== Actual: 415de0 Expected: 415de0 [PASS] dispatch_queue_new Actual: 62595c29f2bffb0c Expected: 62595c29f2bffb0c [PASS] finalizer ran PASS: queue_finalizer ================================================== [TEST] Dispatch After [PID] 16684 ================================================== Actual: 0 Expected: <500065550 [PASS] can't finish faster than 5.5s Actual: 0 Expected: <499936177 [PASS] must finish faster than 6.5s Actual: 0 Expected: <500047574 [PASS] can't finish faster than 1.5s Actual: 0 Expected: <499953651 [PASS] must finish faster than 2.5s Actual: 0 Expected: <46552 [PASS] can't finish faster than 0s Actual: 0 Expected: <499954541 [PASS] must finish faster than .5s PASS: dispatch_after ================================================== [TEST] Dispatch Apply [PID] 16722 ================================================== Actual: fffffd7fff290550 Expected: fffffd7fff290550 [PASS] dispatch_get_concurrent_queue Actual: 32 Expected: 32 [PASS] count PASS: dispatch_apply ================================================== [TEST] Timer drift test [PID] 16738 ================================================== Actual: 415f40 Expected: 415f40 [PASS] DISPATCH_SOURCE_TYPE_TIMER 1: jitter 0.000000, drift 0.000000 2: jitter 0.000002, drift 0.000002 3: jitter 0.000005, drift 0.000003 4: jitter 0.000211, drift 0.000206 5: jitter -0.000004, drift -0.000215 6: jitter 0.000000, drift 0.000004 7: jitter 0.000003, drift 0.000003 8: jitter 0.000002, drift -0.000001 9: jitter 0.000007, drift 0.000005 10: jitter 0.000202, drift 0.000195 11: jitter 0.000002, drift -0.000200 12: jitter 0.000209, drift 0.000207 13: jitter -0.000007, drift -0.000216 14: jitter 0.000007, drift 0.000014 15: jitter 0.000003, drift -0.000004 16: jitter -0.000001, drift -0.000004 17: jitter 0.000008, drift 0.000009 18: jitter -0.000015, drift -0.000023 19: jitter -0.000030, drift -0.000015 20: jitter -0.000005, drift 0.000025 21: jitter 0.000000, drift 0.000005 22: jitter -0.000007, drift -0.000007 23: jitter -0.000009, drift -0.000002 24: jitter -0.000001, drift 0.000008 25: jitter -0.000002, drift -0.000001 26: jitter -0.000002, drift -0.000000 27: jitter 0.000003, drift 0.000005 28: jitter 0.000000, drift -0.000003 29: jitter 0.000004, drift 0.000004 30: jitter 0.000002, drift -0.000002 31: jitter 0.000006, drift 0.000004 32: jitter 0.000008, drift 0.000002 33: jitter 0.000008, drift 0.000000 34: jitter 0.000008, drift 0.000000 35: jitter 0.000002, drift -0.000006 36: jitter 0.000001, drift -0.000001 37: jitter 0.000006, drift 0.000005 38: jitter 0.000009, drift 0.000003 39: jitter 0.000008, drift -0.000001 40: jitter 0.000002, drift -0.000006 41: jitter 0.000008, drift 0.000006 42: jitter 0.000009, drift 0.000001 43: jitter 0.000009, drift 0.000000 44: jitter 0.000007, drift -0.000002 45: jitter -0.000003, drift -0.000010 46: jitter -0.000002, drift 0.000001 47: jitter 0.000003, drift 0.000005 48: jitter 0.000004, drift 0.000001 49: jitter 0.000005, drift 0.000001 50: jitter -0.000002, drift -0.000007 51: jitter 0.000006, drift 0.000008 52: jitter 0.000005, drift -0.000001 53: jitter 0.000203, drift 0.000198 54: jitter 0.000003, drift -0.000200 55: jitter 0.000003, drift 0.000000 56: jitter 0.000003, drift -0.000000 57: jitter 0.000005, drift 0.000002 58: jitter 0.000206, drift 0.000201 59: jitter 0.000005, drift -0.000201 60: jitter -0.000003, drift -0.000008 61: jitter 0.000004, drift 0.000007 62: jitter 0.000208, drift 0.000204 63: jitter 0.000008, drift -0.000200 64: jitter 0.000007, drift -0.000001 65: jitter 0.000007, drift 0.000000 66: jitter 0.000002, drift -0.000005 67: jitter 0.000007, drift 0.000005 68: jitter 0.000208, drift 0.000201 69: jitter -0.000015, drift -0.000223 70: jitter 0.000002, drift 0.000017 71: jitter 0.000209, drift 0.000207 72: jitter 0.000011, drift -0.000198 73: jitter 0.000007, drift -0.000004 74: jitter 0.000203, drift 0.000196 75: jitter 0.000003, drift -0.000200 76: jitter -0.000017, drift -0.000020 77: jitter -0.000001, drift 0.000016 78: jitter -0.000005, drift -0.000004 79: jitter 0.000008, drift 0.000013 80: jitter 0.000199, drift 0.000191 81: jitter 0.000004, drift -0.000195 82: jitter 0.000007, drift 0.000003 83: jitter 0.000008, drift 0.000001 84: jitter 0.000005, drift -0.000003 85: jitter 0.000003, drift -0.000002 86: jitter 0.000000, drift -0.000003 87: jitter 0.000003, drift 0.000003 88: jitter 0.000002, drift -0.000001 89: jitter 0.000006, drift 0.000004 90: jitter 0.000000, drift -0.000006 91: jitter 0.000006, drift 0.000006 92: jitter 0.000003, drift -0.000003 93: jitter 0.000007, drift 0.000004 94: jitter 0.000007, drift 0.000000 95: jitter 0.000004, drift -0.000003 96: jitter 0.000003, drift -0.000001 97: jitter 0.000014, drift 0.000011 98: jitter 0.000007, drift -0.000007 99: jitter 0.000009, drift 0.000002 100: jitter 0.000004, drift -0.000005 101: jitter 0.000206, drift 0.000202 102: jitter 0.000009, drift -0.000197 103: jitter 0.000010, drift 0.000001 104: jitter 0.000008, drift -0.000002 105: jitter 0.000006, drift -0.000002 106: jitter 0.000004, drift -0.000002 107: jitter 0.000007, drift 0.000003 108: jitter -0.000009, drift -0.000016 109: jitter 0.000001, drift 0.000010 110: jitter -0.000024, drift -0.000025 111: jitter 0.000004, drift 0.000028 112: jitter 0.000002, drift -0.000002 113: jitter 0.000002, drift 0.000000 114: jitter -0.000001, drift -0.000003 115: jitter 0.000004, drift 0.000005 116: jitter 0.000005, drift 0.000001 117: jitter 0.000002, drift -0.000003 118: jitter 0.000006, drift 0.000004 119: jitter -0.000012, drift -0.000018 120: jitter 0.000000, drift 0.000012 121: jitter -0.000001, drift -0.000001 122: jitter -0.000000, drift 0.000001 123: jitter 0.000006, drift 0.000006 124: jitter 0.000202, drift 0.000196 125: jitter 0.000003, drift -0.000199 126: jitter 0.000005, drift 0.000002 127: jitter -0.000000, drift -0.000005 128: jitter 0.000008, drift 0.000008 129: jitter 0.000007, drift -0.000001 130: jitter 0.000200, drift 0.000193 131: jitter 0.000007, drift -0.000193 132: jitter 0.000008, drift 0.000001 133: jitter 0.000008, drift 0.000000 134: jitter 0.000005, drift -0.000003 135: jitter 0.000007, drift 0.000002 136: jitter 0.000007, drift 0.000000 137: jitter 0.000006, drift -0.000001 138: jitter 0.000006, drift 0.000000 139: jitter 0.000009, drift 0.000003 140: jitter 0.000002, drift -0.000007 141: jitter -0.000003, drift -0.000005 142: jitter 0.000005, drift 0.000008 143: jitter 0.000006, drift 0.000001 144: jitter 0.000004, drift -0.000002 145: jitter 0.000002, drift -0.000002 146: jitter 0.000005, drift 0.000003 147: jitter 0.000003, drift -0.000002 148: jitter 0.000005, drift 0.000002 149: jitter 0.000006, drift 0.000001 150: jitter -0.000002, drift -0.000008 151: jitter 0.000005, drift 0.000007 152: jitter 0.000002, drift -0.000003 153: jitter 0.000005, drift 0.000003 154: jitter 0.000003, drift -0.000002 155: jitter -0.000004, drift -0.000007 156: jitter 0.000005, drift 0.000009 157: jitter 0.000002, drift -0.000003 158: jitter 0.000007, drift 0.000005 159: jitter 0.000005, drift -0.000002 160: jitter 0.000002, drift -0.000003 161: jitter 0.000006, drift 0.000004 162: jitter 0.000009, drift 0.000003 163: jitter 0.000009, drift 0.000000 164: jitter 0.000007, drift -0.000002 165: jitter 0.000004, drift -0.000003 166: jitter 0.000007, drift 0.000003 167: jitter 0.000008, drift 0.000001 168: jitter 0.000009, drift 0.000001 169: jitter -0.000007, drift -0.000016 170: jitter 0.000008, drift 0.000015 171: jitter 0.000008, drift -0.000000 172: jitter 0.000010, drift 0.000002 173: jitter -0.000001, drift -0.000011 174: jitter 0.000128, drift 0.000129 175: jitter -0.000005, drift -0.000133 176: jitter -0.000003, drift 0.000002 177: jitter -0.000000, drift 0.000003 178: jitter 0.000004, drift 0.000004 179: jitter 0.000005, drift 0.000001 180: jitter -0.000001, drift -0.000006 181: jitter 0.000005, drift 0.000006 182: jitter -0.000013, drift -0.000018 183: jitter -0.000007, drift 0.000006 184: jitter -0.000001, drift 0.000006 185: jitter -0.000005, drift -0.000004 186: jitter -0.000007, drift -0.000002 187: jitter -0.000003, drift 0.000004 188: jitter 0.000005, drift 0.000008 189: jitter 0.000003, drift -0.000002 190: jitter 0.000001, drift -0.000002 191: jitter 0.000007, drift 0.000006 192: jitter 0.000009, drift 0.000002 193: jitter 0.000009, drift 0.000000 194: jitter 0.000009, drift -0.000000 195: jitter 0.000007, drift -0.000002 196: jitter 0.000008, drift 0.000001 197: jitter 0.000006, drift -0.000002 198: jitter 0.000008, drift 0.000002 199: jitter 0.000009, drift 0.000001 200: jitter 0.000005, drift -0.000004 201: jitter 0.000009, drift 0.000004 202: jitter 0.000010, drift 0.000001 203: jitter 0.000011, drift 0.000001 204: jitter -0.000010, drift -0.000021 205: jitter -0.000012, drift -0.000002 206: jitter -0.000024, drift -0.000012 207: jitter -0.000006, drift 0.000018 208: jitter -0.000004, drift 0.000002 209: jitter 0.000003, drift 0.000007 210: jitter 0.000139, drift 0.000136 211: jitter 0.000006, drift -0.000133 212: jitter 0.000006, drift -0.000000 213: jitter 0.000003, drift -0.000003 214: jitter 0.000006, drift 0.000003 215: jitter 0.000202, drift 0.000196 216: jitter 0.000002, drift -0.000200 217: jitter 0.000001, drift -0.000001 218: jitter 0.000001, drift 0.000000 219: jitter -0.000010, drift -0.000011 220: jitter -0.000010, drift 0.000000 221: jitter 0.000003, drift 0.000013 222: jitter 0.000010, drift 0.000007 223: jitter 0.000009, drift -0.000001 224: jitter 0.000007, drift -0.000002 225: jitter 0.000006, drift -0.000001 226: jitter 0.000007, drift 0.000001 227: jitter 0.000006, drift -0.000001 228: jitter 0.000008, drift 0.000002 229: jitter 0.000009, drift 0.000001 230: jitter 0.000007, drift -0.000002 231: jitter 0.000008, drift 0.000001 232: jitter 0.000010, drift 0.000002 233: jitter 0.000010, drift 0.000000 234: jitter 0.000009, drift -0.000001 235: jitter 0.000007, drift -0.000002 236: jitter 0.000008, drift 0.000001 237: jitter -0.000001, drift -0.000009 238: jitter -0.000009, drift -0.000008 239: jitter -0.000008, drift 0.000001 240: jitter -0.000009, drift -0.000001 241: jitter 0.000002, drift 0.000011 242: jitter -0.000007, drift -0.000009 243: jitter 0.000006, drift 0.000013 244: jitter 0.000003, drift -0.000003 245: jitter -0.000003, drift -0.000006 246: jitter 0.000000, drift 0.000003 247: jitter 0.000203, drift 0.000203 248: jitter -0.000004, drift -0.000207 249: jitter 0.000005, drift 0.000009 250: jitter -0.000013, drift -0.000018 Actual: 0.000016 Expected: <0.000100 [PASS] average jitter Actual: 0.000000 Expected: <0.000100 [PASS] average drift PASS: dispatch_drift ================================================== [TEST] Dispatch Group [PID] 16805 ================================================== Actual: 4169e0 Expected: 4169e0 [PASS] dispatch_group_async Actual: 4169e0 Expected: 4169e0 [PASS] dispatch_group_async sleeping... sleeping... sleeping... Actual: 0 Expected: 0 [PASS] dispatch_group_wait done. done. done. Actual: 0 Expected: 0 [PASS] dispatch_group_wait Actual: 4169e0 Expected: 4169e0 [PASS] dispatch_group_async Actual: 413510 Expected: 413510 [PASS] Notification Received PASS: dispatch_group ================================================== [TEST] Dispatch Ping Pong [PID] 16822 ================================================== Actual: 415690 Expected: 415690 [PASS] dispatch_queue_create(ping) Actual: 415740 Expected: 415740 [PASS] dispatch_queue_create(pong) Actual: 4157f0 Expected: 4157f0 [PASS] dispatch_group_create Actual: 1000000 Expected: 1000000 [PASS] count PASS: dispatch_pingpong ================================================== [TEST] Dispatch Source Read [PID] 16838 ================================================== Actual: 490310 Expected: 490310 [PASS] dispatch_get_main_queue Actual: 492d10 Expected: 492d10 [PASS] DISPATCH_SOURCE_TYPE_READ bytes available: 2486813 bytes read: 512000 bytes available: 1974813 bytes read: 512000 bytes available: 1462813 bytes read: 512000 bytes available: 950813 bytes read: 512000 bytes available: 438813 bytes read: 438813 Actual: 0 Expected: 0 [PASS] EOF Actual: 2486813 Expected: 2486813 [PASS] Bytes read Actual: 0 Expected: 0 [PASS] close PASS: dispatch_read ================================================== [TEST] Dispatch Reader/Writer Queues [PID] 16854 ================================================== PASS: dispatch_readsync ================================================== [TEST] Dispatch Semaphore [PID] 16870 ================================================== Actual: 10000 Expected: 10000 [PASS] count PASS: dispatch_sema ================================================== [TEST] Dispatch Source Timer, bit 31 [PID] 16886 ================================================== Actual: 413170 Expected: 413170 [PASS] dispatch_get_main_queue Actual: 415b60 Expected: 415b60 [PASS] DISPATCH_SOURCE_TYPE_TIMER Actual: 2 Expected: <4 [PASS] elapsed time < 4s Actual: 1 Expected: <2 [PASS] elapsed time > 2s PASS: dispatch_timer_bit31 ================================================== [TEST] Dispatch Source Timer, bit 63 [PID] 16902 ================================================== 0 PASS: dispatch_timer_bit63 ================================================== [TEST] Dispatch C++ [PID] 16918 ================================================== Actual: 4128f0 Expected: 4128f0 [PASS] dispatch_get_main_queue PASS: dispatch_plusplus =================== All 19 tests passed =================== gmake[2]: Leaving directory `/home/jocke/gcd/cb/2011-04-11_11-22-57/libdispatch/trunk/testing' gmake[1]: Leaving directory `/home/jocke/gcd/cb/2011-04-11_11-22-57/libdispatch/trunk/testing' gmake[1]: Entering directory `/home/jocke/gcd/cb/2011-04-11_11-22-57/libdispatch/trunk' gmake[1]: Nothing to be done for `check-am'. gmake[1]: Leaving directory `/home/jocke/gcd/cb/2011-04-11_11-22-57/libdispatch/trunk' -bash-3.00$
On Apr 11, 2011, at 2:32 AM, Joakim Johansson wrote:
Thanks Mark, working quite nicely now!
For completeness, below are the latest results from Solaris 10/x86_64 also using clang (libkqueue r469, libpthread_workqueue r113, libdispatch r197 - current ’trunk’) - all tests succeeded.
Hi guys, Just out of curiosity, is this going to essentially be the "preferred interface" (libpthread_workqueue + libkqueue) going forward for non-MacOSX platforms? Don't get me wrong: Anything which requires the fewest contortions in libdispatch to work is great for us since it won't "cruft up" the code with lots of #ifdefs, but at the same time if there are better ways to plumb at least the pthread_workqueue stuff such that we can be more agile on other platforms, it would be interesting to at least *have* that architectural discussion. Such discussion may or may not lead anywhere, but it seems like we're starting to gain traction on other platforms and it makes me curious as to how well we're "impedance matched" to them. Any comments on that? Thanks, - Jordan
Hi Jordan, Some thoughts: I think that is a good question - although it has been very convenient during the bring-up phase to have it in an external repository, it seems to me that it would be a better solution to integrate at least libpthread_workqueue, as you suggest. Libkqueue seems usable on its own merits, which suggests that it should remain stand-alone. libpthread_workqueue is a fairly limited codebase and even though some refactoring/packaging may be required, it shouldn’t be too much work to integrate it nicely. Even though I do think it should be considered if it would be beneficial to use some other abstraction instead of the pthread_workqueue interface for the non-Mac OS X parts, it is not obviously required at present - the current approach seems to work quite well so far. If there would be a clear benefit, at least it is only in ~10 places that libdispatch references the pthread_workqueue API:s, so any such hypothetical #ifdefs would at least be limited in scope. Another aspect of this though, would be if one wants to bring libpthread_workqueue further in terms of ‘cooperation’ between multiple clients of the library (as discussed between you and Mark a long time ago). Personally I think that would be desired an beneficial, even taking the DOS problems brought up then into consideration, at least as an optional input to the thread scale rampup/down logic. For reference: currently libphtread_workqueue takes into account several inputs for deciding when to gracefully ramp up/down the number of threads used (e.g. number of available cores, current system load average, the number of currently runnable threads/LWP:s in the process, how long (and how many) threads that are idle, ...) - but it is only working really well within the scope of a single process, since the system load average is trailing reality quite significantly (and that is the only cross-process mechanism currently used). Personally, I think it would make sense to: 1. Consider a (possibly optional) mechanism for better cooperation between multiple clients of libpthread_workqueue (cross-processes) to ‘finish’ the desired functionality 2. Review if there would be any benefit in using a different interface for the thread management for better ‘impedance’ with other platforms 3. Integrate libpthread_workqueue (or similar codebase depending on the outcome of 2. above) with libdispatch Cheers, Joakim ps We (at Tbricks) are currently doing some validation of latency / scalability / performance aspects of libdispatch on non-Mac OS X platforms and hope to be able to verify ‘soon’ that the behavior is good for libdispatch/libpthread_workqueue/libkqueue in concert... On 11 apr 2011, at 20.12, Jordan K. Hubbard wrote:
Hi guys,
Just out of curiosity, is this going to essentially be the "preferred interface" (libpthread_workqueue + libkqueue) going forward for non-MacOSX platforms? Don't get me wrong: Anything which requires the fewest contortions in libdispatch to work is great for us since it won't "cruft up" the code with lots of #ifdefs, but at the same time if there are better ways to plumb at least the pthread_workqueue stuff such that we can be more agile on other platforms, it would be interesting to at least *have* that architectural discussion. Such discussion may or may not lead anywhere, but it seems like we're starting to gain traction on other platforms and it makes me curious as to how well we're "impedance matched" to them. Any comments on that?
Thanks,
- Jordan
On 04/11/2011 02:12 PM, Jordan K. Hubbard wrote:
Hi guys,
Just out of curiosity, is this going to essentially be the "preferred interface" (libpthread_workqueue + libkqueue) going forward for non-MacOSX platforms? Don't get me wrong: Anything which requires the fewest contortions in libdispatch to work is great for us since it won't "cruft up" the code with lots of #ifdefs, but at the same time if there are better ways to plumb at least the pthread_workqueue stuff such that we can be more agile on other platforms, it would be interesting to at least *have* that architectural discussion. Such discussion may or may not lead anywhere, but it seems like we're starting to gain traction on other platforms and it makes me curious as to how well we're "impedance matched" to them. Any comments on that?
Hi Jordan, It would be nice to simplify the process of building and distributing libdispatch. I would like to see libdispatch import a private copy of the stable releases of libkqueue and libpthread_workqueue. They could be placed in a contrib/ subdirectory, for example. This would allow the libdispatch autoconf script to "solve" any missing dependencies by building the additional libraries inside of the contrib/ subdirectory. The extra libraries could be combined with libdispatch to produce a single libdispatch.so file. Since libkqueue/libpthread_workqueue are under active development, the autoconf script should also allow you to specify the path to an external library by passing --with-libkqueue and --with-libpthread-workqueue options. Regards, - Mark
That would be very nice of course, allowing for a one-stop-shop to get libdispatch up and running - should help lower the barrier of entry to using it quite a bit. Joakim On 13 apr 2011, at 06.03, Mark Heily wrote:
I would like to see libdispatch import a private copy of the stable releases of libkqueue and libpthread_workqueue. They could be placed in a contrib/ subdirectory, for example.
+1 Sent from my iPhone On Apr 12, 2011, at 10:36 PM, Joakim Johansson <jocke@tbricks.com> wrote:
That would be very nice of course, allowing for a one-stop-shop to get libdispatch up and running - should help lower the barrier of entry to using it quite a bit.
Joakim
On 13 apr 2011, at 06.03, Mark Heily wrote:
I would like to see libdispatch import a private copy of the stable releases of libkqueue and libpthread_workqueue. They could be placed in a contrib/ subdirectory, for example.
_______________________________________________ libdispatch-dev mailing list libdispatch-dev@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/libdispatch-dev
participants (4)
-
David Leimbach
-
Joakim Johansson
-
Jordan K. Hubbard
-
Mark Heily