#include "memory.h"

PagerHandle_t *__saveds __asm AllocPagerHandle(register __a0 STRPTR LogProgram)
{
	PagerHandle_t *ph;

	if (!LogProgram)
		LogProgram = "-";

	if (ph = MyAllocVec(sizeof(PagerHandle_t) + strlen(LogProgram) + 1)) {
		InitSemaphore(&ph->ph_Sema);

		ph->ph_LogProgram = (STRPTR)&ph[1];
		ph->ph_LogService = "-";
		ph->ph_LogWho = "-";
		strcpy(ph->ph_LogProgram, LogProgram);
		ph->ph_LogLevel = -1;
		ph->ph_LogRetries = 0;

		NewList(&ph->ph_LockList);
		NewList(&ph->ph_ConfigList);
		NewList((struct List *)&ph->ph_ServiceList);
		NewList((struct List *)&ph->ph_AliasList);

		ObtainSemaphore(&HandleListSema);
		AddTail((struct List *)&HandleList, (struct Node *)&ph->ph_Node);
		ReleaseSemaphore(&HandleListSema);

		return ph;
	}

	return (PagerHandle_t *) NULL;
}

void __saveds __asm FreePagerHandle(register __a0 PagerHandle_t * ph)
{
	PrivatePagerAlias_t *pals;
	PrivatePagerService_t *psvc;
	ConfigEntry_t *ce;

	if (ph) {
		ObtainSemaphore(&ph->ph_Sema);

		while ((pals = (PrivatePagerAlias_t *) ph->ph_AliasList.mlh_Head) != (PrivatePagerAlias_t *) & ph->ph_AliasList.mlh_Tail) {
			pals->pals_UseCount = 1;	/* force the node to go
							 * away when we call
							 * FreePagerAlias() */
			FreePagerAlias(&pals->pals_Alias);
		}

		while ((psvc = (PrivatePagerService_t *) ph->ph_ServiceList.mlh_Head) != (PrivatePagerService_t *) & ph->ph_ServiceList.mlh_Tail) {
			psvc->psvc_UseCount = 1;	/* force the node to go
							 * away when we call
							 * FreePagerService() */
			FreePagerService(&psvc->psvc_Service);
		}

		while ((ce = (ConfigEntry_t *) ph->ph_ConfigList.lh_Head) != (ConfigEntry_t *) & ph->ph_ConfigList.lh_Tail) {
			ce->ce_UseCount = 1;	/* force the node to go away
						 * when we call
						 * FreePagerConfig() */
			FreePagerConfig(ce->ce_Data);
		}

		UnLockFiles(ph);

		ObtainSemaphore(&HandleListSema);
		Remove((struct Node *)&ph->ph_Node);
		ReleaseSemaphore(&HandleListSema);

		ReleaseSemaphore(&ph->ph_Sema);

		MyFreeVec(ph);
	}
}
