cltracer.cc

00001 /*
00002  * Copyright (c) 2006 Regents of the SIGNET lab, University of Padova.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the University of Padova (SIGNET lab) nor the 
00014  *    names of its contributors may be used to endorse or promote products 
00015  *    derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
00018  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
00019  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
00020  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
00021  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00022  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
00023  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
00024  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
00025  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
00026  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
00027  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include <stdarg.h>
00031 #include "cltracer.h"
00032 #include "clsap.h"
00033 
00034 /*-------------------------------------------------------------------------------------------------------
00035         methods for clTracer class
00036 ---------------------------------------------------------------------------------------------------------*/ 
00037 
00038 ClTracer::ClTracer() : commonTr_(0)
00039 {
00040         for (int i = 0; i < MAXHASHINDEX; i++)
00041                 tr_[i] = 0;
00042 }
00043 
00044 // add a new tracer (insert sorted by level, decreasing from the max)
00045 // (a new tracer of the same level is inserted in tail of the already inserted tracer)
00046 void ClTracer::addTracer(ClMessageTracer *newTr)
00047 {
00048         if(!newTr)
00049                 return;
00050         int i = newTr->clType() % MAXHASHINDEX;
00051         addTracer(newTr, &(tr_[i]));
00052 }
00053 
00054 void ClTracer::addCommonTracer(ClMessageTracer *newTr)
00055 {
00056         if(!newTr)
00057                 return;
00058         commonTr_ = newTr;
00059 }
00060 
00061 void ClTracer::addTracer(ClMessageTracer *newTr, ClMessageTracer **tr)
00062 {
00063         if(!*tr)
00064         {
00065                 /*
00066                 newTr is the first ClMessageTracer with this key
00067                 */
00068                 *tr = newTr;
00069                 (*tr)->next(newTr);
00070                 return;
00071         }
00072         newTr->next(*tr);
00073         ClMessageTracer *cur;
00074         
00075         for (cur = *tr; cur->next() != *tr; cur = cur->next());
00076         
00077         cur->next(newTr);
00078         
00079 }
00080 
00081 // begin the trace of the packet that is crossing the ClSAP
00082 void ClTracer::trace(ClMessage *m, ConnectorTrace *clsap)
00083 {
00084         if(commonTr_)
00085                 commonTr_->format(m, clsap);
00086         int i = m->type() % MAXHASHINDEX;
00087         ClMessageTracer *cur;
00088         for (cur = tr_[i]; cur && cur->next() != tr_[i]; cur = cur->next())
00089         {
00090                 if(cur->clType() == m->type())
00091                 {
00092                         tr_[i] = cur;
00093                         cur->format(m, clsap);
00094                         return;
00095                 }
00096         }
00097         if(cur && cur->clType() == m->type())
00098         {
00099                 tr_[i] = cur;
00100                 cur->format(m, clsap);
00101         }
00102 }
00103 
00104 /*-------------------------------------------------------------------------------------------------------
00105         methods for ClMessageTracer class
00106 ---------------------------------------------------------------------------------------------------------*/ 
00107 
00108 ClMessageTracer::ClMessageTracer(ClMessage_t clType) : clType_(clType)
00109 {
00110         next_ = 0;
00111 }
00112 
00113 ClMessage_t ClMessageTracer::clType()
00114 {
00115         return (clType_);
00116 }
00117 
00118 ClMessageTracer* ClMessageTracer::next()
00119 {
00120         return (next_);
00121 }
00122 
00123 void ClMessageTracer::next(ClMessageTracer *tr)
00124 {
00125         next_ = tr;
00126 }
00127 
00128 void ClMessageTracer::writeTrace(ConnectorTrace *clsap, char *s, ...)
00129 {
00130         va_list ap;
00131         va_start(ap,s);
00132         clsap->vWriteTrace(s, ap);
00133         //printf(s,ap);
00134         va_end(ap);
00135 }
00136 
00137 

Generated on Wed Nov 26 15:47:28 2008 for NS-MIRACLE library by  doxygen 1.5.2