Provided by: critcl_3.1.18.1+dfsg-3_amd64 bug

NAME

       critcl::callback - CriTcl C-level Callback Utilities

SYNOPSIS

       package require Tcl  8.4

       package require critcl  ?3.1?

       package require critcl::callback  ?0.1?

       critcl_callback_p critcl_callback_new interp objc objv nargs

       void critcl_callback_extend callback argument

       void critcl_callback_destroy callback

       int critcl_callback_invoke callback objc objv

________________________________________________________________________________________________________________

DESCRIPTION

       C  Runtime  In  Tcl,  or  CriTcl , is a system for compiling C code embedded in Tcl on the fly and either
       loading the resulting objects into Tcl for immediate use or packaging them for distribution.  Use  CriTcl
       to improve performance by rewriting in C those routines that are performance bottlenecks.

       This  document  is  the reference manpage for the critcl::callback package.  This package provides, via a
       stubs API table, data structures and functions to manage callbacks from C to Tcl. The package has no Tcl-
       level facilities.  Its intended audience are  mainly  developers  wishing  to  write  Tcl  packages  with
       embedded C code who have to invoke user-specified command (prefixes) in Tcl.

       This package resides in the Support Package Layer of CriTcl.

       +----------------+
       |Applications    |
       | critcl         |
       | critcl::app    |
       +----------------+

       +----------------+
       |Core Packages   |
       | critcl         |
       | critcl::util   |
       +----------------+

       *================*
       |Support Packages|
       | stubs::*       |
       | md5, platform  |
       |  ...           |
       *================*

API

       The  package API consist of one opaque data structure (critcl_callback_p) and four functions operating on
       the same.  These functions are

       critcl_callback_p critcl_callback_new interp objc objv nargs
              This function creates a new callback (manager) and returns it as its result.

              The callback is initialized with the Tcl_Interp* interp specifying where to run the callback,  the
              fixed part of the command to run in standard objc/objv notation, plus the number of free arguments
              to expect after the fixed part.

              The fixed part is the essentially the command prefix of the callback.

              All  Tcl_Obj* elements of objv are protected against early release by incrementing their reference
              counts. The callback effectively takes ownership of these objects.

       void critcl_callback_extend callback argument
              This function takes a callback of type critcl_callback_p and  extends  its  fixed  part  with  the
              argument,  taking  the  first  free  slot  for  arguments  to  do  so.   This means that after the
              application of this function the specified callback has one free argument less.

              With assertions active attempting to extend beyond the number  of  free  arguments  will  cause  a
              panic. Without assertions active expect a crash at some point.

              This  allows  the  user  to  extend  the fixed part of the callback with semi-fixed elements, like
              method names (See Multiple methods).

              The argument is protected against early release by incrementing its reference count. The  callback
              effectively takes ownership of this object.

       void critcl_callback_destroy callback
              This  function  takes a callback of type critcl_callback_p and releases all memory associated with
              it.  After application of this function the callback cannot be used anymore.

              All fixed elements of the callback (owned by it) are  released  by  decrementing  their  reference
              counts.

       int critcl_callback_invoke callback objc objv
              This  function  invokes the callback in the Tcl interpreter specified at the time of construction,
              in the global level and namespace,  with  the  free  arguments  filled  by  the  Tcl_Obj*  objects
              specified via objc/objv.

              It  returns  the  Tcl  status  of the invoked command as its result.  Any further results or error
              messages will be found in the result area of the Tcl interpreter in question. The exact nature  of
              such is dependent on the callback itself.

              With assertions active attempting to use more arguments than available will cause a panic. Without
              assertions active expect a crash at some point.

              While  the  callback  is  running  all  Tcl_Obj* elements of the command, fixed and arguments, are
              protected against early release by temporarily incrementing their reference counts.

EXAMPLES

   SIMPLE CALLBACK
       The example here shows the important parts of using the functions of this package for a  simple  callback
       which is invoked with a single argument, some kind of data to hand to the Tcl level.

                  // Create the callback with interpreter and command prefix in
                  // oc/ov, plus space for the argument
                  critcl_callback_p cb = critcl_callback_new (interp, oc, ov, 1);

                  // Invoke the callback somewhere in the C package using this one,
                  // with Tcl_Obj* data holding the information to pass up.
                  critcl_callback_invoke (cb, 1, &data);

                  // At the end of the lifetime, release the callback.
                  critcl_callback_destroy (cb);

       Note  that  the functions of this package are designed for the case where the created callback (cb above)
       is kept around for a long time, and many different invokations.

       Using the sequence above as is, creating and destroying the callback each time it is invoked  will  yield
       very poor performance and lots of undesirable memory churn.

   MULTIPLE METHODS
       While  we  can  use the methodology of the previous section when a single (Tcl-level) callback is invoked
       from different places in C, with different methods, simply having another argument slot and filling it an
       invokation time with the method object, a second methodology is open to us due to critcl_callback_extend.

                  // Create one callback manager per different method the callback
                  // will be used with. Fill the first of the two declared arguments
                  // with the different methods.
                  critcl_callback_p cb_a = critcl_callback_new (interp, oc, ov, 2);
                  critcl_callback_p cb_b = critcl_callback_new (interp, oc, ov, 2);

                  critcl_callback_extend (cb_a, Tcl_NewStringObj ("method1", -1));
                  critcl_callback_extend (cb_b, Tcl_NewStringObj ("method2", -1));

                  // After the extension we have one free argument left, for use in
                  // the invokations.

                  critcl_callback_invoke (cb_a, 1, &dataX);

                  critcl_callback_invoke (cb_b, 1, &dataY);

                  // At the end release both managers again
                  critcl_callback_destroy (cb_a);
                  critcl_callback_destroy (cb_b);

       The nice thing here is that the method objects are allocated only once and automatically  shared  by  all
       the calls. No memory churn to repeatedly allocate the same string objects over and over again.

AUTHORS

       Andreas Kupries

BUGS, IDEAS, FEEDBACK

       This  document,  and  the package it describes, will undoubtedly contain bugs and other problems.  Please
       report such at https://github.com/andreas-kupries/critcl.  Please also report any ideas for  enhancements
       you may have for either package and/or documentation.

KEYWORDS

       C  code,  Embedded  C  Code,  code  generator,  compile & run, compiler, dynamic code generation, dynamic
       compilation, generate package, linker, on demand compilation, on-the-fly compilation

CATEGORY

       Glueing/Embedded C code

COPYRIGHT

       Copyright (c) 2011-2018 Andreas Kupries

doc                                                    0.1                                 critcl::callback(3cl)