Hi Folks,
I wanted to test the 2.6c version on a testsystem of ours but I ran into
trouble. Every time 1 request was handled I got this error:
MONITOR: worker exited on signal 11, restarting...
After some research I found out it was the memcopy in do_http() which causes
the error:
from_host = ((thr_arg *)arg)->from_host;
memcpy(&from_host_addr, from_host.ai_addr, from_host.ai_addrlen);
from_host.ai_addr = (struct sockaddr *)&from_host_addr;
The value from_host.ai_addrlen was equal to 5394258 and after some debugging it
seems the whole struct contained bogus.
Ok, let's find out why?
The do_http() function is called from thr_http() which has some strange while
loop in it. It fetches work from a queue with the call get_thr_arg() but this
call is allowed to return a NULL value sometimes. If this happens than ask
again...
Well, this wasn't a NULL value so there must be something else going on. Maybe
the queue?
The code contained some errors (as far as my concurrent and queue knowledge
go's). I reimplemented them to the following code. It solved my errors and I
think the strange while-loop in the thr_http function is not needed anymore.
Can you please comment on my changes?
int
put_thr_arg(thr_arg *arg)
{
thr_arg *res;
if((res = malloc(sizeof(thr_arg))) == NULL) {
logmsg(LOG_WARNING, "thr_arg malloc");
return -1;
}
memcpy(res, arg, sizeof(thr_arg));
(void)pthread_mutex_lock(&arg_mut);
res->next = NULL;
if (last == NULL) {
first = last = res;
} else {
last->next = res;
last = res;
}
pthread_cond_broadcast(&arg_cond);
(void)pthread_mutex_unlock(&arg_mut);
return 0;
}
/*
* get a request from the queue
*/
thr_arg *
get_thr_arg(void)
{
thr_arg *res = NULL;
(void)pthread_mutex_lock(&arg_mut);
while (first == NULL)
(void)pthread_cond_wait(&arg_cond, &arg_mut);
res = first;
if((first = res->next) == NULL)
last = NULL;
else
pthread_cond_signal(&arg_cond);
(void)pthread_mutex_unlock(&arg_mut);
return res;
}
Thanks!
Kind regards,
Steven van der Vegt
--
To unsubscribe send an email with subject unsubscribe to [email protected].
Please contact [email protected] for questions.