Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
margo
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
12
Issues
12
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
sds
margo
Commits
4a462732
Commit
4a462732
authored
Jan 18, 2018
by
Matthieu Dorier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev-remote-shutdown' into 'master'
added shutdown feature See merge request
!3
parents
30521c87
17586bb7
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
87 additions
and
1 deletion
+87
-1
margo.h
include/margo.h
+21
-0
margo.c
src/margo.c
+66
-1
No files found.
include/margo.h
View file @
4a462732
...
@@ -117,6 +117,27 @@ void margo_push_finalize_callback(
...
@@ -117,6 +117,27 @@ void margo_push_finalize_callback(
void
(
*
cb
)(
void
*
),
void
(
*
cb
)(
void
*
),
void
*
uargs
);
void
*
uargs
);
/**
* Allows the passed Margo instance to be shut down remotely
* using margo_shutdown_remote_instance().
*
* @param mid Margo instance
*/
void
margo_enable_remote_shutdown
(
margo_instance_id
mid
);
/**
* Trigger the shutdown of the Margo instance running
* at remote_addr.
*
* @param mid Local Margo instance
* @param remote_addr Address of the Margo instance to shut down.
*
* @return 0 on success, -1 on failure.
*/
int
margo_shutdown_remote_instance
(
margo_instance_id
mid
,
hg_addr_t
remote_addr
);
/**
/**
* Registers an RPC with margo
* Registers an RPC with margo
*
*
...
...
src/margo.c
View file @
4a462732
...
@@ -98,6 +98,10 @@ struct margo_instance
...
@@ -98,6 +98,10 @@ struct margo_instance
ABT_cond
finalize_cond
;
ABT_cond
finalize_cond
;
struct
margo_finalize_cb
*
finalize_cb
;
struct
margo_finalize_cb
*
finalize_cb
;
/* control logic for shutting down */
hg_id_t
shutdown_rpc_id
;
int
enable_remote_shutdown
;
/* timer data */
/* timer data */
struct
margo_timer_list
*
timer_list
;
struct
margo_timer_list
*
timer_list
;
...
@@ -129,8 +133,12 @@ struct margo_rpc_data
...
@@ -129,8 +133,12 @@ struct margo_rpc_data
void
(
*
user_free_callback
)(
void
*
);
void
(
*
user_free_callback
)(
void
*
);
};
};
MERCURY_GEN_PROC
(
margo_shutdown_out_t
,
((
int32_t
)(
ret
)))
static
void
hg_progress_fn
(
void
*
foo
);
static
void
hg_progress_fn
(
void
*
foo
);
static
void
margo_rpc_data_free
(
void
*
ptr
);
static
void
margo_rpc_data_free
(
void
*
ptr
);
static
void
remote_shutdown_ult
(
hg_handle_t
handle
);
DECLARE_MARGO_RPC_HANDLER
(
remote_shutdown_ult
);
static
hg_return_t
margo_handle_cache_init
(
margo_instance_id
mid
);
static
hg_return_t
margo_handle_cache_init
(
margo_instance_id
mid
);
static
void
margo_handle_cache_destroy
(
margo_instance_id
mid
);
static
void
margo_handle_cache_destroy
(
margo_instance_id
mid
);
...
@@ -278,7 +286,7 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
...
@@ -278,7 +286,7 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
hg_return_t
hret
;
hg_return_t
hret
;
struct
margo_instance
*
mid
;
struct
margo_instance
*
mid
;
mid
=
malloc
(
sizeof
(
*
mid
));
mid
=
calloc
(
1
,
sizeof
(
*
mid
));
if
(
!
mid
)
goto
err
;
if
(
!
mid
)
goto
err
;
memset
(
mid
,
0
,
sizeof
(
*
mid
));
memset
(
mid
,
0
,
sizeof
(
*
mid
));
...
@@ -293,6 +301,7 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
...
@@ -293,6 +301,7 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
mid
->
mplex_table
=
NULL
;
mid
->
mplex_table
=
NULL
;
mid
->
refcount
=
1
;
mid
->
refcount
=
1
;
mid
->
finalize_cb
=
NULL
;
mid
->
finalize_cb
=
NULL
;
mid
->
enable_remote_shutdown
=
0
;
mid
->
timer_list
=
margo_timer_list_create
();
mid
->
timer_list
=
margo_timer_list_create
();
if
(
mid
->
timer_list
==
NULL
)
goto
err
;
if
(
mid
->
timer_list
==
NULL
)
goto
err
;
...
@@ -305,6 +314,9 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
...
@@ -305,6 +314,9 @@ margo_instance_id margo_init_pool(ABT_pool progress_pool, ABT_pool handler_pool,
ABT_THREAD_ATTR_NULL
,
&
mid
->
hg_progress_tid
);
ABT_THREAD_ATTR_NULL
,
&
mid
->
hg_progress_tid
);
if
(
ret
!=
0
)
goto
err
;
if
(
ret
!=
0
)
goto
err
;
mid
->
shutdown_rpc_id
=
MARGO_REGISTER
(
mid
,
"__shutdown__"
,
void
,
margo_shutdown_out_t
,
remote_shutdown_ult
);
return
mid
;
return
mid
;
err:
err:
...
@@ -471,6 +483,42 @@ hg_id_t margo_register_name(margo_instance_id mid, const char *func_name,
...
@@ -471,6 +483,42 @@ hg_id_t margo_register_name(margo_instance_id mid, const char *func_name,
return
(
id
);
return
(
id
);
}
}
void
margo_enable_remote_shutdown
(
margo_instance_id
mid
)
{
mid
->
enable_remote_shutdown
=
1
;
}
int
margo_shutdown_remote_instance
(
margo_instance_id
mid
,
hg_addr_t
remote_addr
)
{
hg_return_t
hret
;
hg_handle_t
handle
;
hret
=
margo_create
(
mid
,
remote_addr
,
mid
->
shutdown_rpc_id
,
&
handle
);
if
(
hret
!=
HG_SUCCESS
)
return
-
1
;
hret
=
margo_forward
(
handle
,
NULL
);
if
(
hret
!=
HG_SUCCESS
)
{
margo_destroy
(
handle
);
return
-
1
;
}
margo_shutdown_out_t
out
;
hret
=
margo_get_output
(
handle
,
&
out
);
if
(
hret
!=
HG_SUCCESS
)
{
margo_destroy
(
handle
);
return
-
1
;
}
margo_destroy
(
handle
);
return
out
.
ret
;
}
hg_id_t
margo_register_name_mplex
(
margo_instance_id
mid
,
const
char
*
func_name
,
hg_id_t
margo_register_name_mplex
(
margo_instance_id
mid
,
const
char
*
func_name
,
hg_proc_cb_t
in_proc_cb
,
hg_proc_cb_t
out_proc_cb
,
hg_rpc_cb_t
rpc_cb
,
hg_proc_cb_t
in_proc_cb
,
hg_proc_cb_t
out_proc_cb
,
hg_rpc_cb_t
rpc_cb
,
uint8_t
mplex_id
,
ABT_pool
pool
)
uint8_t
mplex_id
,
ABT_pool
pool
)
...
@@ -1452,3 +1500,20 @@ struct margo_timer_list *margo_get_timer_list(margo_instance_id mid)
...
@@ -1452,3 +1500,20 @@ struct margo_timer_list *margo_get_timer_list(margo_instance_id mid)
{
{
return
mid
->
timer_list
;
return
mid
->
timer_list
;
}
}
static
void
remote_shutdown_ult
(
hg_handle_t
handle
)
{
margo_instance_id
mid
=
margo_hg_handle_get_instance
(
handle
);
margo_shutdown_out_t
out
;
if
(
!
(
mid
->
enable_remote_shutdown
))
{
out
.
ret
=
-
1
;
}
else
{
out
.
ret
=
0
;
}
margo_respond
(
handle
,
&
out
);
margo_destroy
(
handle
);
if
(
mid
->
enable_remote_shutdown
)
{
margo_finalize
(
mid
);
}
}
DEFINE_MARGO_RPC_HANDLER
(
remote_shutdown_ult
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment