|
|
@ -668,13 +668,31 @@ int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) ( |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void thr_info_cancel(struct thr_info *thr) |
|
|
|
void thr_info_freeze(struct thr_info *thr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
struct tq_ent *ent, *iter; |
|
|
|
|
|
|
|
struct thread_q *tq; |
|
|
|
|
|
|
|
|
|
|
|
if (!thr) |
|
|
|
if (!thr) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
if (thr->q) |
|
|
|
tq = thr->q; |
|
|
|
tq_freeze(thr->q); |
|
|
|
if (!tq) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&tq->mutex); |
|
|
|
|
|
|
|
tq->frozen = true; |
|
|
|
|
|
|
|
list_for_each_entry_safe(ent, iter, &tq->q, q_node) { |
|
|
|
|
|
|
|
list_del(&ent->q_node); |
|
|
|
|
|
|
|
free(ent); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
mutex_unlock(&tq->mutex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void thr_info_cancel(struct thr_info *thr) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (!thr) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
if (PTH(thr) != 0L) { |
|
|
|
if (PTH(thr) != 0L) { |
|
|
|
pthread_cancel(thr->pth); |
|
|
|
pthread_cancel(thr->pth); |
|
|
|