1 // NAME 2 // $RCSfile: Transmitter.java,v $ 3 // DESCRIPTION 4 // [given below in javadoc format] 5 // DELTA 6 // $Revision: 3.15 $ 7 // CREATED 8 // $Date: 2007/02/05 15:01:20 $ 9 // COPYRIGHT 10 // Westhawk Ltd 11 // TO DO 12 // 13 14 /* 15 * Copyright (C) 1996 - 1998 by Westhawk Ltd (www.westhawk.nl) 16 * Copyright (C) 1998 - 2006 by Westhawk Ltd 17 * <a href="www.westhawk.co.uk">www.westhawk.co.uk</a> 18 * 19 * Permission to use, copy, modify, and distribute this software 20 * for any purpose and without fee is hereby granted, provided 21 * that the above copyright notices appear in all copies and that 22 * both the copyright notice and this permission notice appear in 23 * supporting documentation. 24 * This software is provided "as is" without express or implied 25 * warranty. 26 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a> 27 */ 28 29 package uk.co.westhawk.snmp.stack; 30 31 /*- 32 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 33 * SNMP Java Client 34 * ჻჻჻჻჻჻ 35 * Copyright 2023 MetricsHub, Westhawk 36 * ჻჻჻჻჻჻ 37 * This program is free software: you can redistribute it and/or modify 38 * it under the terms of the GNU Lesser General Public License as 39 * published by the Free Software Foundation, either version 3 of the 40 * License, or (at your option) any later version. 41 * 42 * This program is distributed in the hope that it will be useful, 43 * but WITHOUT ANY WARRANTY; without even the implied warranty of 44 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 45 * GNU General Lesser Public License for more details. 46 * 47 * You should have received a copy of the GNU General Lesser Public 48 * License along with this program. If not, see 49 * <http://www.gnu.org/licenses/lgpl-3.0.html>. 50 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱ 51 */ 52 53 import java.util.*; 54 55 /** 56 * Transmitter is a thread that sends PDUs, when done 57 * it waits. 58 * 59 * @author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a> 60 * @version $Revision: 3.15 $ $Date: 2007/02/05 15:01:20 $ 61 */ 62 class Transmitter extends Object implements Runnable { 63 private static final String version_id = "@(#)$Id: Transmitter.java,v 3.15 2007/02/05 15:01:20 birgita Exp $ Copyright Westhawk Ltd"; 64 65 Pdu pdu = null; 66 Thread me; 67 String myName; 68 69 Transmitter(String name) { 70 me = new Thread(this, name); 71 me.setPriority(me.MIN_PRIORITY); 72 if (AsnObject.debug > 12) { 73 System.out.println("Transmitter(): Made thread " + name); 74 } 75 myName = name; 76 me.start(); 77 } 78 79 /** 80 * The method for the Runnable interface. 81 * 82 * It will do a sit() untill stand() wakes it up. The Pdu will then 83 * be transmitted 84 * 85 * @see #sit() 86 * @see #stand() 87 * @see Pdu#transmit() 88 */ 89 public void run() { 90 while (me != null) { 91 sit(); 92 synchronized (this) { 93 if (pdu != null) { 94 pdu.transmit(); 95 // I will say this only once.... 96 pdu = null; 97 } 98 } 99 } 100 } 101 102 /** 103 * Returns the string representation of the Transmitter. 104 * 105 * @return The string of the Transmitter 106 */ 107 public String toString() { 108 StringBuffer buffer = new StringBuffer(getClass().getName()); 109 buffer.append("["); 110 buffer.append("name=").append(myName); 111 buffer.append("]"); 112 return buffer.toString(); 113 } 114 115 synchronized void setPdu(Pdu p) { 116 pdu = p; 117 } 118 119 /** 120 * This method is the counterpart of stand(). 121 * 122 * It does not more than waiting to be notified. 123 * 124 * @see #stand() 125 * @see #run() 126 */ 127 synchronized void sit() { 128 while ((me != null) && (pdu == null)) { 129 try { 130 wait(); 131 } catch (InterruptedException iw) { 132 ; 133 } 134 135 } 136 } 137 138 /** 139 * This method is the counterpart of sit(). 140 * 141 * The Pdu will call this method when it is sent. 142 * This method will notify itself and in the end it is transmitted 143 * in run. 144 * 145 * @see #sit() 146 * @see #run() 147 * @see Pdu#send 148 */ 149 synchronized void stand() { 150 notifyAll(); 151 } 152 153 /** 154 * It may be sleeping (as opposed to wait()ing 155 * so send it a kick. 156 */ 157 void interruptMe() { 158 // unsafe ? 159 if (me != null) { 160 me.interrupt(); 161 } 162 } 163 164 void destroy() { 165 me = null; 166 pdu = null; 167 stand(); 168 } 169 }