Provided by: libgensio-dev_2.3.5-1build2_amd64 bug

NAME

       gensio_os_funcs - Abstraction for some operating system functions used by the gensio library

SYNOPSIS

       #include <gensio/gensio_os_funcs.h>

       struct gensio_os_funcs {}

       int gensio_default_os_hnd(int wake_sig, struct gensio_os_funcs **o)

       int gensio_unix_funcs_alloc(struct selector_s *sel, int wake_sig,
                 struct gensio_os_funcs **o)

       int gensio_win_funcs_alloc(struct gensio_os_funcs **o)

       int gensio_os_proc_setup(struct gensio_os_funcs *o,
                       struct gensio_os_proc_data **data)

       void gensio_os_proc_cleanup(struct gensio_os_proc_data *data);

       sigset_t *gensio_os_proc_unix_get_wait_sigset(
                                struct gensio_os_proc_data *data);

       int gensio_os_new_thread(struct gensio_os_funcs *o,
                       void (*start_func)(void *data), void *data,
                       struct gensio_thread **thread_id);

       int gensio_os_wait_thread(struct gensio_thread *thread_id);

DESCRIPTION

       This  structure  provides  an  abstraction  for  the  gensio library that lets it work with various event
       libraries.  It provides the following basic functions:

       memory allocation - Allocate and free memory.

       mutexes - Provide mutual exclusion.

       file handler callbacks - Allows file descriptors to be monitored
              and report when I/O is ready on them.

       timers - Call callbacks after a certain amount of time has elapsed.

       runners - Run a function in a new execution context.  Calling callbacks
              straight from user functions can result in deadlocks, this provides a way to call callbacks from a
              separate context.

       waiters - Wait for operations to occur while running timers, runners
              and watching for file descriptors.

       logging - Allow the gensio library to generate logs to report issues.

       These are documented in the include file.

       The basic issue is that there are various event handling libraries  (Tcl/Tk,  glib,  Xlib,  custom  ones,
       etc.)  and  you  may want to integrate the gensio library with one of these.  Even though it's a bit of a
       pain to have to pass one of these around, it adds needed flexibility.

       gensio_default_os_hnd provides a way to allocate a default OS function handler  for  the  platform.   The
       same value will be returned each time, only one is created.  You should generally use this one unless you
       have a special need as documented above.

       The wait_sig parameter usage on Windows is unused.  For Unix systems, this signal is used to signal other
       processes  that may be waiting that they need to wake up.  This is used to wake up a process waiting on a
       waiter, and it's used to signal all waiting processes if a timer is added that is sooner than  any  other
       timer so they can adjust their waits.

       If you are running your program in a single thread, you can safely pass zero into this parameter.

       If  your  app  is  multi-threaded  (or, more accurately, if your app has multiple threads that are making
       gensio calls) you must pass a valid signal into this, and you must set  up  an  empty  handler  for  this
       signal, and the signal must be blocked in all threads that call a wait function.  You should not use this
       signal  for  anything  else.   The  function that allocates a signal handler will block the signal in the
       calling thread, and that sigmask is passed on to other threads it creates.  But  if  you  have  allocated
       threads before allocating the os funcs, you must make sure those other threads have this signal blocked.

       Also, if you pass in a different value to gensio_default_os_hnd than the first one you passed in, it will
       return  GE_INVAL.   You  can  pass  in different values to gensio_unix_funcs_alloc calls, and it will use
       them, but there's not much value in this.  The os funcs for Unix can share a signal handler.  And there's
       not much value is multiple OS funcs, anyway.

       gensio_unix_funcs_alloc and gensio_win_funcs_alloc Allocate the normal os  funcs  for  Unix  and  Windows
       based systems, respectively.

       The  sel  parameter for Unix allows you to create your own selector object and pass it to the OS handler.
       Passing in NULL will cause it to allocate it's own selector object.  See the selector.h include file  for
       details.

       The  wake_sig  value  is a signal for use by the OS functions for internal communication between threads.
       If you are running a multi-threaded application, you must provide a valid signal that you don't  use  for
       any other purpose, generally SIGUSR1 or SIGUSR2.

       The gensio_os_proc_setup function does all the standard setup for a process.  You should almost certainly
       use  this  function.  On Windows this isn't anything (though that may change in the future, so you should
       still do it), but on Unix it does all the signal handling setup, so you don't have to do all  the  things
       mentioned  above.   This  will  block  SIGPIPE  (because  those  come  in  when  connections die and most
       applications don't care), SIGCHLD (those come in for stdio and pty gensios), and the wake_sig if that  is
       set.  It also install signal handlers for SIGCHLD and the wake_sig (if set) and sets up a signal mask.

       If  you  use  the  wait_intr_sigmask  OS  function,  you  must  pass  the  proc_data  value  returned  by
       gensio_os_proc_setup  into  that.   If  you  want  to  modify  the  wait  signal  mask,   you   can   use
       gensio_os_proc_unix_get_wait_sigset to fetch it and modify it.

       The  gensio_os_proc_cleanup  function  undoes  all  the  changes  gensio_os_proc_setup  does.  On Unix it
       restores the signal mask and signal handlers it sets to their previous values.

       The gensio_os_new_thread function starts a new thread at start_func passing in the given data value.   It
       returns  a  thread_id that you must pass into the wait function.  This is just basic generic threads, you
       can use your OS functions if you need more control over the threads.  If you use threads,  make  sure  to
       see the notes above about setting up for them properly.

       The gensio_os_wait_thread waits for a thread to stop.  Note that it does not cause the thread to stop, it
       waits for it to stop.  You have to cause the thread to stop yourself.

RETURN VALUES

       gensio_default_os_hnd returns a standard gensio error.

SEE ALSO

       gensio_set_log_mask(3), gensio_get_log_mask(3), gensio_log_level_to_str(3), gensio(5), gensio_err(3)

                                                   23 Feb 2019                                gensio_os_funcs(3)