[gridftp-commit] CVS update: MODIFIED: source, globus_gfork_server.c ...
John Bresnahan
commit at globus.org
Thu Jun 21 16:29:34 CDT 2007
User: bresnaha
Date: 07/06/21 16:29:34
Modified: gfork/source Tag: gfork3 globus_gfork.h globus_gfork_lib.c
globus_gfork_server.c globus_i_gfork.h
Log:
Revision Changes Path
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/Tag:
No revision
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/gfork3
1.2.4.5 +4 -0 gridftp/gfork/source/globus_gfork.h
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/globus_gfork.h.diff?r1=1.2.4.4&r2=1.2.4.5
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_gfork.h
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gfork/source/globus_gfork.h,v
retrieving revision 1.2.4.4
retrieving revision 1.2.4.5
diff -u -b -r1.2.4.4 -r1.2.4.5
--- globus_gfork.h 12 Jun 2007 20:05:05 -0000 1.2.4.4
+++ globus_gfork.h 21 Jun 2007 21:29:34 -0000 1.2.4.5
@@ -12,6 +12,10 @@
#define GlobusXIOGForkName(func) static const char * _gfork_func_name = #func
#endif
+#define GFORK_CHILD_READ_ENV "GFORK_CHILD_READ_ENV"
+#define GFORK_CHILD_WRITE_ENV "GFORK_CHILD_WRITE_ENV"
+#define GFORK_CHILD_CS_ENV "GFORK_CHILD_CS_ENV"
+
typedef void * gfork_child_handle_t;
typedef enum
1.2.4.9 +101 -44 gridftp/gfork/source/globus_gfork_lib.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/globus_gfork_lib.c.diff?r1=1.2.4.8&r2=1.2.4.9
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_gfork_lib.c
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gfork/source/globus_gfork_lib.c,v
retrieving revision 1.2.4.8
retrieving revision 1.2.4.9
diff -u -b -r1.2.4.8 -r1.2.4.9
--- globus_gfork_lib.c 18 Jun 2007 20:51:20 -0000 1.2.4.8
+++ globus_gfork_lib.c 21 Jun 2007 21:29:34 -0000 1.2.4.9
@@ -10,22 +10,10 @@
static globus_bool_t gfork_l_globals_set = GLOBUS_FALSE;
-GlobusDebugDefine(GLOBUS_GFORK);
+/* can only be 1 pipe per process, but we allow a list of callbacks */
+static gfork_child_handle_t gfork_l_handle;
-typedef struct gfork_l_child_handle_s
-{
- globus_xio_handle_t read_xio;
- globus_xio_handle_t write_xio;
- gfork_i_msg_header_t header;
- globus_byte_t * data;
- globus_gfork_incoming_cb_t incoming_cb;
- globus_gfork_open_func_t open_cb;
- globus_gfork_closed_func_t close_cb;
- globus_bool_t master;
- void * user_arg;
- globus_mutex_t mutex;
- gfork_i_state_t state;
-} gfork_l_child_handle_t;
+GlobusDebugDefine(GLOBUS_GFORK);
static
globus_result_t
@@ -51,9 +39,9 @@
globus_result_t result,
void * user_arg)
{
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
- handle = (gfork_l_child_handle_t *) user_arg;
+ handle = (gfork_i_lib_handle_t *) user_arg;
handle->close_cb(handle, handle->user_arg, getpid());
@@ -68,9 +56,9 @@
globus_result_t result,
void * user_arg)
{
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
- handle = (gfork_l_child_handle_t *) user_arg;
+ handle = (gfork_i_lib_handle_t *) user_arg;
result = globus_xio_register_close(
handle->read_xio, NULL,
@@ -85,7 +73,7 @@
static
void
gfork_l_child_error(
- gfork_l_child_handle_t * handle)
+ gfork_i_lib_handle_t * handle)
{
globus_result_t result;
@@ -123,9 +111,9 @@
globus_xio_data_descriptor_t data_desc,
void * user_arg)
{
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
- handle = (gfork_l_child_handle_t *) user_arg;
+ handle = (gfork_i_lib_handle_t *) user_arg;
if(result != GLOBUS_SUCCESS)
{
@@ -177,11 +165,11 @@
globus_xio_data_descriptor_t data_desc,
void * user_arg)
{
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
globus_bool_t call_close = GLOBUS_FALSE;
globus_bool_t call_open = GLOBUS_FALSE;
- handle = (gfork_l_child_handle_t *) user_arg;
+ handle = (gfork_i_lib_handle_t *) user_arg;
globus_mutex_lock(&handle->mutex);
{
@@ -299,14 +287,14 @@
globus_bool_t master)
{
globus_result_t result;
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
char * env;
char * env_suffix;
int read_fd;
int write_fd;
- handle = (gfork_l_child_handle_t *)
- globus_calloc(1, sizeof(gfork_l_child_handle_t));
+ handle = (gfork_i_lib_handle_t *)
+ globus_calloc(1, sizeof(gfork_i_lib_handle_t));
handle->state = GFORK_STATE_OPEN;
handle->open_cb = open_cb;
@@ -315,6 +303,7 @@
handle->user_arg = user_arg;
handle->master = master;
globus_mutex_init(&handle->mutex, NULL);
+ globus_fifo_init(&handle->write_q);
if(in_env_suffix == NULL)
{
@@ -429,9 +418,9 @@
globus_gfork_child_stop(
gfork_child_handle_t in_handle)
{
- gfork_l_child_handle_t * handle;
+ gfork_i_lib_handle_t * handle;
- handle = (gfork_l_child_handle_t *) in_handle;
+ handle = (gfork_i_lib_handle_t *) in_handle;
globus_mutex_lock(&handle->mutex);
{
gfork_l_child_error(handle);
@@ -526,7 +515,7 @@
static
void
gfork_l_client_writev_cb(
- globus_xio_handle_t handle,
+ globus_xio_handle_t xio_handle,
globus_result_t result,
globus_xio_iovec_t * iovec,
int count,
@@ -535,8 +524,10 @@
void * user_arg)
{
gfork_i_msg_t * msg;
+ gfork_i_lib_handle_t * handle;
msg = (gfork_i_msg_t *) user_arg;
+ handle = msg->lib_handle;
/* lazy reuse of XIO callback. perhaps we should define our own */
if(msg->client_cb)
@@ -544,15 +535,49 @@
msg->client_cb(NULL, result, &msg->iov[1],
count - 1, nbytes, data_desc, msg->user_arg);
}
-
globus_free(msg->iov);
globus_free(msg);
+
+ globus_mutex_lock(&handle->mutex);
+ {
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ if(!globus_fifo_empty(&handle->write_q))
+ {
+ msg = (gfork_i_msg_t *) globus_fifo_dequeue(&handle->write_q);
+
+ result = globus_xio_register_writev(
+ handle->write_xio,
+ msg->iov,
+ msg->iovc,
+ nbytes,
+ NULL,
+ gfork_l_client_writev_cb,
+ msg);
+ if(result != GLOBUS_SUCCESS)
+ {
+ goto error;
+ }
+ }
+ else
+ {
+ handle->writing = GLOBUS_FALSE;
+ }
+ }
+ globus_mutex_unlock(&handle->mutex);
+
+ return;
+error:
+
+ globus_mutex_unlock(&handle->mutex);
}
globus_result_t
globus_l_gfork_send(
- gfork_l_child_handle_t * handle,
+ gfork_i_lib_handle_t * handle,
uid_t pid,
globus_xio_iovec_t * iov,
int iovc,
@@ -569,6 +594,7 @@
msg->header.from_pid = getpid();
msg->header.to_pid = pid;
msg->header.type = GLOBUS_GFORK_MSG_DATA;
+ msg->lib_handle = handle;
msg->user_arg = user_arg;
@@ -587,38 +613,69 @@
msg->client_cb = cb;
msg->header.size = nbytes;
+ msg->iovc = iovc+1;
+ if(!handle->writing)
+ {
+ handle->writing = GLOBUS_TRUE;
result = globus_xio_register_writev(
handle->write_xio,
msg->iov,
- iovc+1,
+ msg->iovc,
nbytes,
NULL,
gfork_l_client_writev_cb,
msg);
+ }
+ else
+ {
+ globus_fifo_enqueue(&handle->write_q, msg);
+ }
return result;
}
globus_result_t
globus_gfork_broadcast(
- gfork_child_handle_t handle,
+ gfork_child_handle_t in_handle,
globus_xio_iovec_t * iov,
int iovc,
globus_xio_iovec_callback_t cb,
void * user_arg)
{
- return globus_l_gfork_send(handle, -1, iov, iovc, cb, user_arg);
+ globus_result_t result;
+ gfork_i_lib_handle_t * handle;
+
+ handle = (gfork_i_lib_handle_t *) in_handle;
+
+ globus_mutex_lock(&handle->mutex);
+ {
+ result = globus_l_gfork_send(handle, -1, iov, iovc, cb, user_arg);
+ }
+ globus_mutex_unlock(&handle->mutex);
+
+ return result;
}
globus_result_t
globus_gfork_send(
- gfork_child_handle_t handle,
+ gfork_child_handle_t in_handle,
uid_t pid,
globus_xio_iovec_t * iov,
int iovc,
globus_xio_iovec_callback_t cb,
void * user_arg)
{
- return globus_l_gfork_send(handle, pid, iov, iovc, cb, user_arg);
+ globus_result_t result;
+ gfork_i_lib_handle_t * handle;
+
+ handle = (gfork_i_lib_handle_t *) in_handle;
+
+ globus_mutex_lock(&handle->mutex);
+ {
+ result = globus_l_gfork_send(handle, pid, iov, iovc, cb, user_arg);
+ }
+ globus_mutex_unlock(&handle->mutex);
+
+ return result;
}
static
1.2.4.11 +10 -12 gridftp/gfork/source/globus_gfork_server.c
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/globus_gfork_server.c.diff?r1=1.2.4.10&r2=1.2.4.11
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_gfork_server.c
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gfork/source/globus_gfork_server.c,v
retrieving revision 1.2.4.10
retrieving revision 1.2.4.11
diff -u -b -r1.2.4.10 -r1.2.4.11
--- globus_gfork_server.c 19 Jun 2007 18:33:43 -0000 1.2.4.10
+++ globus_gfork_server.c 21 Jun 2007 21:29:34 -0000 1.2.4.11
@@ -28,6 +28,7 @@
static gfork_i_child_handle_t * gfork_l_master_child_handle = NULL;
static gfork_i_options_t gfork_l_options;
static gfork_i_handle_t gfork_l_handle;
+static char * g_contact_string;
static
void
@@ -362,7 +363,7 @@
globus_libc_setenv(GFORK_CHILD_READ_ENV, tmp_str, 1);
sprintf(tmp_str, "%d", write_fd);
globus_libc_setenv(GFORK_CHILD_WRITE_ENV, tmp_str, 1);
-
+ globus_libc_setenv(GFORK_CHILD_CS_ENV, g_contact_string, 1);
gfork_log(2, "Master Child FDs %s %s\n",
globus_libc_getenv(GFORK_CHILD_READ_ENV),
@@ -807,25 +808,23 @@
{
gfork_i_options_t * gfork_h;
globus_result_t res;
- char * contact_string;
gfork_h = &gfork_l_options;
- /* start the master program */
- res = gfork_l_spawn_master(gfork_h);
+ res = globus_xio_server_get_contact_string(
+ gfork_l_handle.server_xio, &g_contact_string);
if(res != GLOBUS_SUCCESS)
{
- goto error_master;
+ goto error_contact;
}
+ gfork_log(0, "Listening on: %s\n", g_contact_string);
- res = globus_xio_server_get_contact_string(
- gfork_l_handle.server_xio, &contact_string);
+ /* start the master program */
+ res = gfork_l_spawn_master(gfork_h);
if(res != GLOBUS_SUCCESS)
{
- goto error_contact;
+ goto error_master;
}
- gfork_log(0, "Listening on: %s\n", contact_string);
- globus_free(contact_string);
res = globus_xio_server_register_accept(
gfork_l_handle.server_xio,
@@ -838,9 +837,8 @@
return GLOBUS_SUCCESS;
error_register:
- free(contact_string);
-error_contact:
error_master:
+error_contact:
return res;
}
1.2.4.9 +19 -3 gridftp/gfork/source/globus_i_gfork.h
http://viewcvs.globus.org/viewcvs.cgi/gridftp/gfork/source/globus_i_gfork.h.diff?r1=1.2.4.8&r2=1.2.4.9
(In the diff below, changes in quantity of whitespace are not shown.)
Index: globus_i_gfork.h
===================================================================
RCS file: /home/globdev/CVS/globus-packages/gridftp/gfork/source/globus_i_gfork.h,v
retrieving revision 1.2.4.8
retrieving revision 1.2.4.9
diff -u -b -r1.2.4.8 -r1.2.4.9
--- globus_i_gfork.h 19 Jun 2007 14:38:55 -0000 1.2.4.8
+++ globus_i_gfork.h 21 Jun 2007 21:29:34 -0000 1.2.4.9
@@ -28,9 +28,6 @@
"System error in %s", \
_msg)
-#define GFORK_CHILD_READ_ENV "GFORK_CHILD_READ_ENV"
-#define GFORK_CHILD_WRITE_ENV "GFORK_CHILD_WRITE_ENV"
-
#define GForkErrorStr(_msg) \
globus_error_put(GForkErrorObjStr(_msg))
@@ -104,11 +101,13 @@
struct gfork_i_child_handle_s * from_kid;
void * user_arg;
globus_xio_iovec_t * iov;
+ int iovc;
globus_xio_iovec_t write_iov[2];
globus_xio_iovec_callback_t client_cb;
globus_xio_iovec_callback_t cb;
gfork_i_msg_data_t * data;
globus_byte_t * buffer;
+ struct gfork_i_lib_handle_s * lib_handle;
} gfork_i_msg_t;
typedef enum gfork_i_state_e
@@ -181,6 +180,23 @@
globus_bool_t master;
} gfork_i_child_handle_t;
+typedef struct gfork_i_lib_handle_s
+{
+ globus_xio_handle_t read_xio;
+ globus_xio_handle_t write_xio;
+ gfork_i_msg_header_t header;
+ globus_byte_t * data;
+ globus_gfork_incoming_cb_t incoming_cb;
+ globus_gfork_open_func_t open_cb;
+ globus_gfork_closed_func_t close_cb;
+ globus_bool_t master;
+ void * user_arg;
+ globus_mutex_t mutex;
+ gfork_i_state_t state;
+ globus_fifo_t write_q;
+ globus_bool_t writing;
+} gfork_i_lib_handle_t;
+
globus_result_t
gfork_i_make_xio_handle(
globus_xio_handle_t * xio_handle,
More information about the gridftp-commit
mailing list