* 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.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef KMESSAGE_H
|
#ifndef KMESSAGE_H
|
||||||
#define KMESSAGE_H
|
#define KMESSAGE_H
|
||||||
|
|
||||||
@@ -119,6 +118,9 @@ public:
|
|||||||
port_id ReplyPort() const;
|
port_id ReplyPort() const;
|
||||||
int32 ReplyToken() 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,
|
status_t SendTo(port_id targetPort, int32 targetToken = -1,
|
||||||
port_id replyPort = -1, int32 replyToken = -1, bigtime_t timeout = -1,
|
port_id replyPort = -1, int32 replyToken = -1, bigtime_t timeout = -1,
|
||||||
team_id senderTeam = -1);
|
team_id senderTeam = -1);
|
||||||
|
|||||||
@@ -32,21 +32,6 @@ using std::nothrow;
|
|||||||
# endif
|
# endif
|
||||||
#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;
|
static const int32 kMessageReallocChunkSize = 64;
|
||||||
|
|
||||||
// kMessageHeaderMagic
|
// kMessageHeaderMagic
|
||||||
@@ -451,6 +436,18 @@ KMessage::ReplyToken() const
|
|||||||
return _Header()->replyToken;
|
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
|
#ifndef KMESSAGE_CONTAINER_ONLY
|
||||||
|
|
||||||
@@ -459,23 +456,22 @@ status_t
|
|||||||
KMessage::SendTo(port_id targetPort, int32 targetToken, port_id replyPort,
|
KMessage::SendTo(port_id targetPort, int32 targetToken, port_id replyPort,
|
||||||
int32 replyToken, bigtime_t timeout, team_id senderTeam)
|
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
|
// get the sender team
|
||||||
if (senderTeam >= 0) {
|
if (senderTeam < 0) {
|
||||||
thread_info info;
|
thread_info info;
|
||||||
status_t error = get_thread_info(find_thread(NULL), &info);
|
status_t error = get_thread_info(find_thread(NULL), &info);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
header->sender = info.team;
|
|
||||||
|
senderTeam = info.team;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetDeliveryInfo(targetToken, replyPort, replyToken, senderTeam);
|
||||||
|
|
||||||
// send the message
|
// send the message
|
||||||
if (timeout < 0)
|
if (timeout < 0)
|
||||||
return write_port(targetPort, 'KMSG', fBuffer, ContentSize());
|
return write_port(targetPort, 'KMSG', fBuffer, ContentSize());
|
||||||
|
|
||||||
return write_port_etc(targetPort, 'KMSG', fBuffer, ContentSize(),
|
return write_port_etc(targetPort, 'KMSG', fBuffer, ContentSize(),
|
||||||
B_RELATIVE_TIMEOUT, timeout);
|
B_RELATIVE_TIMEOUT, timeout);
|
||||||
}
|
}
|
||||||
@@ -561,9 +557,6 @@ KMessage::SendReply(KMessage* message, KMessage* reply,
|
|||||||
status_t
|
status_t
|
||||||
KMessage::ReceiveFrom(port_id fromPort, bigtime_t timeout)
|
KMessage::ReceiveFrom(port_id fromPort, bigtime_t timeout)
|
||||||
{
|
{
|
||||||
#ifdef KMESSAGE_NO_RECEIVE
|
|
||||||
return B_NOT_SUPPORTED;
|
|
||||||
#else
|
|
||||||
// get the port buffer size
|
// get the port buffer size
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
if (timeout < 0)
|
if (timeout < 0)
|
||||||
@@ -587,7 +580,6 @@ KMessage::ReceiveFrom(port_id fromPort, bigtime_t timeout)
|
|||||||
// init the message
|
// init the message
|
||||||
return SetTo(buffer, size, 0,
|
return SetTo(buffer, size, 0,
|
||||||
KMESSAGE_OWNS_BUFFER | KMESSAGE_INIT_FROM_BUFFER);
|
KMESSAGE_OWNS_BUFFER | KMESSAGE_INIT_FROM_BUFFER);
|
||||||
#endif // !KMESSAGE_NO_RECEIVE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !KMESSAGE_CONTAINER_ONLY
|
#endif // !KMESSAGE_CONTAINER_ONLY
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ SubDirC++Flags -fno-builtin -fno-exceptions ;
|
|||||||
|
|
||||||
# default to BeOS style symbol resolution
|
# default to BeOS style symbol resolution
|
||||||
DEFINES += BEOS_STYLE_SYMBOLS_RESOLUTION
|
DEFINES += BEOS_STYLE_SYMBOLS_RESOLUTION
|
||||||
|
KMESSAGE_CONTAINER_ONLY
|
||||||
_LOADER_MODE
|
_LOADER_MODE
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -183,6 +183,13 @@ elf_hash(const uint8 *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
report_errors()
|
||||||
|
{
|
||||||
|
return gProgramArgs->error_port >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static image_t *
|
static image_t *
|
||||||
find_image_in_queue(image_queue_t *queue, const char *name, bool isPath,
|
find_image_in_queue(image_queue_t *queue, const char *name, bool isPath,
|
||||||
uint32 typeMask)
|
uint32 typeMask)
|
||||||
@@ -1097,7 +1104,7 @@ static status_t
|
|||||||
load_dependencies(image_t *image)
|
load_dependencies(image_t *image)
|
||||||
{
|
{
|
||||||
struct Elf32_Dyn *d = (struct Elf32_Dyn *)image->dynamic_ptr;
|
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;
|
status_t status = B_OK;
|
||||||
uint32 i, j;
|
uint32 i, j;
|
||||||
const char *rpath;
|
const char *rpath;
|
||||||
@@ -1339,10 +1346,14 @@ load_program(char const *path, void **_entry)
|
|||||||
err:
|
err:
|
||||||
delete_image(sProgramImage);
|
delete_image(sProgramImage);
|
||||||
|
|
||||||
if (gProgramArgs->error_port >= 0) {
|
if (report_errors()) {
|
||||||
|
// send error message
|
||||||
sErrorMessage.AddInt32("error", status);
|
sErrorMessage.AddInt32("error", status);
|
||||||
sErrorMessage.SendTo(gProgramArgs->error_port, gProgramArgs->error_token,
|
sErrorMessage.SetDeliveryInfo(gProgramArgs->error_token,
|
||||||
-1, 0, 0, find_thread(NULL));
|
-1, 0, find_thread(NULL));
|
||||||
|
|
||||||
|
_kern_write_port_etc(gProgramArgs->error_port, 'KMSG',
|
||||||
|
sErrorMessage.Buffer(), sErrorMessage.ContentSize(), 0, 0);
|
||||||
}
|
}
|
||||||
_kern_loading_app_failed(status);
|
_kern_loading_app_failed(status);
|
||||||
rld_unlock();
|
rld_unlock();
|
||||||
@@ -1651,7 +1662,7 @@ rldelf_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initialize error message if needed
|
// initialize error message if needed
|
||||||
if (gProgramArgs->error_port >= 0) {
|
if (report_errors()) {
|
||||||
void *buffer = malloc(1024);
|
void *buffer = malloc(1024);
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user