Example #1
0
/*
 * 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;
}