105 lines
2.8 KiB
C
105 lines
2.8 KiB
C
#ifndef lint
|
|
#ifdef sccs
|
|
static char sccsid[] = "@(#)ntfy_client.c 1.1 94/10/31 Copyr 1985 Sun Micro";
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1985 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
/*
|
|
* Ntfy_client.c - NTFY_CLIENT specific operations that both the detector
|
|
* and dispatcher share.
|
|
*/
|
|
|
|
#include <sunwindow/ntfy.h>
|
|
#include <sunwindow/ndis.h> /* For ndis_default_prioritizer */
|
|
|
|
/* Variables used in paranoid enumerator (see ntfy_condition) */
|
|
pkg_private_data NTFY_CLIENT *ntfy_enum_client = 0;
|
|
pkg_private_data NTFY_CLIENT *ntfy_enum_client_next = 0;
|
|
|
|
pkg_private NTFY_CLIENT *
|
|
ntfy_find_nclient(client_list, nclient, client_latest)
|
|
NTFY_CLIENT *client_list;
|
|
Notify_client nclient;
|
|
register NTFY_CLIENT **client_latest;
|
|
{
|
|
register NTFY_CLIENT *client;
|
|
NTFY_CLIENT *next;
|
|
|
|
ntfy_assert(NTFY_IN_CRITICAL, "Unprotected list search");
|
|
/* See if hint matches */
|
|
if (*client_latest && (*client_latest)->nclient == nclient)
|
|
return(*client_latest);
|
|
/* Search entire list */
|
|
for (client = client_list; client; client = next) {
|
|
next = client->next;
|
|
if (client->nclient == nclient) {
|
|
/* Set up hint for next time */
|
|
*client_latest = client;
|
|
return(client);
|
|
}
|
|
}
|
|
return(NTFY_CLIENT_NULL);
|
|
}
|
|
|
|
/*
|
|
* Find/create client that corresponds to nclient
|
|
*/
|
|
pkg_private NTFY_CLIENT *
|
|
ntfy_new_nclient(client_list, nclient, client_latest)
|
|
NTFY_CLIENT **client_list;
|
|
Notify_client nclient;
|
|
NTFY_CLIENT **client_latest;
|
|
{
|
|
register NTFY_CLIENT *client;
|
|
|
|
if ((client = ntfy_find_nclient(*client_list, nclient,
|
|
client_latest)) == NTFY_CLIENT_NULL) {
|
|
/* Allocate client */
|
|
if ((client = ntfy_alloc_client()) == NTFY_CLIENT_NULL)
|
|
return(NTFY_CLIENT_NULL);
|
|
/* Initialize client */
|
|
client->next = NTFY_CLIENT_NULL;
|
|
client->conditions = NTFY_CONDITION_NULL;
|
|
client->condition_latest = NTFY_CONDITION_NULL;
|
|
client->nclient = nclient;
|
|
client->prioritizer = ndis_default_prioritizer;
|
|
client->flags = 0;
|
|
/* Append to client list */
|
|
ntfy_append_client(client_list, client);
|
|
/* Set up client hint */
|
|
*client_latest = client;
|
|
}
|
|
return(client);
|
|
}
|
|
|
|
pkg_private void
|
|
ntfy_remove_client(client_list, client, client_latest, who)
|
|
NTFY_CLIENT **client_list;
|
|
NTFY_CLIENT *client;
|
|
NTFY_CLIENT **client_latest;
|
|
NTFY_WHO who;
|
|
{
|
|
register NTFY_CONDITION *condition;
|
|
NTFY_CONDITION *next;
|
|
|
|
/* Fixup enumeration variables if client matches one of them */
|
|
if (client == ntfy_enum_client)
|
|
ntfy_enum_client = NTFY_CLIENT_NULL;
|
|
if (client == ntfy_enum_client_next)
|
|
ntfy_enum_client_next = ntfy_enum_client_next->next;
|
|
/* Make sure that remove all conditions */
|
|
for (condition = client->conditions; condition; condition = next) {
|
|
next = condition->next;
|
|
ntfy_remove_condition(client, condition, who);
|
|
}
|
|
/* Remove & free client from client_list */
|
|
ntfy_remove_node((NTFY_NODE **)client_list, (NTFY_NODE *)client);
|
|
/* Invalidate condition hint */
|
|
*client_latest = NTFY_CLIENT_NULL;
|
|
}
|
|
|