|
14 | 14 | #include "messenger.h"
|
15 | 15 | #include "async.h"
|
16 | 16 |
|
17 |
| - |
18 | 17 | using namespace v8;
|
19 | 18 | using namespace node;
|
20 | 19 | using namespace std;
|
21 | 20 |
|
22 | 21 | Messenger::Messenger() {
|
23 | 22 | NODE_CPROTON_MUTEX_INIT(mutex);
|
| 23 | + messageSender = new MessageSender(this); |
| 24 | + messageSettler = new MessageSettler(this); |
24 | 25 | };
|
25 | 26 |
|
26 | 27 | Messenger::~Messenger() {
|
27 | 28 | pn_messenger_stop(messenger);
|
28 | 29 | pn_messenger_stop(receiver);
|
| 30 | + delete(messageSender); |
| 31 | + delete(messageSettler); |
29 | 32 | NODE_CPROTON_MUTEX_DESTROY(mutex);
|
30 | 33 | }
|
31 | 34 |
|
@@ -57,11 +60,12 @@ Handle<Value> Messenger::New(const Arguments& args) {
|
57 | 60 | Messenger* msgr = new Messenger();
|
58 | 61 |
|
59 | 62 | pn_messenger_t* messenger = pn_messenger(NULL);
|
| 63 | + pn_messenger_set_blocking(messenger, false); |
60 | 64 | pn_messenger_start(messenger);
|
61 | 65 | msgr->messenger = messenger;
|
62 | 66 |
|
63 |
| - // Temporary fix |
64 |
| - pn_messenger_set_outgoing_window(msgr->messenger, 1); |
| 67 | + // Temporary fix -- should tune this |
| 68 | + pn_messenger_set_outgoing_window(msgr->messenger, 50); |
65 | 69 |
|
66 | 70 | pn_messenger_t* receiver = pn_messenger(NULL);
|
67 | 71 | pn_messenger_set_incoming_window(receiver, 1);
|
@@ -340,58 +344,36 @@ Handle<Value> Messenger::Send(const Arguments& args) {
|
340 | 344 |
|
341 | 345 | REQUIRE_ARGUMENT_OBJECT(0, obj);
|
342 | 346 | OPTIONAL_ARGUMENT_FUNCTION(1, callback);
|
| 347 | + pn_message_t *msg = JSToMessage(obj); |
343 | 348 |
|
344 |
| - pn_message_t* msg = JSToMessage(obj); |
345 |
| - |
346 |
| - SendBaton* baton = new SendBaton(msgr, callback, msg); |
347 |
| - |
348 |
| - Work_BeginSend(baton); |
| 349 | + InFlightMessage *ifmsg = new InFlightMessage(obj, msg, callback); |
| 350 | + msgr->messageSender->AppendMessage(ifmsg); |
349 | 351 |
|
350 | 352 | return Undefined();
|
351 |
| - |
352 | 353 | }
|
353 | 354 |
|
| 355 | + |
354 | 356 | void Messenger::Work_BeginSend(Baton* baton) {
|
| 357 | + SendBaton * send_baton = static_cast<SendBaton *>(baton); |
| 358 | + |
355 | 359 | int status = uv_queue_work(uv_default_loop(),
|
356 | 360 | &baton->request, Work_Send, (uv_after_work_cb)Work_AfterSend);
|
357 | 361 |
|
358 | 362 | assert(status == 0);
|
359 |
| - |
360 | 363 | }
|
361 | 364 |
|
362 | 365 | void Messenger::Work_Send(uv_work_t* req) {
|
363 | 366 |
|
364 | 367 | SendBaton* baton = static_cast<SendBaton*>(req->data);
|
365 |
| - pn_messenger_t* messenger = baton->msgr->messenger; |
366 |
| - pn_message_t* message = baton->msg; |
367 |
| - |
368 |
| - NODE_CPROTON_MUTEX_LOCK(&baton->msgr->mutex) |
369 |
| - assert(!pn_messenger_put(messenger, message)); |
370 |
| - baton->tracker = pn_messenger_outgoing_tracker(messenger); |
371 |
| - |
372 |
| - assert(!pn_messenger_send(messenger, -1)); |
373 |
| - NODE_CPROTON_MUTEX_UNLOCK(&baton->msgr->mutex) |
374 |
| - |
375 |
| - |
376 |
| - pn_message_free(message); |
377 |
| - |
| 368 | + |
378 | 369 | }
|
379 | 370 |
|
380 | 371 | void Messenger::Work_AfterSend(uv_work_t* req) {
|
381 | 372 | HandleScope scope;
|
| 373 | + |
382 | 374 | SendBaton* baton = static_cast<SendBaton*>(req->data);
|
383 |
| - |
384 |
| - if (baton->error_code > 0) { |
385 |
| - Local<Value> err = Exception::Error(String::New(baton->error_message.c_str())); |
386 |
| - Local<Value> argv[] = { err }; |
387 |
| - baton->callback->Call(Context::GetCurrent()->Global(), 1, argv); |
388 |
| - } else { |
389 |
| - Local<Value> argv[1]; |
390 |
| - baton->callback->Call(Context::GetCurrent()->Global(), 0, argv); |
391 |
| - } |
392 |
| - |
| 375 | + |
393 | 376 | delete baton;
|
394 |
| - |
395 | 377 | }
|
396 | 378 |
|
397 | 379 | Handle<Value> Messenger::Receive(const Arguments& args) {
|
@@ -457,7 +439,7 @@ void Messenger::Work_Receive(uv_work_t* req) {
|
457 | 439 |
|
458 | 440 | while (baton->msgr->receiving) {
|
459 | 441 |
|
460 |
| - pn_messenger_recv(receiver, 1024); |
| 442 | + pn_messenger_recv(receiver, 150); |
461 | 443 |
|
462 | 444 | while(pn_messenger_incoming(receiver)) {
|
463 | 445 |
|
@@ -634,3 +616,82 @@ Local<Object> Messenger::MessageToJS(pn_message_t* message) {
|
634 | 616 | return result;
|
635 | 617 | }
|
636 | 618 |
|
| 619 | +int Messenger::MessengerGetOutgoingWindow(void) |
| 620 | +{ |
| 621 | + int result; |
| 622 | + NODE_CPROTON_MUTEX_LOCK(&mutex) |
| 623 | + result = pn_messenger_get_outgoing_window(messenger); |
| 624 | + NODE_CPROTON_MUTEX_UNLOCK(&mutex) |
| 625 | + return result; |
| 626 | +} |
| 627 | + |
| 628 | +int Messenger::MessengerGetOutgoing(void){ |
| 629 | + int result; |
| 630 | + NODE_CPROTON_MUTEX_LOCK(&mutex) |
| 631 | + result = pn_messenger_outgoing(messenger); |
| 632 | + NODE_CPROTON_MUTEX_UNLOCK(&mutex) |
| 633 | + return result; |
| 634 | +} |
| 635 | + |
| 636 | +bool Messenger::MessengerGetBuffered(pn_tracker_t tracker){ |
| 637 | + bool result; |
| 638 | + NODE_CPROTON_MUTEX_LOCK(&mutex) |
| 639 | + result = pn_messenger_buffered(messenger, tracker); |
| 640 | + NODE_CPROTON_MUTEX_UNLOCK(&mutex) |
| 641 | + return result; |
| 642 | +} |
| 643 | + |
| 644 | +pn_status_t Messenger::MessengerGetStatus(pn_tracker_t tracker){ |
| 645 | + pn_status_t result; |
| 646 | + NODE_CPROTON_MUTEX_LOCK(&mutex) |
| 647 | + result = pn_messenger_status(messenger, tracker); |
| 648 | + NODE_CPROTON_MUTEX_UNLOCK(&mutex) |
| 649 | + return result; |
| 650 | +} |
| 651 | + |
| 652 | +int Messenger::MessengerSettleOutgoing(pn_tracker_t tracker){ |
| 653 | + int result; |
| 654 | + NODE_CPROTON_MUTEX_LOCK(&mutex) |
| 655 | + result = pn_messenger_settle(messenger, tracker, 0); |
| 656 | + NODE_CPROTON_MUTEX_UNLOCK(&mutex) |
| 657 | + return result; |
| 658 | +} |
| 659 | + |
| 660 | +std::string Messenger::MapErrorToString(int err) { |
| 661 | + switch(err) { |
| 662 | + case MSG_ERROR_NONE: |
| 663 | + return std::string("none"); |
| 664 | + case MSG_ERROR_INTERNAL: |
| 665 | + return std::string("internal error"); |
| 666 | + case MSG_ERROR_REJECTED: |
| 667 | + return std::string("rejected"); |
| 668 | + case MSG_ERROR_STATUS_UNKNOWN: |
| 669 | + return std::string("status unknown"); |
| 670 | + case MSG_ERROR_ABORTED: |
| 671 | + return std::string("aborted"); |
| 672 | + } |
| 673 | + return std::string("unknown error"); |
| 674 | +} |
| 675 | + |
| 676 | +int Messenger::MapPNStatusToError(pn_status_t status) |
| 677 | +{ |
| 678 | + switch(status) { |
| 679 | + case PN_STATUS_UNKNOWN: |
| 680 | + return MSG_ERROR_STATUS_UNKNOWN; |
| 681 | + case PN_STATUS_PENDING: |
| 682 | + return MSG_ERROR_NONE; |
| 683 | + case PN_STATUS_ACCEPTED: |
| 684 | + return MSG_ERROR_NONE; |
| 685 | + case PN_STATUS_REJECTED: |
| 686 | + return MSG_ERROR_REJECTED; |
| 687 | + case PN_STATUS_RELEASED: |
| 688 | + return MSG_ERROR_NONE; |
| 689 | + case PN_STATUS_MODIFIED: |
| 690 | + return MSG_ERROR_NONE; |
| 691 | + case PN_STATUS_ABORTED: |
| 692 | + return MSG_ERROR_ABORTED; |
| 693 | + case PN_STATUS_SETTLED: |
| 694 | + return MSG_ERROR_NONE; |
| 695 | + } |
| 696 | + return MSG_ERROR_INTERNAL; |
| 697 | +} |
0 commit comments