Added prealloced buffer init call (ompi_buffer_init_preallocated())
and updated the unit test for this. - This call is for use by the OOB device so it can pass the pack/buffer system memory. This removes the peek-recv race condition. This commit was SVN r2105.
Этот коммит содержится в:
родитель
0bfa0d1f12
Коммит
fdc4ab5da0
@ -133,6 +133,75 @@ size_t isize = 0;
|
|||||||
return (OMPI_SUCCESS);
|
return (OMPI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function creates a buffer using USER allocated memory
|
||||||
|
*
|
||||||
|
* users can then pack MORE into this buffer if needed
|
||||||
|
* as the buffer is managed, we grow it as needed
|
||||||
|
*
|
||||||
|
* the user should not free the memory handed to the buffer
|
||||||
|
* this will be done by buffer_free
|
||||||
|
*
|
||||||
|
* This routine is really only used by the OOB
|
||||||
|
*
|
||||||
|
* @param pointer to new buffer handle (OUT)
|
||||||
|
* @param pointer to USER allocated memory (IN)
|
||||||
|
* @param to initial USER memory allocated length (IN)
|
||||||
|
*
|
||||||
|
* @retval OMPI_SUCCESS
|
||||||
|
* @retval OMPI_ERROR
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ompi_buffer_init_preallocated (ompi_buffer_t *buffer, void *usermemory,
|
||||||
|
size_t usermemorylen)
|
||||||
|
{
|
||||||
|
ompi_buffer_internal_t* bptr;
|
||||||
|
|
||||||
|
/* check that we can return a buffer atall.. */
|
||||||
|
if (!buffer) { return (OMPI_ERROR); }
|
||||||
|
|
||||||
|
/* check that we have a valid user memory buffer atall.. */
|
||||||
|
if (!usermemory) { return (OMPI_ERROR); }
|
||||||
|
|
||||||
|
/* check the requested initial size */
|
||||||
|
if (usermemorylen<0) { return (OMPI_ERROR); }
|
||||||
|
|
||||||
|
/* create new buffer object */
|
||||||
|
bptr = (ompi_buffer_internal_t *) OBJ_NEW (ompi_buffer_internal_t);
|
||||||
|
|
||||||
|
if (!bptr) { return (OMPI_ERROR); }
|
||||||
|
|
||||||
|
ompi_buffer_cnts++;
|
||||||
|
|
||||||
|
|
||||||
|
/* we have a buffer now, so lets populate it */
|
||||||
|
|
||||||
|
/* allocate initial buffer space */
|
||||||
|
|
||||||
|
bptr->base_ptr = usermemory; /* set the start of the buffer */
|
||||||
|
|
||||||
|
/* set data pointer to END of the buffer */
|
||||||
|
bptr->data_ptr = ((char*)bptr->base_ptr) + usermemorylen;
|
||||||
|
|
||||||
|
bptr->from_ptr = bptr->base_ptr; /* set the unpack start at start */
|
||||||
|
|
||||||
|
/* set counts for size and space */
|
||||||
|
bptr->size = usermemorylen;
|
||||||
|
bptr->len = usermemorylen; /* users buffer is expected 2 be full */
|
||||||
|
bptr->space = 0; /* ditto */
|
||||||
|
bptr->toend = usermemorylen; /* ditto */
|
||||||
|
bptr->cnt = ompi_buffer_cnts;
|
||||||
|
|
||||||
|
/* ok, all is well, return the buffer back to the user */
|
||||||
|
*buffer = bptr;
|
||||||
|
|
||||||
|
return (OMPI_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function gets the size of packed data in an ompi_buffer
|
* This function gets the size of packed data in an ompi_buffer
|
||||||
*
|
*
|
||||||
|
@ -62,6 +62,29 @@ extern "C" {
|
|||||||
|
|
||||||
int ompi_buffer_init (ompi_buffer_t *buffer, size_t reqinitsize);
|
int ompi_buffer_init (ompi_buffer_t *buffer, size_t reqinitsize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function creates a buffer using USER allocated memory
|
||||||
|
*
|
||||||
|
* users can then pack MORE into this buffer if needed
|
||||||
|
* as the buffer is managed, we grow it as needed
|
||||||
|
*
|
||||||
|
* the user should not free the memory handed to the buffer
|
||||||
|
* this will be done by buffer_free
|
||||||
|
*
|
||||||
|
* This routine is really only used by the OOB
|
||||||
|
*
|
||||||
|
* @param pointer to new buffer handle (OUT)
|
||||||
|
* @param pointer to USER allocated memory (IN)
|
||||||
|
* @param to initial USER memory allocated length (IN)
|
||||||
|
*
|
||||||
|
* @retval OMPI_SUCCESS
|
||||||
|
* @retval OMPI_ERROR
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ompi_buffer_init_preallocated (ompi_buffer_t *buffer, void *usermemory, size_t usermemorylen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function gets the size of packed data in a ompi_buffer
|
* This function gets the size of packed data in a ompi_buffer
|
||||||
*
|
*
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
|
||||||
#include "ompi_config.h"
|
#include "ompi_config.h"
|
||||||
#include "util/sys_info.h"
|
#include "util/sys_info.h"
|
||||||
@ -26,7 +28,8 @@ static bool test2(void); /* verify we can pack ok */
|
|||||||
static bool test3(void); /* verify we can pack expanding buf */
|
static bool test3(void); /* verify we can pack expanding buf */
|
||||||
static bool test4(void); /* verify pack a packed buffer */
|
static bool test4(void); /* verify pack a packed buffer */
|
||||||
static bool test5(void); /* verify unpack */
|
static bool test5(void); /* verify unpack */
|
||||||
static bool test6(void); /* verity free */
|
static bool test6(void); /* verify free */
|
||||||
|
static bool test7(void); /* verify preallocated buffer init, pack and unpack */
|
||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
@ -75,6 +78,14 @@ int main ()
|
|||||||
test_failure("ompi_pack test6 failed");
|
test_failure("ompi_pack test6 failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (test7()) {
|
||||||
|
test_success();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
test_failure("ompi_pack test7 failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* if (testN()) { */
|
/* if (testN()) { */
|
||||||
/* test_success(); */
|
/* test_success(); */
|
||||||
/* } */
|
/* } */
|
||||||
@ -192,7 +203,7 @@ static bool test5(void) /* verify unpack */
|
|||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool test6(void) /* verity free */
|
static bool test6(void) /* verify free */
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@ -206,6 +217,53 @@ static bool test6(void) /* verity free */
|
|||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool test7(void) /* verify preallocated buffer init, pack and unpack */
|
||||||
|
{
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
int results[6];
|
||||||
|
int i, j, out;
|
||||||
|
char *mybuf;
|
||||||
|
int *p;
|
||||||
|
|
||||||
|
|
||||||
|
/* we cannot use heap/static memory for a buffer as it cannot be realloced as needed for this test */
|
||||||
|
mybuf = (char*) malloc (sizeof(int)*5);
|
||||||
|
p = (int*) mybuf;
|
||||||
|
for(i=0;i<5;i++) {
|
||||||
|
*p++ = htonl (i); /* the data must be in network byte order for this test to be valid */
|
||||||
|
/* as the test is emulating prepacked data recvd from the network (OOB) */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc = ompi_buffer_init_preallocated (&bufA, mybuf, sizeof(int)*5);
|
||||||
|
if (OMPI_ERROR==rc) { test_comment ("ompi_buffer_init_preallocated failed"); return(false);}
|
||||||
|
|
||||||
|
i = 5;
|
||||||
|
rc = ompi_pack (bufA, &i, 1, OMPI_INT32);
|
||||||
|
if (OMPI_ERROR==rc) { test_comment ("ompi_pack failed"); return(false);}
|
||||||
|
|
||||||
|
/* ok, now check its contents */
|
||||||
|
for (i=0;i<6;i++) {
|
||||||
|
j = i; /* for bufA */
|
||||||
|
rc = ompi_unpack (bufA, &out, 1, OMPI_INT32);
|
||||||
|
if (OMPI_ERROR==rc) { test_comment ("ompi_unpack failed"); return(false);}
|
||||||
|
|
||||||
|
if (out!=j) {
|
||||||
|
test_comment ("bufA packed != unpacked data");
|
||||||
|
printf("iteration %d expected %d have %d\n", i, j, out);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* I do not free mybuf as ompi_buffer_free() will */
|
||||||
|
|
||||||
|
rc = ompi_buffer_free (bufA);
|
||||||
|
if (OMPI_ERROR==rc) { test_comment ("ompi_buffer_free failed"); return(false);}
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
/* int dump_buf (ompi_buffer_t buf) */
|
/* int dump_buf (ompi_buffer_t buf) */
|
||||||
/* { */
|
/* { */
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user