28a0802000-08-14Martin Stjernholm // -*- pike -*- // // Some stuff to do logging of a request through the server. //
b4642f2008-09-03Jonas Wallden // $Id: request_trace.h,v 1.14 2008/09/03 16:14:28 jonasw 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: // // Pre-5.0 these macros allowed html markup to pass through unquoted // into the tracing machinery, 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 # define TRACE_ENTER(A,B) Roxen->trace_enter (id, (A), (B)) # define TRACE_LEAVE(A) Roxen->trace_leave (id, (A)) #else
fa4f792000-03-13Martin Nilsson # define TRACE_ENTER(A,B) do{ \
4b09682001-11-01Henrik Grubbström (Grubba)  function(string,mixed ...:void) _trace_enter; \
3ef3d12001-11-01Henrik Grubbström (Grubba)  if(id && \ (_trace_enter = \ [function(string,mixed ...:void)]([mapping(string:mixed)]id->misc)-> \ trace_enter)) \ _trace_enter((A), (B)); \
fa4f792000-03-13Martin Nilsson  }while(0) # define TRACE_LEAVE(A) do{ \
4b09682001-11-01Henrik Grubbström (Grubba)  function(string:void) _trace_leave; \
3ef3d12001-11-01Henrik Grubbström (Grubba)  if(id && \ (_trace_leave = \ [function(string:void)]([mapping(string:mixed)]id->misc)-> \ trace_leave)) \ _trace_leave(A); \
fa4f792000-03-13Martin Nilsson  }while(0)
28a0802000-08-14Martin Stjernholm 
fa4f792000-03-13Martin Nilsson #endif
4717052001-05-07Per Hedbor 
76c8c12002-03-19Martin Stjernholm // SIMPLE_TRACE_ENTER and SIMPLE_TRACE_LEAVE are simpler variants of
1b87102002-10-25Martin Stjernholm // the above macros: They handle sprintf style format lists and don't // take html encoded messages. Note the reversed argument order in // SIMPLE_TRACE_ENTER compared to TRACE_ENTER.
76c8c12002-03-19Martin Stjernholm  #define SIMPLE_TRACE_ENTER(OBJ, MSG...) do { \ array _msg_arr_; \
b4642f2008-09-03Jonas Wallden  TRACE_ENTER ( (_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) #define SIMPLE_TRACE_LEAVE(MSG...) do { \ array _msg_arr_; \
b4642f2008-09-03Jonas Wallden  TRACE_LEAVE ( (_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)
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.
1b87102002-10-25Martin Stjernholm //
b4642f2008-09-03Jonas Wallden // These two macros do not take html encoded messages (which since 5.0 // is true for all tracing macros).
f2180f2002-03-12Martin Stjernholm  #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