28a0802000-08-14Martin Stjernholm // -*- pike -*- // // Some stuff to do logging of a request through the server. //
6e28de2008-11-05Martin Stjernholm // $Id: request_trace.h,v 1.17 2008/11/05 19:24:10 mast Exp $
f2180f2002-03-12Martin Stjernholm  #ifndef REQUEST_TRACE_H #define REQUEST_TRACE_H #include <roxen.h> #include <module.h>
28a0802000-08-14Martin Stjernholm 
b4642f2008-09-03Jonas Wallden // Note that TRACE_ENTER (and TRACE_LEAVE) takes message strings // in plain text. Messages are preferably a single line, and they
1b87102002-10-25Martin Stjernholm // should not end with period and/or newline.
b4642f2008-09-03Jonas Wallden // // // Roxen 5.0 compatibility notice: //
40ba452008-09-26Martin Stjernholm // Pre-5.0 TRACE_ENTER and TRACE_LEAVE allowed html markup to pass // through unquoted into the Resolve Path wizard page, but since the // ultimate destination may not be a web page at all this capability // has been removed. The Resolve Path wizard will now quote all // strings instead.
76c8c12002-03-19Martin Stjernholm 
28a0802000-08-14Martin Stjernholm #ifdef REQUEST_TRACE
6e28de2008-11-05Martin Stjernholm # define ID_TRACE_ENTER(ID, A, B) Roxen->trace_enter ((ID), (A), (B)) # define ID_TRACE_LEAVE(ID, A) Roxen->trace_leave ((ID), (A))
28a0802000-08-14Martin Stjernholm  #else
6e28de2008-11-05Martin Stjernholm # define ID_TRACE_ENTER(ID, A, B) do{ \ object _iD_ = (ID); \
4b09682001-11-01Henrik Grubbström (Grubba)  function(string,mixed ...:void) _trace_enter; \
6e28de2008-11-05Martin Stjernholm  if(_iD_ && \
3ef3d12001-11-01Henrik Grubbström (Grubba)  (_trace_enter = \
6e28de2008-11-05Martin Stjernholm  [function(string,mixed ...:void)]([mapping(string:mixed)]_iD_->misc)-> \
3ef3d12001-11-01Henrik Grubbström (Grubba)  trace_enter)) \ _trace_enter((A), (B)); \
fa4f792000-03-13Martin Nilsson  }while(0)
6e28de2008-11-05Martin Stjernholm # define ID_TRACE_LEAVE(ID, A) do{ \ object _iD_ = (ID); \
4b09682001-11-01Henrik Grubbström (Grubba)  function(string:void) _trace_leave; \
6e28de2008-11-05Martin Stjernholm  if(_iD_ && \
3ef3d12001-11-01Henrik Grubbström (Grubba)  (_trace_leave = \
6e28de2008-11-05Martin Stjernholm  [function(string:void)]([mapping(string:mixed)]_iD_->misc)-> \
3ef3d12001-11-01Henrik Grubbström (Grubba)  trace_leave)) \ _trace_leave(A); \
fa4f792000-03-13Martin Nilsson  }while(0)
28a0802000-08-14Martin Stjernholm 
fa4f792000-03-13Martin Nilsson #endif
4717052001-05-07Per Hedbor 
6e28de2008-11-05Martin Stjernholm #define TRACE_ENTER(A,B) ID_TRACE_ENTER (id, (A), (B)) #define TRACE_LEAVE(A) ID_TRACE_LEAVE (id, (A))
76c8c12002-03-19Martin Stjernholm // SIMPLE_TRACE_ENTER and SIMPLE_TRACE_LEAVE are simpler variants of
52ff1e2008-09-26Martin Stjernholm // the above macros since they handle sprintf style format lists. Note // the reversed argument order in SIMPLE_TRACE_ENTER compared to // TRACE_ENTER.
76c8c12002-03-19Martin Stjernholm 
6e28de2008-11-05Martin Stjernholm #define SIMPLE_ID_TRACE_ENTER(ID, OBJ, MSG...) do { \
76c8c12002-03-19Martin Stjernholm  array _msg_arr_; \
6e28de2008-11-05Martin Stjernholm  ID_TRACE_ENTER ((ID), \ (_msg_arr_ = ({MSG}), \
1b87102002-10-25Martin Stjernholm  sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \
b4642f2008-09-03Jonas Wallden  (sizeof (_msg_arr_) ? _msg_arr_[0] : "")), \
76c8c12002-03-19Martin Stjernholm  (OBJ)); \ } while (0)
6e28de2008-11-05Martin Stjernholm #define SIMPLE_ID_TRACE_LEAVE(ID, MSG...) do { \
76c8c12002-03-19Martin Stjernholm  array _msg_arr_; \
6e28de2008-11-05Martin Stjernholm  ID_TRACE_LEAVE ((ID), \ (_msg_arr_ = ({MSG}), \
879c702004-05-14Martin Stjernholm  sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \
b4642f2008-09-03Jonas Wallden  (sizeof (_msg_arr_) ? _msg_arr_[0] : ""))); \
76c8c12002-03-19Martin Stjernholm  } while (0)
6e28de2008-11-05Martin Stjernholm #define SIMPLE_TRACE_ENTER(OBJ, MSG...) SIMPLE_ID_TRACE_ENTER (id, OBJ, MSG) #define SIMPLE_TRACE_LEAVE(MSG...) SIMPLE_ID_TRACE_LEAVE (id, MSG)
f2180f2002-03-12Martin Stjernholm // The following variant should be used inside RXML.Frame callbacks // such as do_enter. In addition to the request trace, it does rxml // debug logging which is activated with the DEBUG define in // combination with the magic _debug_ tag argument or the RXML_VERBOSE // or RXML_REQUEST_VERBOSE defines. #define TAG_TRACE_ENTER(MSG...) do { \ array _msg_arr_; \ string _msg_; \
b4642f2008-09-03Jonas Wallden  TRACE_ENTER ("tag <" + (tag && tag->name) + "> " + \
1b87102002-10-25Martin Stjernholm  (_msg_arr_ = ({MSG}), \ _msg_ = sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \
b4642f2008-09-03Jonas Wallden  (sizeof (_msg_arr_) ? _msg_arr_[0] : "")), \
f2180f2002-03-12Martin Stjernholm  tag); \ DO_IF_DEBUG ( \ if (TAG_DEBUG_TEST (flags & RXML.FLAG_DEBUG)) \ tag_debug ("%O: %s\n", this_object(), \
76c8c12002-03-19Martin Stjernholm  _msg_ || \ (_msg_arr_ = ({MSG}), \ sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \ (sizeof (_msg_arr_) ? _msg_arr_[0] : ""))); \
1b87102002-10-25Martin Stjernholm  ); \
f2180f2002-03-12Martin Stjernholm  } while (0) #define TAG_TRACE_LEAVE(MSG...) do { \ array _msg_arr_; \ string _msg_; \
bc34bf2002-10-25Martin Stjernholm  TRACE_LEAVE ((_msg_arr_ = ({MSG}), \ _msg_ = sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \ (sizeof (_msg_arr_) ? _msg_arr_[0] : ""))); \
f2180f2002-03-12Martin Stjernholm  DO_IF_DEBUG ( \ if (TAG_DEBUG_TEST (flags & RXML.FLAG_DEBUG)) { \ if (!_msg_) { \ _msg_arr_ = ({MSG}); \
76c8c12002-03-19Martin Stjernholm  _msg_ = \ sizeof (_msg_arr_) > 1 ? sprintf (@_msg_arr_) : \ (sizeof (_msg_arr_) ? _msg_arr_[0] : ""); \
f2180f2002-03-12Martin Stjernholm  } \ if (sizeof (_msg_)) tag_debug ("%O: %s\n", this_object(), _msg_); \ } \ ); \ } while (0)
4717052001-05-07Per Hedbor  #ifdef AVERAGE_PROFILING #define PROF_ENTER(X,Y) id->conf->avg_prof_enter( X, Y, id ) #define PROF_LEAVE(X,Y) id->conf->avg_prof_leave( X, Y, id ) #define COND_PROF_ENTER(X,Y,Z) if(X)PROF_ENTER(Y,Z) #define COND_PROF_LEAVE(X,Y,Z) if(X)PROF_LEAVE(Y,Z) #else #define PROF_ENTER(X,Y) #define PROF_LEAVE(X,Y) #define COND_PROF_ENTER(X,Y,Z) #define COND_PROF_LEAVE(X,Y,Z) #endif
f2180f2002-03-12Martin Stjernholm  #endif // !REQUEST_TRACE_H