* In the BMessage assignment operator we do now clear some of the message
header flags after copying the header of the original message. Before cloning a message that still needed a reply would result in the clone also needing a reply, which, in the end, led to two replies being sent, thus screwing up the cached reply ports used for synchronous messaging. Fixes bug #1008. BTW, also clearing the reply info breaks Tracker and Deskbar, so I suppose R5 keeps it and Tracker and Deskbar rely on that behavior. * Added a bit of debug code removing and printing spurious messages from a cached reply port. * Added TODO in BMessage::~BMessage(). ATM, we only send a B_NO_REPLY in the destructor, but not in case the message is overwritten using the assignment operator or Flatten(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20074 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -102,6 +102,7 @@ BMessage::BMessage(const BMessage &other)
|
|||||||
BMessage::~BMessage()
|
BMessage::~BMessage()
|
||||||
{
|
{
|
||||||
DEBUG_FUNCTION_ENTER;
|
DEBUG_FUNCTION_ENTER;
|
||||||
|
// TODO: Check why we don't do that in _Clear() and fix or comment it.
|
||||||
if (IsSourceWaiting())
|
if (IsSourceWaiting())
|
||||||
SendReply(B_NO_REPLY);
|
SendReply(B_NO_REPLY);
|
||||||
|
|
||||||
@@ -119,6 +120,13 @@ BMessage::operator=(const BMessage &other)
|
|||||||
fHeader = (message_header *)malloc(sizeof(message_header));
|
fHeader = (message_header *)malloc(sizeof(message_header));
|
||||||
memcpy(fHeader, other.fHeader, sizeof(message_header));
|
memcpy(fHeader, other.fHeader, sizeof(message_header));
|
||||||
|
|
||||||
|
// Clear some header flags inherited from the original message that don't
|
||||||
|
// apply to the clone.
|
||||||
|
fHeader->flags &= ~(MESSAGE_FLAG_REPLY_REQUIRED | MESSAGE_FLAG_REPLY_DONE
|
||||||
|
| MESSAGE_FLAG_IS_REPLY | MESSAGE_FLAG_WAS_DELIVERED
|
||||||
|
| MESSAGE_FLAG_WAS_DROPPED | MESSAGE_FLAG_PASS_BY_AREA);
|
||||||
|
// Note, that BeOS R5 seems to keep the reply info.
|
||||||
|
|
||||||
if (fHeader->fields_size > 0) {
|
if (fHeader->fields_size > 0) {
|
||||||
fFields = (field_header *)malloc(fHeader->fields_size);
|
fFields = (field_header *)malloc(fHeader->fields_size);
|
||||||
memcpy(fFields, other.fFields, fHeader->fields_size);
|
memcpy(fFields, other.fFields, fHeader->fields_size);
|
||||||
@@ -1988,8 +1996,36 @@ BMessage::_SendMessage(port_id port, team_id portOwner, int32 token,
|
|||||||
#if 0
|
#if 0
|
||||||
port_info portInfo;
|
port_info portInfo;
|
||||||
if (get_port_info(replyPort, &portInfo) == B_OK
|
if (get_port_info(replyPort, &portInfo) == B_OK
|
||||||
&& portInfo.queue_count > 0)
|
&& portInfo.queue_count > 0) {
|
||||||
debugger("reply port not empty!");
|
debugger("reply port not empty!");
|
||||||
|
printf(" reply port not empty! %ld message(s) in queue\n",
|
||||||
|
portInfo.queue_count);
|
||||||
|
|
||||||
|
// fetch and print the messages
|
||||||
|
for (int32 i = 0; i < portInfo.queue_count; i++) {
|
||||||
|
char buffer[1024];
|
||||||
|
int32 code;
|
||||||
|
ssize_t size = read_port(replyPort, &code, buffer, sizeof(buffer));
|
||||||
|
if (size < 0) {
|
||||||
|
printf("failed to read message from reply port\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (size >= (ssize_t)sizeof(buffer)) {
|
||||||
|
printf("message from reply port too big\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BMemoryIO stream(buffer, size);
|
||||||
|
BMessage reply;
|
||||||
|
if (reply.Unflatten(&stream) != B_OK) {
|
||||||
|
printf("failed to unflatten message from reply port\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("message %ld from reply port:\n", i);
|
||||||
|
reply.PrintToStream();
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user