Hi,
I'm going nuts on this issue ;-)
Please have a look at this C code:
struct vos_s { pthread_mutex_t trigger_drawing_mutex; pthread_cond_t trigger_drawing; };
typedef struct vos_s vos_t;
static int interruptable_sleep(vos_t *pobj, int usec_to_sleep) { struct timespec abstime;
struct timeval now; gettimeofday(&now, 0);
abstime.tv_sec = now.tv_sec + usec_to_sleep / 1000000; abstime.tv_nsec = now.tv_usec * 1000 + (usec_to_sleep % 1000000) * 1000;
if (abstime.tv_nsec > 1000000000) { abstime.tv_nsec -= 1000000000; abstime.tv_sec++; }
return pthread_cond_timedwait(&pobj->trigger_drawing, &pobj->trigger_drawing_mutex, &abstime); }
static void trigger_drawing(vos_t *pobj) { pthread_mutex_lock(&pobj->trigger_drawing_mutex); pthread_cond_signal(&pobj->trigger_drawing); pthread_mutex_unlock(&pobj->trigger_drawing_mutex); }
static vos_t obj;
static void painter() { pthread_mutex_init(&obj.trigger_drawing_mutex, NULL); pthread_cond_init(&obj.trigger_drawing, NULL);
pthread_mutex_lock(&obj.trigger_drawing_mutex);
while (1) { /* endless loop just for this show case */ interruptable_sleep(&obj, 20000); fprintf(stderr, "paint\n"); }
pthread_mutex_unlock(&obj.trigger_drawing_mutex);
pthread_cond_destroy(&obj.trigger_drawing); pthread_mutex_destroy(&obj.trigger_drawing_mutex); }
static void dispatcher() { while (1) { /* endless loop just for this show case */ usleep(15000); /* a substitute for "wait for request" */ fprintf(stderr, ">>> trigger\n"); trigger_drawing(&obj); fprintf(stderr, "<<< trigger\n"); } }
Ok, let's now assume that painter() is the code which thread A executes and dispatcher() is the code which thread B executes. Let's further assume that thread B accesses only a "valid" obj (i. e. while painter() is caught in it's endless loop).
The output should then look "like" the following:
paint paint
trigger
<<< trigger paint
trigger
paint <<< trigger
trigger
<<< trigger paint paint
The code is working for me in one case, but in another case I can reproduce an output like that:
paint paint
trigger
paint paint paint paint
I. e., thread B get's stuck in trigger_drawing() when trying to lock the mutex.
But I have no idea, why this can happen. Is there anything obvious to you in the above code, which I didn't take into account?
Thanks in advance.
Bye.