5月 262012
VMOD processing want to before/after VCL function processing.
But, I do not want to write extra line.
How to do it?
Can be realized by the replace the pointer to sp->vcl->XXXX_func (VCL_XXXX)
Can be added to the processing by replacing pointer
static vcl_func_f *vmod_redirect_Hook_vcl_error = NULL; static pthread_mutex_t vmod_redirect_mutex = PTHREAD_MUTEX_INITIALIZER; static unsigned hook_done = 0; static int vmod_Hook_vcl_error(struct sess *sp){ .... //write the processing //call original vcl_error return(vmod_redirect_Hook_vcl_error(sp)); } int vmod_location(struct sess *sp, int status, const char*p,...) { //vcl reload detection. if(hook_done == 1 && sp->vcl->error_func != vmod_redirect_Hook_vcl_error ) hook_done = 0; if(hook_done == 0){ //lock to prevent another thread write AZ(pthread_mutex_lock(&vmod_redirect_mutex)); if(hook_done == 0) { //store the original vcl_error pointer vmod_redirect_Hook_vcl_error = sp->vcl->error_func; //hook sp->vcl->error_func = vmod_Hook_vcl_error; hook_done = 1; } //unlock AZ(pthread_mutex_unlock(&vmod_redirect_mutex)); } .... return (status); }
(via:vmod_redirect)
Hook to vcl_error at vmod processing in first time.
because there is no way to write-access the pointer at vmod_Init.
also, has locked using the mutex, because to prevent the loop by thread concurrent access.
I hope that this code is of help to you.
ATTENTION
don’t use varnishadm’s command “vcl.use” and “vcl.discard” . because to the segfault or call to other vcl function.
—
modify(2012-08-01)
when you vcl reloaded, hook method be off.