static int blast_client_congest_control(blast_client_t* client, tick_t current) { static float64_t mbps = 20.0; static tick_t last_ts = 0; static float64_t dt = 0.1; if (last_ts) dt = time_ticks_to_seconds(time_diff(last_ts, current)); float64_t kbytes = (mbps * 1024.0) * dt; FOUNDATION_UNUSED(client); return (int)(1024.0 * (kbytes / (float64_t)PACKET_CHUNK_SIZE)); }
DECLARE_TEST(time, builtin) { tick_t tick, newtick, tps; deltatime_t dt; tps = time_ticks_per_second(); EXPECT_GT(tps, 0); tick = time_current(); thread_sleep(30); newtick = time_current(); EXPECT_TICKNE(tick, 0); EXPECT_TICKGT(newtick, tick); EXPECT_TICKGT(time_diff(tick, newtick), 0); EXPECT_GT_MSGFORMAT(time_diff(tick, newtick), (tps / 100LL), "time elapsed not more than 10ms: %" PRId64 " (%" PRId64 ")", time_diff(tick, newtick), (tps / 100)); //more than 10 ms EXPECT_LT_MSGFORMAT(time_diff(tick, newtick), (tps / 20LL), "time elapsed not less than 50ms: %" PRId64 " (%" PRId64 ")", time_diff(tick, newtick), (tps / 33)); //less than 30 ms EXPECT_REALGT(time_elapsed(tick), 0); EXPECT_REALGT(time_elapsed(tick), 0.01f); //more than 10 ms EXPECT_TICKGT(time_elapsed_ticks(tick), 0); EXPECT_TICKGT(time_elapsed_ticks(tick), (tps / 100)); //more than 10 ms EXPECT_TICKLT(time_elapsed_ticks(tick), (tps / 20)); //less than 50 ms dt = time_ticks_to_seconds(newtick - tick); EXPECT_REALGT(dt, 0); EXPECT_GT_MSGFORMAT(dt, 0.01f, "time elapsed in seconds not more than 10ms: %.5f", dt); //more than 10 ms EXPECT_LT_MSGFORMAT(dt, 0.05f, "time elapsed in seconds not less than 30ms: %.5f", dt); //less than 30 ms tick = time_startup(); EXPECT_TICKGT(tick, 0); EXPECT_TICKLT(tick, newtick); EXPECT_TICKEQ(tick, time_startup()); tick = time_system(); thread_sleep(100); newtick = time_system(); EXPECT_TICKGT(tick, 0); EXPECT_TICKGT(newtick, 0); EXPECT_TICKGT(newtick, tick); EXPECT_GT_MSGFORMAT(newtick - tick, 50, "Elapsed system time less than 50ms, expected 100ms, got %" PRId64 "ms", newtick - tick); EXPECT_LT_MSGFORMAT(newtick - tick, 200, "Elapsed system time more than 200ms, expected 100ms, got %" PRId64 "ms", newtick - tick); return 0; }
DECLARE_TEST( time, builtin ) { tick_t tick, newtick, tps; deltatime_t dt; tps = time_ticks_per_second(); EXPECT_GT( tps, 0 ); tick = time_current(); thread_sleep( 20 ); newtick = time_current(); EXPECT_NE( tick, 0 ); EXPECT_GT( newtick, tick ); EXPECT_GT( time_diff( tick, newtick ), 0 ); EXPECT_GT_MSGFORMAT( time_diff( tick, newtick ), ( tps / 100LL ), "time elapsed not more than 10ms: %lld (%lld)", time_diff( tick, newtick ), ( tps / 100LL ) ); //more than 10 ms EXPECT_LT_MSGFORMAT( time_diff( tick, newtick ), ( tps / 30LL ), "time elapsed not less than 30ms: %lld (%lld)", time_diff( tick, newtick ), ( tps / 33LL ) ); //less than 30 ms EXPECT_GT( time_elapsed( tick ), 0 ); EXPECT_GT( time_elapsed( tick ), 0.01f ); //more than 10 ms EXPECT_GT( time_elapsed_ticks( tick ), 0 ); EXPECT_GT( time_elapsed_ticks( tick ), ( tps / 100 ) ); //more than 10 ms dt = time_ticks_to_seconds( newtick - tick ); EXPECT_GT( dt, 0 ); EXPECT_GT_MSGFORMAT( dt, 0.01f, "time elapsed in seconds not more than 10ms: %.5f", dt ); //more than 10 ms EXPECT_LT_MSGFORMAT( dt, 0.03f, "time elapsed in seconds not less than 30ms: %.5f", dt ); //less than 30 ms tick = time_startup(); EXPECT_GT( tick, 0 ); EXPECT_LT( tick, newtick ); EXPECT_EQ( tick, time_startup() ); tick = time_system(); EXPECT_GT( tick, 0 ); thread_sleep( 100 ); newtick = time_system(); EXPECT_GT( newtick, 0 ); EXPECT_GT( newtick, tick ); EXPECT_GT( newtick - tick, 50 ); //more than 50 ms EXPECT_LT( newtick - tick, 200 ); //less than 200 ms return 0; }
DECLARE_TEST( ringbufferstream, threadedio ) { ringbufferstream_test_t test = {0}; uint32_t* srcbuffer; unsigned int si; unsigned int loop, loops; real elapsed, throughput; unsigned int mbytes; #if FOUNDATION_PLATFORM_ANDROID || FOUNDATION_PLATFORM_IOS mbytes = 16; loops = 32; #else mbytes = 256; loops = 16; #endif test.buffer_size = mbytes * 1024 * 1024; srcbuffer = memory_allocate( test.buffer_size, 0, MEMORY_PERSISTENT ); test.source_buffer = (void*)srcbuffer; test.dest_buffer = memory_allocate_zero( test.buffer_size, 0, MEMORY_PERSISTENT ); for( si = 0; si < ( test.buffer_size / 4 ); ++si ) srcbuffer[si] = random32(); elapsed = 0; for( loop = 0; loop < loops; ++loop ) { test.stream = ringbuffer_stream_allocate( 23477, test.buffer_size ); test.read_thread = thread_create( read_thread, "reader", THREAD_PRIORITY_NORMAL, 0 ); test.write_thread = thread_create( write_thread, "writer", THREAD_PRIORITY_NORMAL, 0 ); thread_start( test.read_thread, &test ); thread_start( test.write_thread, &test ); thread_sleep( 100 ); while( thread_is_running( test.read_thread ) || thread_is_running( test.write_thread ) ) thread_sleep( 10 ); thread_destroy( test.read_thread ); thread_destroy( test.write_thread ); for( si = 0; si < test.buffer_size; ++si ) EXPECT_EQ( test.source_buffer[si], test.dest_buffer[si] ); stream_deallocate( test.stream ); elapsed += time_ticks_to_seconds( time_diff( test.start_time, test.end_time ) ); } throughput = (real)( (float64_t)( mbytes * loops ) / (float64_t)elapsed ); log_infof( HASH_TEST, "Ringbuffer throughput: %d MiB in %.2f sec -> %.2f MiB/sec", ( loops * mbytes ), (float32_t)elapsed, (float32_t)throughput ); elapsed = 0; for( loop = 0; loop < loops; ++loop ) { test.start_time = time_current(); memcpy( test.dest_buffer, test.source_buffer, test.buffer_size ); test.end_time = time_current(); for( si = 0; si < test.buffer_size; ++si ) EXPECT_EQ( test.source_buffer[si], test.dest_buffer[si] ); elapsed += time_ticks_to_seconds( time_diff( test.start_time, test.end_time ) ); } throughput = (real)( (float64_t)( mbytes * loops ) / (float64_t)elapsed ); log_infof( HASH_TEST, "Memcpy throughput: %d MiB in %.2f sec -> %.2f MiB/sec", ( loops * mbytes ), (float32_t)elapsed, (float32_t)throughput ); memory_deallocate( test.source_buffer ); memory_deallocate( test.dest_buffer ); return 0; }