/*
**	:ts=8
**
**	low-mem.h
**
**	Copyright 1987 By ASDG Incorporated - All Rights Reserved
**	May  be  freely redistributed for non-commercial purposes
**	provided this  message	retains intact. Available for use
**	in commercial  products for VERY minimal concession. Con-
**	tact ASDG Incorporated at  (201) 563-0529. Use in commer-
**	cial products without  authorization of ASDG Incorporated
**	shall be viewed as copyright infringement and piracy.
**
**	For commercial applications of the low-memory server ASDG
**	will grant perpetual use licenses provided that:
**		a) We are credited  somewhere  in your documenta-
**		   tion.
**		b) You send us a copy of the application.
**		c) You pay a  very small  administrative fee  not
**		   exceeding $50.
**
**	Author: Perry S. Kivolowitz
*/

/*
**	To use the low-memory server you must allocate one of these
**	structures.  When a  low memory  condition exists, the low-
**	memory server will look for  the message port you specified
**	in the call to RegLowMemReq.  If the message port is found,
**	the low-memory	server will  examine the LoeMemMsg you sup-
**	plied a pointer to in the call to RegLowMemReq.
**
**	If the low-memory server finds something other than LM_CON-
**	DITION_ACKNOWLEDGED, it will not send you a message. There-
**	fore you should initialize this field with that value.
**
**	This scheme  is  used to  ensure that the low-memory server
**	does not reuse the same LowMemMsg (which you supply).  This
**	scheme allows the low-memory server to not wait for a Reply
**	which could be deadly if none was forthcoming from your ap-
**	plication.
*/

struct LowMemMsg {
	struct Message lm_msg;
	long lm_flag;
};


/*
**	values for lm_flag
*/

#define LM_LOW_MEMORY_CONDITION 	0x00000000
#define LM_CONDITION_ACKNOWLEDGED	(('A'<<24)|('S'<<16)|('D'<<8)|'G')

/*
**	useful defines as in:
**
**	lmptr = (LMMPtr) AllocMem(SizeOfLMMsg , 0L);
*/

#define SizeOfLMMsg	sizeof(struct LowMemMsg)
#define LMMPtr		struct LowMemMsg *
#define LMSName 	"asdg-low-mem.library"

/*
**	Meaning of Error Returns coming back from RegLowMemReq
*/

#define LM_BADNAME	-1	/* duplication of port name */
#define LM_NOMEM	-2	/* memory allocation failed */


/******* Following lines added 01-Feb-90 by Darren New to support
	 Lattice 5.x, ANSI, etc.    **********************************/


extern struct Library *LowMemBase;


extern long RegLowMemReq(char * PortName , LMMPtr Space);
/*
;	PortName is  a pointer	to a null terminated string representing
;		 the name  of  your port to which the low-memory service
;		 will attempt to send a message.
;	Space	 is a pointer to an initialized LowMemMessage.
;
;	res	 if false means  your  registration has  been  accepted.
;		 Currently, the only  reason  your  request would be re-
;		 jected is  if	the  low-memory server itself ran out of
;		 memory (oh my!) or the port name  you requested has al-
;		 ready been registered. The value of the returned  error
;		 code can be used to determine why the call failed.
;
*/

void DeRegLowMemReq(char * PortName);
/*
;
; DeRegLowMemReq
;
; Undo the effect of a previous RegLowMemReq. You absolutely positively
; must call this routine before  exiting  your program (or  closing the
; library)
;
;
*/

#ifndef  NO_PRAGMAS
/*------ normal functions ---------------------------------------------*/
#pragma libcall LowMemBase RegLowMemReq 1e 9802
#pragma libcall LowMemBase DeRegLowMemReq 24 801
#endif


