home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / aplusplus-1.01-src.lha / GNU / src / amiga / APlusPlus-1.01 / amiproc / READ.ME < prev    next >
Text File  |  1994-01-28  |  6KB  |  121 lines

  1. AMIPROC Copyright (c) 1989-1994 Steve Krueger and Doug Walker, 
  2. Raleigh, NC, USA.  All Rights Reserved.
  3.  
  4. Send any correspondance to:
  5.  
  6.     Doug Walker and Steve Krueger
  7.     4701 Oak Park Road
  8.     Raleigh, NC 27612
  9.     USA
  10.  
  11.     walker@unx.sas.com
  12.     sassek@unx.sas.com
  13.  
  14. This distribution is freely redistributable provided that you do not 
  15. modify the contents of the files, and that all files are kept together.
  16. You may use this code freely in your commercial and noncommercial
  17. projects.  
  18.  
  19. AMIPROC: Spawn a new process with its own near data section.
  20. Requires the SAS/C® Development System Version 6.50 or higher 
  21. (Some features might work with Version 6.0).
  22.  
  23. SAS/C is a registered trademark of SAS Institute, Inc, Cary, NC, USA.
  24.  
  25. AMIPROC consists of a couple of small functions that will start a new
  26. process, initialize a near data section for it, and run the SAS/C
  27. autoinit and autoterm functions.  The autoinit/autoterm functions
  28. give you the ability to use virtually the entire SAS/C link library
  29. in your new process, as well as running C++ constructors and 
  30. destructors and user-written autoinit/autoterm functions.
  31.  
  32. ***HOW TO USE AMIPROC
  33.  
  34.    1. Include the file "amiproc.h" in your C source file.
  35.  
  36.    2. When you want to start your new process, call the function
  37.       AmiProc_Start():
  38.       
  39.          res = AmiProc_Start(func, userdata);
  40.          
  41.             struct AmiProcMsg *res;
  42.                The return value is a pointer to a private data structure.
  43.                You need to keep track of it and pass it to AmiProc_Wait()
  44.                when you're ready to exit.  Do not attempt to read the
  45.                contents of this data structure.  If res is NULL, the
  46.                attempt to create a new process failed.
  47.  
  48.             int (*func)(void *userdata);
  49.                This parameter is a pointer to a function in your code.
  50.                The function should return "int" and take a "void *"
  51.                as its parameter.  The parameter will be the data pointer
  52.                passed as AmiProc_Start's second parameter.
  53.  
  54.             void *userdata;
  55.                This parameter is a pointer to data that you supply.  It
  56.                will be passed to your function as its argument when the 
  57.                subprocess has been created.  This data must not be
  58.                reused or freed until after the subprocess exits!
  59.  
  60.    3. Sometime before your program exits, call AmiProc_Wait(),
  61.       passing it the pointer returned by AmiProc_Start().  AmiProc_Wait()
  62.       will wait until the subprocess exits, free some resources, then
  63.       return the subprocess's return code to you.  Do not attempt to use
  64.       the AmiProcMsg pointer after this.
  65.  
  66.    4. Make sure your subprocess does not call exit(), __exit(), abort(),
  67.       _XCEXIT(), or any other function that would cause your program
  68.       to exit (EVEN INDIRECTLY!).  If it does, the program will attempt
  69.       to free some resources belonging to the parent, and will bypass 
  70.       your DS_FREE() call, which will cause other resources not to be
  71.       freed.  Always exit by a simple return() from your entry point
  72.       function.
  73.  
  74.    5. Make sure your program is linked with the SAS/C-supplied cres.o
  75.       startup, that it is compiled with the NOSTACKCHECK and NOSTACKEXT
  76.       options, and that CTRL-C checking has been disabled.  See below 
  77.       for more explanation.
  78.  
  79. ***WARNINGS/POSSIBLE PROBLEMS
  80.  
  81.    Remember that although you have your own NEAR data section in the
  82.    subprocess, FAR and CHIP data will still be shared with the parent
  83.    process.  Either reserve FAR and CHIP for read-only data or use 
  84.    semaphores to protect any read/write FAR or CHIP data.
  85.  
  86.    String literals ("the ones in double quotes") count as external data,
  87.    too.  If you do not specify the STRSECT or STRMERGE options, they
  88.    will go whereever your external data goes.  Since you probably don't
  89.    modify string literals, STRSECT=CODE or STRSECT=FAR will save your
  90.    program some space in the near section.  Use this if you have a lot
  91.    of near data and need to make room, or if you want to minimize the
  92.    amount of data that gets duplicated each time you create a new
  93.    subprocess
  94.  
  95.    Make sure your program is compiled with NOSTACKCHECK and NOSTACKEXT.
  96.    (NOSTACKEXT is the default).  These options rely on the values of
  97.    certain external variables, which are not set up for the new 
  98.    subprocess.  (This could probably be made to work, but we haven't 
  99.    done it.  If you want to try, you'd need to duplicate the code in 
  100.    c.a that deals with setting the stack up.)
  101.  
  102.    Make sure that CTRL-C checking is disabled in your subprocess.
  103.    The easiest way to do this is to disable the __chkabort function.
  104.    See your SAS/C V6.50 User's Guide, page 220, for a description
  105.    of how to disable CTRL-C checking.  If you link with the SC
  106.    command, you can also use the NOCHKABORT option described in the
  107.    User's Guide.
  108.  
  109.    Make sure your program is linked with the cres.o startup.  Programs
  110.    linked with cres.o have a read-only copy of their initialized near
  111.    data that these macros access.  Programs linked with c.o or cback.o
  112.    do not have this extra copy.  Even if these programs link correctly,
  113.    which may or may not be true, they won't work as expected since
  114.    external variables used by library functions will be initialized
  115.    incorrectly.  (For example, the malloc() memory pools in both 
  116.    processes will be pointing to the same memory blocks...)
  117.  
  118.    Remember that the __saveds keyword and the geta4() function do not 
  119.    work in code linked with cres.o.  This is described in your SAS/C
  120.    manual.
  121.