00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "Registration.h"
00040 #include "bundling/Bundle.h"
00041 #include "bundling/BundleDaemon.h"
00042 #include "bundling/BundleList.h"
00043 #include "storage/GlobalStore.h"
00044
00045 namespace dtn {
00046
00047
00048 const char*
00049 Registration::failure_action_toa(failure_action_t action)
00050 {
00051 switch(action) {
00052 case DROP: return "DROP";
00053 case DEFER: return "DEFER";
00054 case EXEC: return "EXEC";
00055 }
00056
00057 return "__INVALID__";
00058 }
00059
00060
00061 Registration::Registration(u_int32_t regid,
00062 const EndpointIDPattern& endpoint,
00063 failure_action_t action,
00064 u_int32_t expiration,
00065 const std::string& script)
00066
00067 : Logger("Registration", "/dtn/registration/%d", regid),
00068 regid_(regid),
00069 endpoint_(endpoint),
00070 failure_action_(action),
00071 script_(script),
00072 expiration_(expiration),
00073 expiration_timer_(NULL),
00074 active_(false),
00075 expired_(false)
00076 {
00077 struct timeval now;
00078 ::gettimeofday(&now, 0);
00079 creation_time_ = now.tv_sec;
00080
00081 init_expiration_timer();
00082 }
00083
00084
00085 Registration::Registration(const oasys::Builder&)
00086 : Logger("Registration", "/dtn/registration"),
00087 regid_(0),
00088 endpoint_(),
00089 failure_action_(DEFER),
00090 script_(),
00091 expiration_(0),
00092 creation_time_(0),
00093 expiration_timer_(NULL),
00094 active_(false),
00095 expired_(false)
00096 {
00097 }
00098
00099
00100 Registration::~Registration()
00101 {
00102 cleanup_expiration_timer();
00103 }
00104
00105
00106 void
00107 Registration::force_expire()
00108 {
00109 ASSERT(active_);
00110
00111 cleanup_expiration_timer();
00112 set_expired(true);
00113 }
00114
00115
00116 void
00117 Registration::cleanup_expiration_timer()
00118 {
00119 if (expiration_timer_) {
00120
00121
00122
00123
00124 bool pending = expiration_timer_->cancel();
00125
00126 if (! pending) {
00127 ASSERT(expired_);
00128 delete expiration_timer_;
00129 }
00130
00131 expiration_timer_ = NULL;
00132 }
00133 }
00134
00135
00136 void
00137 Registration::serialize(oasys::SerializeAction* a)
00138 {
00139 a->process("endpoint", &endpoint_);
00140 a->process("regid", ®id_);
00141 a->process("action", (u_int32_t*)&failure_action_);
00142 a->process("script", &script_);
00143 a->process("creation_time", &creation_time_);
00144 a->process("expiration", &expiration_);
00145
00146
00147 if (a->action_code() == oasys::Serialize::UNMARSHAL) {
00148 init_expiration_timer();
00149 }
00150
00151 logpathf("/dtn/registration/%d", regid_);
00152 }
00153
00154
00155 void
00156 Registration::init_expiration_timer()
00157 {
00158 if (expiration_ != 0) {
00159 struct timeval when, now;
00160 when.tv_sec = creation_time_ + expiration_;
00161 when.tv_usec = 0;
00162
00163 ::gettimeofday(&now, 0);
00164
00165 long int in_how_long = TIMEVAL_DIFF_MSEC(when, now);
00166 if (in_how_long < 0) {
00167 log_warn("scheduling IMMEDIATE expiration for registration id %d: "
00168 "[creation_time %u, expiration %u, now %u]",
00169 regid_, creation_time_, expiration_, (u_int)now.tv_sec);
00170 } else {
00171 log_debug("scheduling expiration for registration id %d at %u.%u "
00172 "(in %ld seconds): ", regid_,
00173 (u_int)when.tv_sec, (u_int)when.tv_usec,
00174 in_how_long / 1000);
00175 }
00176
00177 expiration_timer_ = new ExpirationTimer(this);
00178 expiration_timer_->schedule_at(&when);
00179
00180 } else {
00181 set_expired(true);
00182 }
00183 }
00184
00185
00186 void
00187 Registration::ExpirationTimer::timeout(const struct timeval& now)
00188 {
00189 (void)now;
00190
00191 reg_->set_expired(true);
00192
00193 if (! reg_->active()) {
00194 BundleDaemon::post(new RegistrationExpiredEvent(reg_->regid()));
00195 }
00196 }
00197
00198 }