* Followed Ingo's suggestion and send the message manually in the runtime loader;

therefore, we could remove the ugly defines from KMessage again, and compile it
  with KMESSAGE_CONTAINER_ONLY.
* Added KMessage::SetDeliveryInfo() to be able to send messages with a correct
  header.
* Fixed a bug in KMessage::SendTo() that would not send the senderTeam when passing
  a negative value for the parameter, but override it when passing in a valid
  value.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21740 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2007-07-29 21:36:49 +00:00
parent 3dab566b3a
commit 4bef3723a1
4 changed files with 40 additions and 34 deletions
+4 -2
View File
@@ -1,8 +1,7 @@
/*
* Copyright 2005, Ingo Weinhold, [email protected]. All rights reserved.
* Copyright 2005-2007, Ingo Weinhold, [email protected]. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef KMESSAGE_H
#define KMESSAGE_H
@@ -119,6 +118,9 @@ public:
port_id ReplyPort() const;
int32 ReplyToken() const;
void SetDeliveryInfo(int32 targetToken, port_id replyPort,
int32 replyToken, team_id senderTeam);
status_t SendTo(port_id targetPort, int32 targetToken = -1,
port_id replyPort = -1, int32 replyToken = -1, bigtime_t timeout = -1,
team_id senderTeam = -1);
+19 -27
View File
@@ -32,21 +32,6 @@ using std::nothrow;
# endif
#endif
#ifdef _LOADER_MODE
# include <syscalls.h>
# define KMESSAGE_NO_RECEIVE
# define create_port(capacity, name) _kern_create_port(capacity, name)
# define delete_port(port) _kern_delete_port(port)
# define write_port(port, code, buffer, bufferSize) \
_kern_write_port_etc(port, code, buffer, bufferSize, 0, 0)
# define write_port_etc(port, code, buffer, bufferSize, flags, timeout) \
_kern_write_port_etc(port, code, buffer, bufferSize, flags, timeout)
# define set_port_owner(port, team) _kern_set_port_owner(port, team)
# define _get_port_info(port, info, size) _kern_get_port_info(port, info)
#endif
static const int32 kMessageReallocChunkSize = 64;
// kMessageHeaderMagic
@@ -451,6 +436,18 @@ KMessage::ReplyToken() const
return _Header()->replyToken;
}
// SetDeliveryInfo
void
KMessage::SetDeliveryInfo(int32 targetToken, port_id replyPort,
int32 replyToken, team_id senderTeam)
{
Header* header = _Header();
header->sender = senderTeam;
header->targetToken = targetToken;
header->replyPort = replyPort;
header->replyToken = replyToken;
header->sender = senderTeam;
}
#ifndef KMESSAGE_CONTAINER_ONLY
@@ -459,23 +456,22 @@ status_t
KMessage::SendTo(port_id targetPort, int32 targetToken, port_id replyPort,
int32 replyToken, bigtime_t timeout, team_id senderTeam)
{
// set the deliver info
Header* header = _Header();
header->sender = senderTeam;
header->targetToken = targetToken;
header->replyPort = replyPort;
header->replyToken = replyToken;
// get the sender team
if (senderTeam >= 0) {
if (senderTeam < 0) {
thread_info info;
status_t error = get_thread_info(find_thread(NULL), &info);
if (error != B_OK)
return error;
header->sender = info.team;
senderTeam = info.team;
}
SetDeliveryInfo(targetToken, replyPort, replyToken, senderTeam);
// send the message
if (timeout < 0)
return write_port(targetPort, 'KMSG', fBuffer, ContentSize());
return write_port_etc(targetPort, 'KMSG', fBuffer, ContentSize(),
B_RELATIVE_TIMEOUT, timeout);
}
@@ -561,9 +557,6 @@ KMessage::SendReply(KMessage* message, KMessage* reply,
status_t
KMessage::ReceiveFrom(port_id fromPort, bigtime_t timeout)
{
#ifdef KMESSAGE_NO_RECEIVE
return B_NOT_SUPPORTED;
#else
// get the port buffer size
ssize_t size;
if (timeout < 0)
@@ -587,7 +580,6 @@ KMessage::ReceiveFrom(port_id fromPort, bigtime_t timeout)
// init the message
return SetTo(buffer, size, 0,
KMESSAGE_OWNS_BUFFER | KMESSAGE_INIT_FROM_BUFFER);
#endif // !KMESSAGE_NO_RECEIVE
}
#endif // !KMESSAGE_CONTAINER_ONLY
+1
View File
@@ -10,6 +10,7 @@ SubDirC++Flags -fno-builtin -fno-exceptions ;
# default to BeOS style symbol resolution
DEFINES += BEOS_STYLE_SYMBOLS_RESOLUTION
KMESSAGE_CONTAINER_ONLY
_LOADER_MODE
;
+16 -5
View File
@@ -183,6 +183,13 @@ elf_hash(const uint8 *name)
}
static inline bool
report_errors()
{
return gProgramArgs->error_port >= 0;
}
static image_t *
find_image_in_queue(image_queue_t *queue, const char *name, bool isPath,
uint32 typeMask)
@@ -1097,7 +1104,7 @@ static status_t
load_dependencies(image_t *image)
{
struct Elf32_Dyn *d = (struct Elf32_Dyn *)image->dynamic_ptr;
bool reportErrors = gProgramArgs->error_port >= 0;
bool reportErrors = report_errors();
status_t status = B_OK;
uint32 i, j;
const char *rpath;
@@ -1339,10 +1346,14 @@ load_program(char const *path, void **_entry)
err:
delete_image(sProgramImage);
if (gProgramArgs->error_port >= 0) {
if (report_errors()) {
// send error message
sErrorMessage.AddInt32("error", status);
sErrorMessage.SendTo(gProgramArgs->error_port, gProgramArgs->error_token,
-1, 0, 0, find_thread(NULL));
sErrorMessage.SetDeliveryInfo(gProgramArgs->error_token,
-1, 0, find_thread(NULL));
_kern_write_port_etc(gProgramArgs->error_port, 'KMSG',
sErrorMessage.Buffer(), sErrorMessage.ContentSize(), 0, 0);
}
_kern_loading_app_failed(status);
rld_unlock();
@@ -1651,7 +1662,7 @@ rldelf_init(void)
}
// initialize error message if needed
if (gProgramArgs->error_port >= 0) {
if (report_errors()) {
void *buffer = malloc(1024);
if (buffer == NULL)
return;