00001
00018 #ifndef _COMM_H
00019 #define _COMM_H
00020
00021 #include <stdarg.h>
00022 #include "gridlabd.h"
00023
00024 class Message {
00025 private:
00026 static unsigned int64 next_id;
00027 unsigned int64 id;
00028 class machine *src;
00029 class machine *dst;
00030 TIMESTAMP delivery_time;
00031 size_t size;
00032 void *data;
00033 Message *next, *prev;
00034 public:
00035 Message(void *ptr, size_t len, class machine *from, class machine *to)
00036 {
00037 id = next_id++;
00038 if (len>0)
00039 {
00040 data = malloc((len/16+1)*16);
00041 memcpy(data,ptr,len+1);
00042 }
00043 else
00044 data = NULL;
00045 size=len;
00046 src=from;
00047 dst=to;
00048 delivery_time = TS_NEVER;
00049 next = prev = NULL;
00050 };
00051 ~Message(void)
00052 {
00053 if (data!=NULL)
00054 free(data);
00055 }
00056 inline unsigned int64 get_id(void) const { return id;};
00057 inline void *get_data(void) const { return data;};
00058 inline size_t get_size(void) const { return size;};
00059 inline TIMESTAMP get_deliverytime(void) const { return delivery_time;};
00060 inline void set_deliverytime(TIMESTAMP dt) { delivery_time=dt;};
00061 inline class machine *get_src(void) const { return src;};
00062 inline class machine *get_dst(void) const { return dst;};
00063 inline Message *get_next(void) const { return next;};
00064 inline Message *get_prev(void) const { return prev;};
00065 inline void set_next(Message *msg) { next=msg;};
00066 inline void set_prev(Message *msg) { prev=msg;};
00067 };
00068
00069 class Queue {
00070 private:
00071 Message *first;
00072 Message *last;
00073 public:
00074 Queue();
00075 ~Queue();
00076 void add(Message *msg);
00077 Message *peek(void);
00078 Message *take(Message *msg=NULL);
00079 TIMESTAMP next_delivery_time(void);
00080 inline bool is_empty(void) { return first==NULL;};
00081 Message *next(Message *msg);
00082 Message *drop(Message *msg, bool reverse=false);
00083 };
00084
00085 #include "machine.h"
00086
00087 class comm {
00088 public:
00089 double bitrate;
00090 char256 latency;
00091 double reliability;
00092 double timeout;
00093 private:
00094 Queue queue;
00095 RANDOMTYPE rtype;
00096 double a, b;
00097 TIMESTAMP next_delivery;
00098 public:
00099 static CLASS *oclass;
00100 static comm* defaults;
00101 public:
00102 comm(MODULE *mod);
00103 ~comm(void);
00104 int create();
00105 int init(OBJECT *parent);
00106 TIMESTAMP sync(TIMESTAMP t0);
00107 public:
00108 static void route(comm *net, Message *msg);
00109 protected:
00110 int send(void *data, size_t size, machine *from, machine *to);
00111 private:
00112 void route(Message *msg);
00113 friend class machine;
00114 };
00115
00117 #endif