* 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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user