Download
slide1 n.
Skip this Video
Loading SlideShow in 5 Seconds..
QNX PowerPoint Presentation

QNX

271 Views Download Presentation
Download Presentation

QNX

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. QNX Администратор ресурса Resource manager

  2. Required includes • #include <errno.h> • #include <stdio.h> • #include <stddef.h> • #include <stdlib.h> • #include <unistd.h> • #define THREAD_POOL_PARAM_T dispatch_context_t • #include <sys/iofunc.h> • #include <sys/dispatch.h>

  3. Variables • static resmgr_connect_funcs_t connect_funcs; • static resmgr_io_funcs_t io_funcs; • static iofunc_attr_t attr; • int main(int argc, char **argv) { • thread_pool_attr_t pool_attr; • resmgr_attr_t resmgr_attr; • dispatch_t *dpp; • thread_pool_t *tpp; • dispatch_context_t *ctp; • int id;

  4. initialize dispatch interface • if((dpp = dispatch_create()) == NULL) { • fprintf(stderr, "%s: Unable initialize dispatch interface\n", argv[0]); • return EXIT_FAILURE; }

  5. initialize resource manager attributes • memset(&resmgr_attr, 0, sizeof resmgr_attr); • resmgr_attr.nparts_max = 1; • resmgr_attr.msg_max_size = 2048;

  6. initialize functions for handling messages • iofunc_func_init( _RESMGR_CONNECT_NFUNCS, &connect_funcs, _RESMGR_IO_NFUNCS, &io_funcs);

  7. initialize attribute structure used by the device • iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

  8. attach our device name • id = resmgr_attach( dpp, /* dispatch handle */ &resmgr_attr, /* resource manager attrs */ "/dev/sample", /* device name */ _FTYPE_ANY, /* open type */ 0, /* flags */ &connect_funcs, /* connect routines */ &io_funcs, /* I/O routines */ &attr); /* handle */ • if(id == -1) { return EXIT_FAILURE; }

  9. initialize thread pool attributes • memset(&pool_attr, 0, sizeofpool_attr); • pool_attr.handle = dpp; • pool_attr.context_alloc = dispatch_context_alloc; • pool_attr.block_func = dispatch_block; • pool_attr.unblock_func = dispatch_unblock; • pool_attr.handler_func = dispatch_handler; • pool_attr.context_free = dispatch_context_free; • pool_attr.lo_water = 2; • pool_attr.hi_water = 4; • pool_attr.increment = 1; • pool_attr.maximum = 50;

  10. allocate a thread pool handle • if((tpp = thread_pool_create( • &pool_attr, • POOL_FLAG_EXIT_SELF)) == NULL) { • fprintf(stderr, "%s: Unable to initialize thread pool.\n", argv[0]); • return EXIT_FAILURE; • }

  11. start the threads • thread_pool_start(tpp); • } // End of Main

  12. io_funcs Substitution • iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs, _RESMGR_IO_NFUNCS, &io_funcs); • io_funcs.read = My_read; • io_funcs.write = My_write; • io_funcs.open = My_open;

  13. My_read • intMy_read( resmgr_context_t* ctp, io_read_t* msg, RESMGR_OCB_T* ocb ) • { • int status; intxtype; • if ( ( status = iofunc_read_verify( ctp, msg, ocb, NULL ) ) != EOK ) { • return( status ); • } • xtype = msg -> i.xtype & _IO_XTYPE_MASK ; • if (xtype == _IO_XTYPE_OFFSET) { off = ((struct _xtype_offset *) (&msg->i+1))->offset; } else if (xtype == _IO_XTYPE_NONE ) { off = ocb->offset; } else { return( ENOSYS ); • }

  14. Return data • nparts = 2; • SETIOV( &ctp -> iov[ 0 ], datap1, length1 ); • SETIOV( &ctp -> iov[ 1 ], datap2, length2 ); • _IO_SET_READ_NBYTES( ctp, length1+length2); • if (xtype == _IO_XTYPE_NONE ) { ocb->offset += length1+length2 ; • } • return( _RESMGR_NPARTS( nparts ) ); • } // My_read

  15. My_write • intbuffer_write( resmgr_context_t* ctp, io_write_t* msg, RESMGR_OCB_T* ocb ) { • int status; intnbytes; • if ( ( status = iofunc_write_verify( ctp, msg, ocb, NULL ) ) != EOK ) { • return( status ); • } • if ( ( msg -> i.xtype & _IO_XTYPE_MASK ) != _IO_XTYPE_NONE ) { • return( ENOSYS ); • }

  16. Getting data • resmgr_msgread( ctp, buffer, nbytes, sizeof( msg -> i) ); • _IO_SET_WRITE_NBYTES( ctp, nbytes ); • ocb -> attr -> flags |= IOFUNC_ATTR_MTIME | IOFUNC_ATTR_CTIME; • return( _RESMGR_NPARTS( 0 ) ); • } // End of My_write

  17. Waiting • iofunc_attr_unlock( ocb -> attr ); • < wait for something> • iofunc_attr_lock( ocb -> attr );

  18. My_open • typedefstruct{ • iofunc_ocb_tocb; • unsigned key; • } My_ocb_t; • intMy_open(resmgr_context_t *ctp, io_open_t *msg, void *extra, void *reserved) • { • My_ocb_t * ocb = calloc(1, sizeof(*ocb)); • iofunc_open(ctp, msg, attr, NULL, &ci); • return iofunc_ocb_attach(ctp, msg, &ocb->ocb, attr, &io_funcs); • }