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