usr/src/lib/libslp/javalib/com/sun/slp/PermSARegTable.java
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 0 68f95e015346
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2001 by Sun Microsystems, Inc.
 * All rights reserved.
 *
 */

//  PermSARegTable.java: Periodically reregister registrations.
//  Author:           James Kempf
//  Created On:       Thu May 14 14:11:49 1998
//  Last Modified By: James Kempf
//  Last Modified On: Thu Jan 28 14:53:43 1999
//  Update Count:     36
//

package com.sun.slp;

import java.net.*;
import java.io.*;
import java.util.*;

/**
 * Periodically reregister advertisments in the SA client.
 *
 * @author Erik Guttman, James Kempf
 */

class PermSARegTable extends Thread {

    private Hashtable htRegs;
    private SLPConfig config;
    private final static long INCREMENT = Defaults.lMaxSleepTime / 2L;
								// 9 hours...
    private final static long SLEEPY_TIME = INCREMENT / 2L;
						// 4 hours, more or less...

    // We use these indicies for record access. We should use a class
    //  here, but it's another 1K!

    private final static int TIME = 0;
    private final static int REG = 1;

    PermSARegTable(SLPConfig config) {
	htRegs = new Hashtable();
	this.config = config;
	start();
    }

    // We just lock the hashtable when we need to update. Otherwise, we
    //  get into deadlock if an outgoing request is being made when
    //  somebody else wants to get into this class to look something
    //  up.

    void reg(ServiceURL URL, CSrvReg sr) {

	// Make up a record for the table.

	Object[] rec =
	    new Object[] {
	    new Long(System.currentTimeMillis() + INCREMENT),
		sr};

	// Note that we do not account for multiple nonservice: URLs under
	// separate type names, because that is disallowed by the protocol.

	htRegs.put(URL, rec);
    }

    // Remove

    void dereg(ServiceURL URL) {
	htRegs.remove(URL);

    }

    // Send off the vector of registations for expired advertisements.

    private void send(SrvLocMsg reg) {
	InetAddress addr = config.getLoopback();

	try {
	    Transact.transactTCPMsg(addr, reg, true);

	} catch (ServiceLocationException ex) {

	    config.writeLog("periodic_exception",
			    new Object[] {new Short(ex.getErrorCode()),
					      ex.getMessage()});
	} catch (IllegalArgumentException iae) {
	    Assert.slpassert(false, "reregister_bug", new Object[0]);

	}
    }

    // Walk the registration table, collecting registrations
    //  to reregister. We synchronize on this method to close
    //  the window between when the table is walked and
    //  when the registration is sent
    //  during which the client may deregister the URL but
    //  it is reregistered anyway.

    private synchronized void walk() {
	Enumeration e;
	long lnow = System.currentTimeMillis();

	e = htRegs.keys();

	while (e.hasMoreElements()) {
	    ServiceURL url = (ServiceURL)e.nextElement();
	    Object[] rec = (Object[])htRegs.get(url);
	    long xtime = ((Long)rec[TIME]).longValue();

	    // If the deadline to refresh passed, then do it.

	    if (xtime <= lnow) {
		send((SrvLocMsg)rec[REG]);
		rec[TIME] = new Long(lnow + INCREMENT);
	    }
	}

    }

    public void run() {

	setName("SLP PermSARegTable");

	while (true) {

	    try {

		// Sleep for half the reregistration interval (which itself
		//  is half the lifetime of the URLs.

		sleep(SLEEPY_TIME);

	    } catch (InterruptedException ie) {

	    }

	    walk();

	}
    }
}