/* * Callback for creating a new instance on a connection */ static DirectResult VoodooTestConstruct( VoodooServer *_server, VoodooManager *manager, const char *name, void *ctx, /* context pointer */ VoodooInstanceID *ret_instance ) { VoodooTestServer *server = ctx; VoodooInstanceID instance_id; VoodooTestConnection *connection; connection = D_CALLOC( 1, sizeof(VoodooTestConnection) ); if (!connection) return D_OOM(); connection->manager = manager; connection->server = server; /* ignore */ connection->dummy.Release = DummyRelease; /* Create a new instance with our callback */ voodoo_manager_register_local( manager, true, connection /* context 1 */, connection /* context 2 */, VoodooTestDispatch, &instance_id ); D_INFO( "Voodoo/Test: Created instance %u for client with manager %p...\n", instance_id, manager ); *ret_instance = instance_id; return DR_OK; }
int main( int argc, char *argv[] ) { DirectClock clock; int counter = 0; int res; (void)res; /* Initialize libdirect. */ direct_initialize(); // direct_config->log_level = DIRECT_LOG_ALL; direct_log_domain_config_level( "Voodoo/Input", DIRECT_LOG_DEBUG_9 ); direct_log_domain_config_level( "Voodoo/Output", DIRECT_LOG_DEBUG_9 ); direct_log_domain_config_level( "Voodoo/Dispatch", DIRECT_LOG_DEBUG_9 ); direct_log_domain_config_level( "Voodoo/Manager", DIRECT_LOG_DEBUG_9 ); int pipe_1[2]; int pipe_2[2]; // int socket[2]; int fds_server[2]; int fds_client[2]; VoodooLink voodoo_link_server; VoodooLink voodoo_link_client; VoodooManager *manager_server; VoodooManager *manager_client; VoodooInstanceID instance; // socketpair( PF_LOCAL, SOCK_STREAM, 0, fd ); res = pipe( pipe_1 ); res = pipe( pipe_2 ); fds_server[0] = pipe_1[0]; fds_server[1] = pipe_2[1]; fds_client[0] = pipe_2[0]; fds_client[1] = pipe_1[1]; voodoo_link_init_fd( &voodoo_link_server, fds_server ); voodoo_manager_create( &voodoo_link_server, NULL, NULL, &manager_server ); voodoo_manager_register_local( manager_server, VOODOO_INSTANCE_NONE, NULL, NULL, Dispatch, &instance ); voodoo_link_init_fd( &voodoo_link_client, fds_client ); voodoo_manager_create( &voodoo_link_client, NULL, NULL, &manager_client ); direct_clock_start( &clock ); #if !BENCH_SYNC do { voodoo_manager_request( manager_client, instance, VOODOOTEST_METHOD_ID_Push, VREQ_NONE, NULL, VMBT_INT, counter++, VMBT_NONE ); } while (counter < NUM_ITEMS); #else do { VoodooResponseMessage *response; voodoo_manager_request( manager_client, instance, VOODOOTEST_METHOD_ID_Sync, VREQ_RESPOND, &response, VMBT_NONE ); voodoo_manager_finish_request( manager_client, response ); counter++; } while (counter < NUM_ITEMS); #endif { VoodooResponseMessage *response; voodoo_manager_request( manager_client, instance, VOODOOTEST_METHOD_ID_Sync, VREQ_RESPOND, &response, VMBT_NONE ); voodoo_manager_finish_request( manager_client, response ); } direct_clock_stop( &clock ); D_INFO( "Voodoo/Test: Stopped after %lld.%03lld seconds... (%lld items/sec)\n", DIRECT_CLOCK_DIFF_SEC_MS( &clock ), NUM_ITEMS * 1000000ULL / direct_clock_diff( &clock ) ); /* Shutdown libdirect. */ direct_shutdown(); return 0; }