It is possible to have a "standard" progress thread, so simplify the usage of the opal_progress_thread code.
This commit was SVN r32277.
Этот коммит содержится в:
родитель
2f579806ae
Коммит
c1bb5b68d0
@ -23,6 +23,7 @@ typedef struct {
|
|||||||
opal_list_item_t super;
|
opal_list_item_t super;
|
||||||
char *name;
|
char *name;
|
||||||
opal_event_base_t *ev_base;
|
opal_event_base_t *ev_base;
|
||||||
|
volatile bool ev_active;
|
||||||
bool block_active;
|
bool block_active;
|
||||||
opal_event_t block;
|
opal_event_t block;
|
||||||
bool engine_defined;
|
bool engine_defined;
|
||||||
@ -33,6 +34,7 @@ static void trkcon(opal_progress_tracker_t *p)
|
|||||||
{
|
{
|
||||||
p->name = NULL;
|
p->name = NULL;
|
||||||
p->ev_base = NULL;
|
p->ev_base = NULL;
|
||||||
|
p->ev_active = true;
|
||||||
p->block_active = false;
|
p->block_active = false;
|
||||||
p->engine_defined = false;
|
p->engine_defined = false;
|
||||||
p->pipe[0] = -1;
|
p->pipe[0] = -1;
|
||||||
@ -74,10 +76,17 @@ static void wakeup(int fd, short args, void *cbdata)
|
|||||||
* it so we don't try to delete it again */
|
* it so we don't try to delete it again */
|
||||||
trk->block_active = false;
|
trk->block_active = false;
|
||||||
}
|
}
|
||||||
|
static void* progress_engine(opal_object_t *obj)
|
||||||
|
{
|
||||||
|
opal_progress_tracker_t *trk = (opal_progress_tracker_t*)obj;
|
||||||
|
|
||||||
|
while (trk->ev_active) {
|
||||||
|
opal_event_loop(trk->ev_base, OPAL_EVLOOP_ONCE);
|
||||||
|
}
|
||||||
|
return OPAL_THREAD_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
opal_event_base_t *opal_start_progress_thread(char *name,
|
opal_event_base_t *opal_start_progress_thread(char *name,
|
||||||
opal_thread_fn_t func,
|
|
||||||
bool create_block)
|
bool create_block)
|
||||||
{
|
{
|
||||||
opal_progress_tracker_t *trk;
|
opal_progress_tracker_t *trk;
|
||||||
@ -115,7 +124,8 @@ opal_event_base_t *opal_start_progress_thread(char *name,
|
|||||||
OBJ_CONSTRUCT(&trk->engine, opal_thread_t);
|
OBJ_CONSTRUCT(&trk->engine, opal_thread_t);
|
||||||
trk->engine_defined = true;
|
trk->engine_defined = true;
|
||||||
/* fork off a thread to progress it */
|
/* fork off a thread to progress it */
|
||||||
trk->engine.t_run = func;
|
trk->engine.t_run = progress_engine;
|
||||||
|
trk->engine.t_arg = trk;
|
||||||
if (OPAL_SUCCESS != (rc = opal_thread_start(&trk->engine))) {
|
if (OPAL_SUCCESS != (rc = opal_thread_start(&trk->engine))) {
|
||||||
OPAL_ERROR_LOG(rc);
|
OPAL_ERROR_LOG(rc);
|
||||||
OBJ_RELEASE(trk);
|
OBJ_RELEASE(trk);
|
||||||
@ -142,15 +152,18 @@ void opal_stop_progress_thread(char *name, bool cleanup)
|
|||||||
/* find the specified engine */
|
/* find the specified engine */
|
||||||
OPAL_LIST_FOREACH(trk, &tracking, opal_progress_tracker_t) {
|
OPAL_LIST_FOREACH(trk, &tracking, opal_progress_tracker_t) {
|
||||||
if (0 == strcmp(name, trk->name)) {
|
if (0 == strcmp(name, trk->name)) {
|
||||||
|
/* mark it as inactive */
|
||||||
|
trk->ev_active = false;
|
||||||
|
/* break the event loop - this will cause the loop to exit
|
||||||
|
* upon completion of any current event */
|
||||||
|
opal_event_base_loopbreak(trk->ev_base);
|
||||||
/* if present, use the block to break it loose just in
|
/* if present, use the block to break it loose just in
|
||||||
* case the thread is blocking in a call to select for
|
* case the thread is blocked in a call to select for
|
||||||
* a long time */
|
* a long time */
|
||||||
if (trk->block_active) {
|
if (trk->block_active) {
|
||||||
i=1;
|
i=1;
|
||||||
write(trk->pipe[1], &i, sizeof(int));
|
write(trk->pipe[1], &i, sizeof(int));
|
||||||
}
|
}
|
||||||
/* break the event loop */
|
|
||||||
opal_event_base_loopbreak(trk->ev_base);
|
|
||||||
/* wait for thread to exit */
|
/* wait for thread to exit */
|
||||||
opal_thread_join(&trk->engine, NULL);
|
opal_thread_join(&trk->engine, NULL);
|
||||||
/* cleanup, if they indicated they are done with this event base */
|
/* cleanup, if they indicated they are done with this event base */
|
||||||
|
@ -14,13 +14,12 @@
|
|||||||
|
|
||||||
#include "opal/mca/event/event.h"
|
#include "opal/mca/event/event.h"
|
||||||
|
|
||||||
/* start a progress thread using the given function, assigning
|
/* start a progress thread, assigning it the provided name for
|
||||||
* it the provided name for tracking purposes. This function will
|
* tracking purposes. If create_block is true, then this function
|
||||||
* also create a pipe so that libevent has something to block
|
* will also create a pipe so that libevent has something to block
|
||||||
* against, thus keeping the thread from free-running
|
* against, thus keeping the thread from free-running
|
||||||
*/
|
*/
|
||||||
OPAL_DECLSPEC opal_event_base_t *opal_start_progress_thread(char *name,
|
OPAL_DECLSPEC opal_event_base_t *opal_start_progress_thread(char *name,
|
||||||
opal_thread_fn_t func,
|
|
||||||
bool create_block);
|
bool create_block);
|
||||||
|
|
||||||
/* stop the progress thread of the provided name. This function will
|
/* stop the progress thread of the provided name. This function will
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user