3
3
#include <sys/types.h>
4
4
#include "giop-private.h"
6
8
#include <orbit/GIOP/giop.h>
7
9
#include "../util/orbit-purify.h"
9
11
#define GIOP_CHUNK_ALIGN 8
10
12
#define GIOP_CHUNK_SIZE (GIOP_CHUNK_ALIGN * 256)
14
static gboolean giop_blank_wire_data = FALSE;
12
15
static GSList *send_buffer_list = NULL;
13
16
static GMutex *send_buffer_list_lock = NULL;
15
18
static const char giop_zero_buf [GIOP_CHUNK_ALIGN * 10] = {0};
18
giop_send_buffer_init (void)
21
giop_send_buffer_init (gboolean wipe)
20
send_buffer_list_lock = linc_mutex_new ();
24
giop_blank_wire_data = TRUE;
26
giop_blank_wire_data = wipe;
28
send_buffer_list_lock = link_mutex_new ();
23
31
/* Marshal it at compile time so we don't have to do it over and over. This just stores codeset info to say that
45
53
const struct iovec *operation_vec,
46
54
const struct iovec *principal_vec)
48
GIOPSendBuffer *buf = giop_send_buffer_use(giop_version);
53
zerovec.iov_base = (gpointer) giop_zero_buf;
54
zerovec.iov_len = sizeof(CORBA_unsigned_long);
55
principal_vec = &zerovec;
58
buf->msg.header.message_type = GIOP_REQUEST;
59
giop_send_buffer_align(buf, sizeof(CORBA_unsigned_long));
60
buf->msg.u.request_1_0.request_id = request_id;
61
buf->msg.u.request_1_0.response_expected = response_expected;
67
giop_send_buffer_append(buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data));
68
giop_send_buffer_append(buf, &buf->msg.u.request_1_0.request_id, sizeof(CORBA_unsigned_long));
69
giop_send_buffer_append(buf, &buf->msg.u.request_1_0.response_expected, sizeof(CORBA_boolean));
70
giop_send_buffer_append_aligned(buf, &objkey->_length, sizeof(CORBA_unsigned_long));
71
giop_send_buffer_append(buf, objkey->_buffer, objkey->_length);
72
giop_send_buffer_align(buf, sizeof(CORBA_unsigned_long));
73
giop_send_buffer_append(buf, operation_vec->iov_base, operation_vec->iov_len);
74
giop_send_buffer_append(buf, principal_vec->iov_base, principal_vec->iov_len);
77
giop_send_buffer_align(buf, sizeof(CORBA_unsigned_long));
78
giop_send_buffer_append(buf, &buf->msg.u.request_1_0.request_id, sizeof(CORBA_unsigned_long));
79
giop_send_buffer_append(buf, &buf->msg.u.request_1_0.response_expected, sizeof(CORBA_boolean));
80
giop_send_buffer_append(buf, giop_zero_buf, 3);
81
giop_send_buffer_append(buf, &giop_1_2_target_type, 2); /* We always use GIOP::KeyAddr addressing - the only sane way */
82
giop_send_buffer_append_aligned(buf, &objkey->_length, sizeof(CORBA_unsigned_long));
83
giop_send_buffer_append(buf, objkey->_buffer, objkey->_length);
84
giop_send_buffer_align(buf, sizeof(CORBA_unsigned_long));
85
giop_send_buffer_append(buf, operation_vec->iov_base, operation_vec->iov_len);
86
giop_send_buffer_append(buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data));
87
giop_send_buffer_align(buf, 8); /* alignment for the body */
56
GIOPSendBuffer *buf = giop_send_buffer_use (giop_version);
60
zerovec.iov_base = (gpointer) giop_zero_buf;
61
zerovec.iov_len = sizeof (CORBA_unsigned_long);
62
principal_vec = &zerovec;
65
buf->msg.header.message_type = GIOP_REQUEST;
66
giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long));
68
switch (giop_version) {
71
buf->msg.u.request_1_0.request_id = request_id;
72
buf->msg.u.request_1_0.response_expected = response_expected;
74
giop_send_buffer_append (buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data));
75
giop_send_buffer_append (buf, &buf->msg.u.request_1_0.request_id, sizeof(CORBA_unsigned_long));
76
giop_send_buffer_append (buf, &buf->msg.u.request_1_0.response_expected, sizeof(CORBA_boolean));
77
giop_send_buffer_append_aligned (buf, &objkey->_length, sizeof(CORBA_unsigned_long));
78
giop_send_buffer_append (buf, objkey->_buffer, objkey->_length);
79
giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long));
80
giop_send_buffer_append (buf, operation_vec->iov_base, operation_vec->iov_len);
81
giop_send_buffer_append (buf, principal_vec->iov_base, principal_vec->iov_len);
85
buf->msg.u.request_1_2.request_id = request_id;
86
buf->msg.u.request_1_2.response_flags = response_expected ? 0x3 /* SYNC_WITH_TARGET */ : 0x0 /* SYNC_NONE */;
88
giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long));
89
giop_send_buffer_append (buf, &buf->msg.u.request_1_2.request_id, sizeof(CORBA_unsigned_long));
90
giop_send_buffer_append (buf, &buf->msg.u.request_1_2.response_flags, sizeof(CORBA_octet));
91
giop_send_buffer_append (buf, giop_zero_buf, 3);
92
giop_send_buffer_append (buf, &giop_1_2_target_type, 2); /* We always use GIOP::KeyAddr addressing - the only sane way */
93
giop_send_buffer_append_aligned (buf, &objkey->_length, sizeof(CORBA_unsigned_long));
94
giop_send_buffer_append (buf, objkey->_buffer, objkey->_length);
95
giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long));
96
giop_send_buffer_append (buf, operation_vec->iov_base, operation_vec->iov_len);
97
giop_send_buffer_append (buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data));
98
giop_send_buffer_align (buf, 8); /* alignment for the body */
393
426
gboolean blocking)
396
static LINCWriteOpts *non_block = NULL;
429
static LinkWriteOpts *non_block = NULL;
399
non_block = linc_write_options_new (FALSE);
401
if (buf->giop_version >= GIOP_1_2)
402
giop_send_buffer_align (buf, 8); /* Do tail align */
404
LINC_MUTEX_LOCK (cnx->outgoing_mutex);
406
retval = linc_connection_writev (
407
(LINCConnection *) cnx, buf->iovecs,
432
non_block = link_write_options_new (FALSE);
434
/* FIXME: if a FRAGMENT, assert the 8 byte tail align,
435
&&|| giop_send_buffer_align (buf, 8); */
437
retval = link_connection_writev (
438
(LinkConnection *) cnx, buf->iovecs,
409
440
blocking ? NULL : non_block);
411
if (!blocking && retval == LINC_IO_QUEUED_DATA)
442
if (!blocking && retval == LINK_IO_QUEUED_DATA)
414
445
/* FIXME: we need to flag the connection disconnected on fatal error */
416
LINC_MUTEX_UNLOCK (cnx->outgoing_mutex);
432
465
send_buffer_list = g_slist_remove_link (
433
466
send_buffer_list, ltmp);
435
LINC_MUTEX_UNLOCK (send_buffer_list_lock);
468
LINK_MUTEX_UNLOCK (send_buffer_list_lock);
438
471
g_slist_free_1 (ltmp);
439
retval->num_used = retval->indirect_left = 0;
440
retval->num_indirects_used = 0;
472
buf->num_used = buf->indirect_left = 0;
474
if (giop_blank_wire_data) {
477
for (i = 0; i < buf->num_indirects_used; i++)
478
memset (buf->indirects [i].ptr, 0,
479
buf->indirects [i].size);
482
buf->num_indirects_used = 0;
442
LINC_MUTEX_UNLOCK (send_buffer_list_lock);
444
retval = g_new0 (GIOPSendBuffer, 1);
446
memcpy (retval->msg.header.magic, "GIOP", 4);
447
retval->msg.header.flags = GIOP_FLAG_ENDIANNESS;
448
retval->num_alloced = 8;
449
retval->iovecs = g_new (struct iovec, 8);
484
LINK_MUTEX_UNLOCK (send_buffer_list_lock);
486
buf = g_new0 (GIOPSendBuffer, 1);
488
memcpy (buf->msg.header.magic, "GIOP", 4);
489
buf->msg.header.flags = GIOP_FLAG_ENDIANNESS;
490
buf->num_alloced = 8;
491
buf->iovecs = g_new (struct iovec, 8);
452
memcpy (retval->msg.header.version,
495
memcpy (buf->msg.header.version,
453
496
giop_version_ids [giop_version], 2);
454
retval->giop_version = giop_version;
497
buf->giop_version = giop_version;
456
g_assert (sizeof (retval->msg.header) == 12);
499
g_assert (sizeof (buf->msg.header) == 12);
457
500
giop_send_buffer_append_real (
458
retval, (guchar *)&retval->msg.header, 12);
460
retval->msg.header.message_size = 0;
461
retval->header_size = 12;
501
buf, (guchar *)&buf->msg.header, 12);
503
buf->msg.header.message_size = 0;
504
buf->header_size = 12;