god.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. /* Ported from CMU/Monarch's code, nov'98 -Padma.*/
  35. /* -*- c++ -*-
  36.    god.h
  37.    General Operations Director
  38.    perform operations requiring omnipotence in the simulation
  39.    */
  40. #ifndef __god_h
  41. #define __god_h
  42. #include <stdarg.h>
  43. #include "bi-connector.h"
  44. #include "object.h"
  45. #include "packet.h"
  46. #include "trace.h"
  47. #include "node.h"
  48. #include "diffusion/hash_table.h"
  49. // Added by Chalermek  12/1/99
  50. #define MIN_HOPS(i,j)    min_hops[i*num_nodes+j]
  51. #define NEXT_HOP(i,j)    next_hop[i*num_nodes+j]
  52. #define SRC_TAB(i,j)     source_table[i*num_nodes+j]
  53. #define SK_TAB(i,j)      sink_table[i*num_nodes+j]
  54. #define UNREACHABLE  0x00ffffff
  55. #define RANGE            250.0                 // trasmitter range in meters
  56. class NodeStatus {
  57. public:
  58.   bool is_source_;
  59.   bool is_sink_;
  60.   bool is_on_trees_;
  61.   NodeStatus() { is_source_ = is_sink_ = is_on_trees_ = false; }
  62. };
  63. // Cut and Paste from setdest.h   -- Chalermek 12/1/99
  64. class vector {
  65. public:
  66. vector(double x = 0.0, double y = 0.0, double z = 0.0) {
  67. X = x; Y = y; Z = z;
  68. }
  69. double length() {
  70. return sqrt(X*X + Y*Y + Z*Z);
  71. }
  72. inline void operator=(const vector a) {
  73. X = a.X;
  74. Y = a.Y;
  75. Z = a.Z;
  76. }
  77. inline void operator+=(const vector a) {
  78. X += a.X;
  79. Y += a.Y;
  80. Z += a.Z;
  81. }
  82. inline int operator==(const vector a) {
  83. return (X == a.X && Y == a.Y && Z == a.Z);
  84. }
  85. inline int operator!=(const vector a) {
  86. return (X != a.X || Y != a.Y || Z != a.Z);
  87. }
  88. inline vector operator-(const vector a) {
  89. return vector(X-a.X, Y-a.Y, Z-a.Z);
  90. }
  91. friend inline vector operator*(const double a, const vector b) {
  92. return vector(a*b.X, a*b.Y, a*b.Z);
  93. }
  94. friend inline vector operator/(const vector a, const double b) {
  95. return vector(a.X/b, a.Y/b, a.Z/b);
  96. }
  97. double X;
  98. double Y;
  99. double Z;
  100. };
  101. // ------------------------
  102. class God : public BiConnector {
  103. public:
  104.         God();
  105.         int             command(int argc, const char* const* argv);
  106.         void            recv(Packet *p, Handler *h);
  107.         void            stampPacket(Packet *p);
  108.         int initialized() {
  109.                 return num_nodes && min_hops && uptarget_;
  110.         }
  111.         int             hops(int i, int j);
  112.         static God*     instance() { assert(instance_); return instance_; }
  113. int nodes() { return num_nodes; }
  114.         inline void getGrid(double *x, double *y, double *z) {
  115. *x = maxX; *y = maxY; *z = gridsize_;
  116. }
  117.   // Added by Chalermek 12/1/99
  118.         int  data_pkt_size;        // in bytes. 
  119.         int  num_alive_node;
  120.         int  num_connect;
  121.         int  num_recv;
  122.         int  num_compute;          // number of route-computation times
  123.         double prev_time;          // the previous time it computes the route
  124.         int  num_data_types;      
  125.         int  **source_table;
  126.         int  *sink_table;
  127.         int  *num_send;            // for each data type
  128.         Data_Hash_Table dtab;
  129.         void DumpNodeStatus();
  130.         void DumpNumSend();
  131.         void CountNewData(int *attr);
  132.         void IncrRecv();
  133.         bool ExistSource();
  134.         bool ExistSink();
  135.         bool IsPartition();
  136.         void StopSimulation();
  137.         void CountConnect();
  138.         void CountAliveNode();
  139.         void ComputeRoute();      
  140.         int  NextHop(int from, int to);
  141.         void ComputeNextHop();     // Look at min_hops to fill in next_hop
  142.         void Dump();               // Dump all internal data
  143.         bool IsReachable(int i, int j);  // Is node i reachable to node j ?
  144.         bool IsNeighbor(int i, int j);   // Is node i a neighbor of node j ?
  145.         void ComputeW();           // Initialize the connectivity metrix
  146.         void floyd_warshall();     // Calculate the shortest path
  147.         void AddSink(int dt, int skid);
  148.         void AddSource(int dt, int srcid);
  149.         void Fill_for_Sink(int dt, int srcid);
  150.         void Fill_for_Source(int dt, int skid);
  151.         void Rewrite_OIF_Map();
  152.         void UpdateNodeStatus();
  153.         
  154.         // Return number of next oifs in ret_num_oif.
  155.         // Return array of next oifs as return value of the function.
  156.         int *NextOIFs(int dt, int srcid, int curid, int *ret_num_oif);
  157.   
  158.         // serve for GAF algorithm
  159.   
  160.         int load_grid(int,int,int);
  161.         int getMyGrid(double x, double y);
  162.         int getMyLeftGrid(double x, double y);
  163.         int getMyRightGrid(double x, double y);
  164.         int getMyTopGrid(double x, double y);
  165.         int getMyBottomGrid(double x, double y);
  166.         
  167.         inline int getMyGridSize() {
  168. return gridsize_;
  169. }
  170.   // -----------------------
  171. private:
  172.         int num_nodes;
  173.         int* min_hops;   // square array of num_nodesXnum_nodes
  174.                          // min_hops[i * num_nodes + j] giving 
  175.  // minhops between i and j
  176.         static God*     instance_;
  177.         // Added by Chalermek    12/1/99
  178.         bool active;
  179.         bool allowTostop;
  180.         MobileNode **mb_node; // mb_node[i] giving pointer to object 
  181.                               // mobile node i
  182.         NodeStatus *node_status;
  183.         int *next_hop;        // next_hop[i * num_nodes + j] giving
  184.                               //   the next hop of i where i wants to send
  185.                               //  a packet to j.
  186.         int maxX;          // keeping grid demension info: max X, max Y and 
  187.         int maxY;          // grid size
  188.         int gridsize_;
  189.         int gridX;
  190.         int gridY;
  191. };
  192. #endif