Пример #1
0
 /**
  * @param max_enqueues the maximum number of times Enqueue is allowed, after
  * that it will throw InvalidOperationException and the queue will be closed
  */
 public Channel(int max_enqueues) {
   if( max_enqueues == 0 ) {
     //This doesn't make sense
     throw new ArgumentOutOfRangeException("max_enqueues", max_enqueues, "cannot be zero");
   }
   _closed = 0;
   _queue = new Brunet.Util.LockFreeQueue<object>();
   _max_enqueues = max_enqueues;
   _enqueues = 0;
   _count = 0;
   _close_event = new FireOnceEvent();
 }
Пример #2
0
///////////////
///
///  Here is the constructor
///
////////////////

    /**
     * @param local the local Node to connect to the remote node
     * @param target the address of the node you are trying to connect
     * to.  Set to null if you don't know
     * @param target_list an enumerable list of TransportAddress of the
     *                    Host we want to connect to
     * @param t ConnectionType string of the new connection
     * @token unique token to associate the different connection setup messages
     */
    public Linker(Node local, Address target, ICollection target_list, string ct, string token)
    {
      _task = new LinkerTask(local.Address, target, ct);
      _local_n = local;
      _active_lps_count = 0;
      //this TaskQueue starts new tasks in the announce thread of the node.
      _task_queue = new NodeTaskQueue(local);
      _task_queue.EmptyEvent += this.FinishCheckHandler;
      _ta_queue = new Brunet.Util.LockFreeQueue<TransportAddress>();
      if( target_list != null ) {
        int count = 0;
        Hashtable tas_in_queue = new Hashtable( _MAX_REMOTETAS );
        foreach(TransportAddress ta in target_list ) {
          if(tas_in_queue.ContainsKey(ta) ) {
//            Console.Error.WriteLine("TA: {0} appeared in list twice", ta);
          }
          else {
            _ta_queue.Enqueue(ta);
            tas_in_queue[ta] = null; //Remember that we've seen this one
            if( target != null ) {
              /*
               * Make sure we don't go insane with TAs
               * we know who we want to try to connect to,
               * if it doesn't work after some number of
               * attempts, give up.  Don't go arbitrarily
               * long
               */
              count++;
              if( count >= _MAX_REMOTETAS ) { break; }
            }
          }
        }
      }
      _added_cons = 0; //We have not added a connection yet
      _contype = ct;
      _maintype = Connection.StringToMainType( _contype );
      _target = target;
      _token = token;
      _ta_to_restart_state = new Hashtable( _MAX_REMOTETAS );
      _started = 0;
      _hold_fire = 1;
      _cph_transfer_requests = 0;
#if LINK_DEBUG
      _lid = Interlocked.Increment(ref _last_lid);
      if(ProtocolLog.LinkDebug.Enabled) {
        ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format("{0}: Making {1}",
              _local_n.Address, this));
        if( target_list != null ) {
	        ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format("TAs:"));
          foreach(TransportAddress ta in target_list) {
            ProtocolLog.Write(ProtocolLog.LinkDebug, String.Format("{0}", ta));
          }
        }
      }
#endif
    }