This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "aesop Repository".
The branch, master has been updated
via 58a249df053b173cee4566e5aed9912218030668 (commit)
from dac27478084d79f383365e22443d06acd792ea51 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 58a249df053b173cee4566e5aed9912218030668
Author: Kevin Harms <harms(a)alcf.anl.gov>
Date: Mon Apr 9 16:21:38 2012 -0500
Support polling mode in the SSM module
-----------------------------------------------------------------------
Summary of changes:
src/ssm/aessm.ae | 84 +++++++++-
src/ssm/aessm.hae | 10 +-
src/ssm/test/module.mk.in | 3 +-
src/ssm/test/polling.ae | 411 +++++++++++++++++++++++++++++++++++++++++++++
src/ssm/test/ssmget.ae | 4 +-
src/ssm/test/ssmmsg.ae | 4 +-
src/ssm/test/ssmping.ae | 4 +-
src/ssm/test/ssmput.ae | 4 +-
8 files changed, 507 insertions(+), 17 deletions(-)
create mode 100644 src/ssm/test/polling.ae
Diff of changes:
diff --git a/src/ssm/aessm.ae b/src/ssm/aessm.ae
index c897665..3f37a74 100644
--- a/src/ssm/aessm.ae
+++ b/src/ssm/aessm.ae
@@ -7,7 +7,7 @@
#include "aesop.h"
#include "ae-error.h"
#include "resources/resourcebuilder/resourcebuilder.hae"
-#include "aessm.hae"
+#include "src/ssm/aessm.hae"
#include "ssm.h"
#include "ssmdef.h"
@@ -535,7 +535,7 @@ __blocking int aessm_wait (ssm_me_id me_id, ssm_evt_p evt_id)
}
/*
- * Function: aessm_poll
+ * Function: aessm_thread
* This function calls ssm_wait in a loop from a dedicated thread.
*
* Parameters:
@@ -544,7 +544,7 @@ __blocking int aessm_wait (ssm_me_id me_id, ssm_evt_p evt_id)
* Returns:
* nothing.
*/
-static void * aessm_poll (void *arg)
+static void * aessm_thread (void *arg)
{
struct timeval tv;
aessm_t *aessm_id;
@@ -565,16 +565,58 @@ static void * aessm_poll (void *arg)
}
/*
+ * Function: aessm_poll
+ * This function is intended to be called by the aesop poller.
+ *
+ * Parameters:
+ * context - aesop internal context
+ * user_data - data provided in ae_resource_register
+ *
+ * Returns:
+ * AE_SUCCESS - poll was successful
+ */
+static int aessm_poll (ae_context_t context, void *user_data)
+{
+ struct timeval tv;
+ int rc;
+ aessm_t *aessm_id;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ aessm_id = (aessm_t*) user_data;
+
+ if (aessm_id->ssm == NULL) return AE_SUCCESS;
+
+ rc = ssm_wait(aessm_id->ssm, &tv);
+ assert(rc >= 0);
+
+ ae_resource_request_poll(context, aessm_id->resource_id);
+
+ return AE_SUCCESS;
+}
+
+/*
+ * Used for polling mode
+ */
+static struct ae_resource aessm_resource =
+{
+ .resource_name = "aessm",
+ .poll_context = aessm_poll
+};
+
+/*
* Function: aessm_initialize
* Initialize an SSM context, spawns a thread to push ssm_poll.
*
* Parameters:
* aessm_id - container for aessm data
+ * mode - progress mode AESSM_MODE_THREAD, AESSM_MODE_POLL
*
* Returns:
* AE_SUCCESS - on success
*/
-int aessm_initialize (aessm_t *aessm_id)
+int aessm_initialize (aessm_t *aessm_id, aessm_progress_mode_t mode)
{
ssmp_localmem_init_id id;
ssm_net_proc np;
@@ -591,9 +633,24 @@ int aessm_initialize (aessm_t *aessm_id)
aessm_id->laddr_id = la;
aessm_id->ssm = ssm_start(np, la, fl, NULL);
aessm_id->state = 1;
+ aessm_id->mode = mode;
- rc = pthread_create(&aessm_id->thread_id, NULL, aessm_poll, aessm_id);
- assert(rc == 0);
+ if (mode == AESSM_MODE_THREAD)
+ {
+ rc = pthread_create(&aessm_id->thread_id, NULL, aessm_thread, aessm_id);
+ assert(rc == 0);
+ }
+ else if (mode == AESSM_MODE_POLL)
+ {
+ ae_resource_register_with_data(&aessm_resource,
+ &aessm_id->resource_id,
+ aessm_id);
+ ae_resource_request_poll(NULL, aessm_id->resource_id);
+ }
+ else
+ {
+ assert(0);
+ }
return AE_SUCCESS;
}
@@ -611,9 +668,22 @@ int aessm_initialize (aessm_t *aessm_id)
int aessm_finalize (aessm_t *aessm_id)
{
aessm_id->state = 0;
- pthread_join(aessm_id->thread_id, NULL);
+
+ if (aessm_id->mode == AESSM_MODE_THREAD)
+ {
+ pthread_join(aessm_id->thread_id, NULL);
+ }
+ else if (aessm_id->mode == AESSM_MODE_POLL)
+ {
+ ae_resource_unregister(aessm_id->resource_id);
+ }
+ else
+ {
+ assert(0);
+ }
ssm_stop(aessm_id->ssm);
+ aessm_id->ssm = NULL;
SSM_DELETE(aessm_id->laddr_id);
return AE_SUCCESS;
diff --git a/src/ssm/aessm.hae b/src/ssm/aessm.hae
index c510ec5..f2319ac 100644
--- a/src/ssm/aessm.hae
+++ b/src/ssm/aessm.hae
@@ -11,15 +11,23 @@
#include "ssmdef.h"
#include <pthread.h>
+typedef enum aessm_progress_mode_e
+{
+ AESSM_MODE_POLL,
+ AESSM_MODE_THREAD
+} aessm_progress_mode_t;
+
typedef struct aessm_s
{
ssm_id ssm;
ssm_addr_id laddr_id;
pthread_t thread_id;
int state;
+ aessm_progress_mode_t mode;
+ int resource_id;
} aessm_t;
-int aessm_initalize (aessm_t *aessm_id);
+int aessm_initalize (aessm_t *aessm_id, aessm_progress_mode_t mode);
int aessm_finalize (aessm_t *aessm_id);
int aessm_link (ssm_id ssm, ssm_flags16 flags,
diff --git a/src/ssm/test/module.mk.in b/src/ssm/test/module.mk.in
index f572936..2328919 100644
--- a/src/ssm/test/module.mk.in
+++ b/src/ssm/test/module.mk.in
@@ -5,6 +5,7 @@ ifeq ($(BUILD_SSM),1)
AETESTSRC += $(DIR)/ssmput.ae \
$(DIR)/ssmget.ae \
$(DIR)/ssmmsg.ae \
- $(DIR)/ssmping.ae
+ $(DIR)/ssmping.ae \
+ $(DIR)/polling.ae
endif
diff --git a/src/ssm/test/polling.ae b/src/ssm/test/polling.ae
new file mode 100644
index 0000000..0e53104
--- /dev/null
+++ b/src/ssm/test/polling.ae
@@ -0,0 +1,411 @@
+/*
+ * (C) 2009 The University of Chicago
+ *
+ * See COPYRIGHT in top-level directory.
+ */
+
+#include <aesop/aesop.h>
+#include <aesop/aesop-support.hae>
+#include <aesop/aessm.hae>
+
+#define DATAVAL 0xffbaffabffbaffab
+
+/*
+ * Put
+ */
+__blocking int test_put(void)
+{
+ aessm_t ssm1;
+ ssm_me_id me1;
+ ssm_iovec_t iovec1;
+ uint64_t data1 = 0;
+ ssm_evt_t evt1;
+ int rc1;
+
+ aessm_t ssm2;
+ ssm_me_id me2;
+ ssm_iovec_t iovec2;
+ uint64_t data2 = DATAVAL;
+ ssm_evt_t evt2;
+ int rc2;
+
+ // publish buffer
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_POLL);
+ assert(rc1 == AE_SUCCESS);
+
+ iovec1.data = &data1;
+ iovec1.len = sizeof(data1);
+ iovec1.next = NULL;
+
+ rc1 = aessm_link (ssm1.ssm,
+ 0,
+ 0x1234,
+ 0,
+ &iovec1,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 1,
+ &me1);
+ assert(rc1 == AE_SUCCESS);
+
+ pwait
+ {
+ // wait for put
+ pbranch
+ {
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_wait (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+ assert(data1 == DATAVAL);
+
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_unlink (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+
+ rc1 = aessm_finalize(&ssm1);
+ assert(rc1 == AE_SUCCESS);
+ }
+
+ // post put to remote
+ pbranch
+ {
+ memset(&evt2, 0, sizeof(evt2));
+
+ iovec2.data = &data2;
+ iovec2.len = sizeof(data2);
+ iovec2.next = NULL;
+
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_POLL);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_link (ssm2.ssm,
+ SSM_ME_SEND_ONLY,
+ 0x1234,
+ 0,
+ &iovec2,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 0,
+ &me2);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_put(me2, ssm1.laddr_id, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+ assert(data2 == DATAVAL);
+
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_unlink(me2, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+
+ rc2 = aessm_finalize(&ssm2);
+ assert(rc2 == AE_SUCCESS);
+ }
+ }
+
+ printf("PUT SUCCESS\n");
+ return 0;
+
+}
+
+/*
+ * Get
+ */
+__blocking int test_get (void)
+{
+ aessm_t ssm1;
+ ssm_me_id me1;
+ ssm_iovec_t iovec1;
+ uint64_t data1 = DATAVAL;
+ ssm_evt_t evt1;
+ int rc1;
+
+ aessm_t ssm2;
+ ssm_me_id me2;
+ ssm_iovec_t iovec2;
+ uint64_t data2 = 0;
+ ssm_evt_t evt2;
+ int rc2;
+
+
+ // publish buffer to get from
+
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_POLL);
+ assert(rc1 == AE_SUCCESS);
+
+ iovec1.data = &data1;
+ iovec1.len = sizeof(data1);
+ iovec1.next = NULL;
+
+ rc1 = aessm_link (ssm1.ssm,
+ 0,
+ 0x1234,
+ 0,
+ &iovec1,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 1,
+ &me1);
+ assert(rc1 == AE_SUCCESS);
+
+ pwait
+ {
+ // wait for get
+ pbranch
+ {
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_wait (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+ assert(data1 == DATAVAL);
+
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_unlink (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+
+ rc1 = aessm_finalize(&ssm1);
+ assert(rc1 == AE_SUCCESS);
+ }
+
+ // get from remote
+ pbranch
+ {
+ memset(&evt2, 0, sizeof(evt2));
+
+ iovec2.data = &data2;
+ iovec2.len = sizeof(data2);
+ iovec2.next = NULL;
+
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_POLL);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_link (ssm2.ssm,
+ //SSM_ME_SEND_ONLY, // this should work?
+ 0,
+ 0x1234,
+ 0,
+ &iovec2,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 0,
+ &me2);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_get(me2, ssm1.laddr_id, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+ assert(data2 == DATAVAL);
+
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_unlink(me2, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+
+ rc2 = aessm_finalize(&ssm2);
+ assert(rc2 == AE_SUCCESS);
+ }
+ }
+
+ printf("GET SUCCESS\n");
+ return 0;
+}
+
+/*
+ * Msg
+ */
+__blocking int test_msg (void)
+{
+ aessm_t ssm1;
+ ssm_me_id me1;
+ ssm_evt_t evt1;
+ int rc1;
+
+ aessm_t ssm2;
+ ssm_me_id me2;
+ ssm_evt_t evt2;
+ int rc2;
+
+ // publish match for msg
+
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_POLL);
+ assert(rc1 == AE_SUCCESS);
+
+ rc1 = aessm_link (ssm1.ssm,
+ 0,
+ 0x1234,
+ 0,
+ NULL,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 1,
+ &me1);
+ assert(rc1 == AE_SUCCESS);
+
+ pwait
+ {
+ // wait for match
+ pbranch
+ {
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_wait (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+ assert(evt1.info_a == DATAVAL);
+ assert(evt1.info_b == ~DATAVAL);
+
+ memset(&evt1, 0, sizeof(evt1));
+
+ rc1 = aessm_unlink (me1, &evt1);
+ assert(rc1 == AE_SUCCESS);
+ assert(evt1.result == SSM_RESULT_SUCCESS);
+
+ rc1 = aessm_finalize(&ssm1);
+ assert(rc1 == AE_SUCCESS);
+ }
+
+ // post msg to remote
+ pbranch
+ {
+ uint64_t dataA = DATAVAL;
+ uint64_t dataB = ~DATAVAL;
+
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_POLL);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_link (ssm2.ssm,
+ SSM_ME_SEND_ONLY,
+ 0x1234,
+ 0,
+ NULL,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 0,
+ &me2);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_msg(me2, ssm1.laddr_id, dataA, dataB, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+ assert(dataA == DATAVAL);
+ assert(dataB == ~DATAVAL);
+
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_unlink(me2, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+
+ rc2 = aessm_finalize(&ssm2);
+ assert(rc2 == AE_SUCCESS);
+ }
+ }
+
+ printf("MSG SUCCESS\n");
+ return 0;
+}
+
+/*
+ * Ping
+ */
+__blocking int test_ping (void)
+{
+ aessm_t ssm1;
+ int rc1;
+
+ aessm_t ssm2;
+ ssm_me_id me2;
+ ssm_evt_t evt2;
+ int rc2;
+
+ // initialize for ping
+
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_POLL);
+ assert(rc1 == AE_SUCCESS);
+
+ pwait
+ {
+ // wait for ping
+ pbranch
+ {
+ aesop_timer(1000);
+
+ rc1 = aessm_finalize(&ssm1);
+ assert(rc1 == AE_SUCCESS);
+ }
+
+ // post ping to remote
+ pbranch
+ {
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_POLL);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_link (ssm2.ssm,
+ //SSM_ME_SEND_ONLY,
+ 0,
+ 0,
+ 0,
+ NULL,
+ SSM_ME_POS_HEAD,
+ SSM_ME_NONE,
+ 0,
+ &me2);
+ assert(rc2 == AE_SUCCESS);
+
+ rc2 = aessm_ping(me2, ssm1.laddr_id, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+
+ memset(&evt2, 0, sizeof(evt2));
+
+ rc2 = aessm_unlink(me2, &evt2);
+ assert(rc2 == AE_SUCCESS);
+ assert(evt2.result == SSM_RESULT_SUCCESS);
+
+ rc2 = aessm_finalize(&ssm2);
+ assert(rc2 == AE_SUCCESS);
+ }
+ }
+
+ printf("PING SUCCESS\n");
+ return 0;
+}
+
+
+/*
+ * This test demonstrates a put into a remote buffer.
+ */
+__blocking int test_main (int argc, char **argv)
+{
+ test_put();
+ test_get();
+ test_msg();
+ test_ping();
+
+ return 0;
+}
+
+aesop_main_set(test_main);
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * End:
+ *
+ * vim: ft=c ts=8 sts=4 sw=4 expandtab
+ */
diff --git a/src/ssm/test/ssmget.ae b/src/ssm/test/ssmget.ae
index fe6d5d7..562dbd4 100644
--- a/src/ssm/test/ssmget.ae
+++ b/src/ssm/test/ssmget.ae
@@ -32,7 +32,7 @@ static __blocking int test_main (int argc, char **argv)
// publish buffer to get from
- rc1 = aessm_initialize(&ssm1);
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_THREAD);
assert(rc1 == AE_SUCCESS);
iovec1.data = &data1;
@@ -81,7 +81,7 @@ static __blocking int test_main (int argc, char **argv)
iovec2.len = sizeof(data2);
iovec2.next = NULL;
- rc2 = aessm_initialize(&ssm2);
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_THREAD);
assert(rc2 == AE_SUCCESS);
rc2 = aessm_link (ssm2.ssm,
diff --git a/src/ssm/test/ssmmsg.ae b/src/ssm/test/ssmmsg.ae
index f20312c..d8e1118 100644
--- a/src/ssm/test/ssmmsg.ae
+++ b/src/ssm/test/ssmmsg.ae
@@ -27,7 +27,7 @@ static __blocking int test_main (int argc, char **argv)
// publish match for msg
- rc1 = aessm_initialize(&ssm1);
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_THREAD);
assert(rc1 == AE_SUCCESS);
rc1 = aessm_link (ssm1.ssm,
@@ -72,7 +72,7 @@ static __blocking int test_main (int argc, char **argv)
memset(&evt2, 0, sizeof(evt2));
- rc2 = aessm_initialize(&ssm2);
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_THREAD);
assert(rc2 == AE_SUCCESS);
rc2 = aessm_link (ssm2.ssm,
diff --git a/src/ssm/test/ssmping.ae b/src/ssm/test/ssmping.ae
index 967ee4b..e937f5c 100644
--- a/src/ssm/test/ssmping.ae
+++ b/src/ssm/test/ssmping.ae
@@ -23,7 +23,7 @@ static __blocking int test_main (int argc, char **argv)
// initialize for ping
- rc1 = aessm_initialize(&ssm1);
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_THREAD);
assert(rc1 == AE_SUCCESS);
pwait
@@ -42,7 +42,7 @@ static __blocking int test_main (int argc, char **argv)
{
memset(&evt2, 0, sizeof(evt2));
- rc2 = aessm_initialize(&ssm2);
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_THREAD);
assert(rc2 == AE_SUCCESS);
rc2 = aessm_link (ssm2.ssm,
diff --git a/src/ssm/test/ssmput.ae b/src/ssm/test/ssmput.ae
index 775c1ed..54b9270 100644
--- a/src/ssm/test/ssmput.ae
+++ b/src/ssm/test/ssmput.ae
@@ -33,7 +33,7 @@ static __blocking int test_main (int argc, char **argv)
// publish buffer
- rc1 = aessm_initialize(&ssm1);
+ rc1 = aessm_initialize(&ssm1, AESSM_MODE_THREAD);
assert(rc1 == AE_SUCCESS);
iovec1.data = &data1;
@@ -80,7 +80,7 @@ static __blocking int test_main (int argc, char **argv)
iovec2.len = sizeof(data2);
iovec2.next = NULL;
- rc2 = aessm_initialize(&ssm2);
+ rc2 = aessm_initialize(&ssm2, AESSM_MODE_THREAD);
assert(rc2 == AE_SUCCESS);
rc2 = aessm_link (ssm2.ssm,
hooks/post-receive
--
aesop Repository