[Spread-users] Sending to self via private group
John Schultz
jschultz at commedia.cnds.jhu.edu
Tue Aug 2 11:19:02 EDT 2005
Hey Luke,
It shouldn't make a difference whether or not the destination is connected
to a local or remote daemon, or if the destination process is on a local
or remote machine.
Just to be sure, I went ahead and modified that little test program (see
attachment) to use an infinite timeout select between sending and
receiving and it still worked. Maybe that can help you spot the problem.
My guess would be that the code is probably not managing its select() sets
properly, as select() can be a pretty funky fcn. Maybe you should try
modifying the code to use poll() instead?
---
John Schultz
Spread Concepts
Phn: 443 838 2200
On Mon, 1 Aug 2005, Luke wrote:
> I think I've misrepresented my problem a bit.
>
> Currently, I have one process (process A) running that needs to send a
> message to a private address, which may or may not be answered by the
> same process on the same machine. Currently, as long as the recipient
> is on another machine or part of a different process, it works fine.
> However, if the private address belongs to the same process on the same
> machine, the select call that waits on the spread mbox never activates
> (the mbox file descriptor is never activated).
>
> Creating a program similar to the one you attached works for me as well,
> with spread 3.17.3. The only issue I have is with the file descriptor
> not triggering.
>
> Can spread do this? Is there a workaround? I've compared the address
> to what spread returns from SP_connect's 5th arg, and they're identical.
> And, like I've said, the issue doesn't persist across processes or
> machines.
>
> Any help on this is much appreciated - other than this issue which has
> halted development, spread's been exceptionally easy to work with so
> far.
>
>
> --
> Luke
> secureboot at gmail.com
>
>
> _______________________________________________
> Spread-users mailing list
> Spread-users at lists.spread.org
> http://lists.spread.org/mailman/listinfo/spread-users
>
-------------- next part --------------
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sp.h>
#define MY_MAX_NUM_GROUPS 1000
#define MY_MAX_MSG_SIZE 100000
#define MY_MSGS_PER_PRINT 1000
int main(int argc, char **argv)
{
mailbox mbox;
char priv_name[MAX_GROUP_NAME];
service serv_type;
char sender[MAX_GROUP_NAME];
int num_groups;
char groups[MY_MAX_NUM_GROUPS][MAX_GROUP_NAME];
int16 mess_type;
int endian_mismatch;
char mess[MY_MAX_MSG_SIZE];
fd_set read_set;
fd_set except_set;
int ret;
unsigned i;
if ((ret = SP_connect("5555 at localhost", NULL, 0, 0, &mbox, priv_name)) != ACCEPT_SESSION) {
exit(fprintf(stderr, "SP_connect failed with %d\r\n", ret));
}
while (1) {
for (i = 0; i < MY_MSGS_PER_PRINT; ++i) {
if ((ret = SP_multicast(mbox, AGREED_MESS, priv_name, 0, 0, NULL)) != 0) {
exit(fprintf(stderr, "SP_multicast failed with %d\r\n", ret));
}
FD_ZERO(&read_set);
FD_ZERO(&except_set);
FD_SET(mbox, &read_set);
FD_SET(mbox, &except_set);
if ((ret = select(mbox + 1, &read_set, NULL, &except_set, NULL)) != 1) {
exit(fprintf(stderr, "select failed with error %d\r\n", ret));
}
if (FD_ISSET(mbox, &except_set)) {
exit(fprintf(stderr, "there is an error on the mbox!\r\n"));
}
if (!FD_ISSET(mbox, &read_set)) {
exit(fprintf(stderr, "select lied to us!\r\n"));
}
serv_type = 0;
if ((ret = SP_receive(mbox, &serv_type, sender, MY_MAX_NUM_GROUPS, &num_groups, groups,
&mess_type, &endian_mismatch, MY_MAX_MSG_SIZE, mess)) < 0) {
exit(fprintf(stderr, "SP_receive failed with %d\r\n", ret));
}
}
fprintf(stdout, "Successfully sent and received another %u msgs to myself!\r\n", i);
}
return 0;
}
More information about the Spread-users
mailing list