1 / 18

QNX

QNX . Администратор ресурса Resource manager. 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> . Variables.

aira
Télécharger la présentation

QNX

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

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); • }

More Related