diff --git a/headers/private/kernel/util/KMessage.h b/headers/private/kernel/util/KMessage.h index 061aa63c1b..e4206ea7a3 100644 --- a/headers/private/kernel/util/KMessage.h +++ b/headers/private/kernel/util/KMessage.h @@ -1,8 +1,7 @@ /* - * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. All rights reserved. + * Copyright 2005-2007, Ingo Weinhold, bonefish@users.sf.net. 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); diff --git a/src/system/kernel/messaging/KMessage.cpp b/src/system/kernel/messaging/KMessage.cpp index 15aaad89d7..dd838891c2 100644 --- a/src/system/kernel/messaging/KMessage.cpp +++ b/src/system/kernel/messaging/KMessage.cpp @@ -32,21 +32,6 @@ using std::nothrow; # endif #endif -#ifdef _LOADER_MODE -# include - -# 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 diff --git a/src/system/runtime_loader/Jamfile b/src/system/runtime_loader/Jamfile index 345630078d..83c2845a2c 100644 --- a/src/system/runtime_loader/Jamfile +++ b/src/system/runtime_loader/Jamfile @@ -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 ; diff --git a/src/system/runtime_loader/elf.cpp b/src/system/runtime_loader/elf.cpp index 0914f2560b..6623a7db44 100644 --- a/src/system/runtime_loader/elf.cpp +++ b/src/system/runtime_loader/elf.cpp @@ -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;