Some initial work on removing buffer_t from io_data_t

This commit is contained in:
ridiculousfish 2012-03-03 23:56:35 -08:00
parent baa813c46f
commit 27f374a38b
5 changed files with 26 additions and 29 deletions

View file

@ -82,7 +82,7 @@
static std::vector<bool> open_fds; static std::vector<bool> open_fds;
// Called in a forked child // Called in a forked child
static void exec_write_and_exit( int fd, char *buff, size_t count, int status ) static void exec_write_and_exit( int fd, const char *buff, size_t count, int status )
{ {
if( write_loop(fd, buff, count) == -1 ) if( write_loop(fd, buff, count) == -1 )
{ {
@ -1039,7 +1039,7 @@ void exec( parser_t &parser, job_t *j )
io_buffer_read( io_buffer ); io_buffer_read( io_buffer );
if( io_buffer->param2.out_buffer->used != 0 ) if( io_buffer->out_buffer->used != 0 )
{ {
/* We don't have to drain threads here because our child process is simple */ /* We don't have to drain threads here because our child process is simple */
pid = execute_fork(false); pid = execute_fork(false);
@ -1053,8 +1053,8 @@ void exec( parser_t &parser, job_t *j )
setup_child_process( j, p ); setup_child_process( j, p );
exec_write_and_exit(io_buffer->fd, exec_write_and_exit(io_buffer->fd,
io_buffer->param2.out_buffer->buff, io_buffer->out_buffer->buff,
io_buffer->param2.out_buffer->used, io_buffer->out_buffer->used,
status); status);
} }
else else
@ -1102,8 +1102,8 @@ void exec( parser_t &parser, job_t *j )
setup_child_process( j, p ); setup_child_process( j, p );
exec_write_and_exit( 1, exec_write_and_exit( 1,
input_redirect->param2.out_buffer->buff, input_redirect->out_buffer->buff,
input_redirect->param2.out_buffer->used, input_redirect->out_buffer->used,
0); 0);
} }
else else
@ -1157,7 +1157,7 @@ void exec( parser_t &parser, job_t *j )
( buffer_stdout ) ) ( buffer_stdout ) )
{ {
std::string res = wcs2string( get_stdout_buffer() ); std::string res = wcs2string( get_stdout_buffer() );
b_append( io->param2.out_buffer, res.c_str(), res.size() ); b_append( io->out_buffer, res.c_str(), res.size() );
skip_fork = 1; skip_fork = 1;
} }
@ -1378,9 +1378,9 @@ static int exec_subshell_internal( const wcstring &cmd, wcstring_list_t *lst )
is_subshell = prev_subshell; is_subshell = prev_subshell;
b_append( io_buffer->param2.out_buffer, &z, 1 ); b_append( io_buffer->out_buffer, &z, 1 );
begin=end=io_buffer->param2.out_buffer->buff; begin=end=io_buffer->out_buffer->buff;
if( lst ) if( lst )
{ {

20
io.cpp
View file

@ -91,7 +91,7 @@ void io_buffer_read( io_data_t *d )
} }
else else
{ {
b_append( d->param2.out_buffer, b, l ); b_append( d->out_buffer, b, l );
} }
} }
} }
@ -100,21 +100,20 @@ void io_buffer_read( io_data_t *d )
io_data_t *io_buffer_create( int is_input ) io_data_t *io_buffer_create( int is_input )
{ {
io_data_t *buffer_redirect = new io_data_t(); std::auto_ptr<io_data_t> buffer_redirect(new io_data_t());
buffer_redirect->io_mode=IO_BUFFER; buffer_redirect->io_mode=IO_BUFFER;
buffer_redirect->next=0; buffer_redirect->next=0;
buffer_redirect->param2.out_buffer= (buffer_t *)malloc( sizeof(buffer_t)); buffer_redirect->out_buffer= (buffer_t *)malloc( sizeof(buffer_t));
buffer_redirect->is_input = is_input; buffer_redirect->is_input = is_input;
b_init( buffer_redirect->param2.out_buffer ); b_init( buffer_redirect->out_buffer );
buffer_redirect->fd=is_input?0:1; buffer_redirect->fd=is_input?0:1;
if( exec_pipe( buffer_redirect->param1.pipe_fd ) == -1 ) if( exec_pipe( buffer_redirect->param1.pipe_fd ) == -1 )
{ {
debug( 1, PIPE_ERROR ); debug( 1, PIPE_ERROR );
wperror (L"pipe"); wperror (L"pipe");
free( buffer_redirect->param2.out_buffer ); free( buffer_redirect->out_buffer );
free( buffer_redirect );
return 0; return 0;
} }
else if( fcntl( buffer_redirect->param1.pipe_fd[0], else if( fcntl( buffer_redirect->param1.pipe_fd[0],
@ -123,11 +122,10 @@ io_data_t *io_buffer_create( int is_input )
{ {
debug( 1, PIPE_ERROR ); debug( 1, PIPE_ERROR );
wperror( L"fcntl" ); wperror( L"fcntl" );
free( buffer_redirect->param2.out_buffer ); free( buffer_redirect->out_buffer );
free( buffer_redirect );
return 0; return 0;
} }
return buffer_redirect; return buffer_redirect.release();
} }
void io_buffer_destroy( io_data_t *io_buffer ) void io_buffer_destroy( io_data_t *io_buffer )
@ -149,9 +147,9 @@ void io_buffer_destroy( io_data_t *io_buffer )
calling exec_read_io_buffer on the buffer calling exec_read_io_buffer on the buffer
*/ */
b_destroy( io_buffer->param2.out_buffer ); b_destroy( io_buffer->out_buffer );
free( io_buffer->param2.out_buffer ); free( io_buffer->out_buffer );
delete io_buffer; delete io_buffer;
} }

9
io.h
View file

@ -38,15 +38,14 @@ struct io_data_t
{ {
/** file creation flags to send to open for IO_FILE */ /** file creation flags to send to open for IO_FILE */
int flags; int flags;
/** buffer to save output in for IO_BUFFER */
buffer_t *out_buffer;
/** Whether to close old_fd for IO_FD */ /** Whether to close old_fd for IO_FD */
int close_old; int close_old;
} param2; } param2;
/** /** buffer to save output in for IO_BUFFER */
Set to true if this is an input io redirection buffer_t *out_buffer;
*/
/** Set to true if this is an input io redirection */
int is_input; int is_input;
/** Pointer to the next IO redirection */ /** Pointer to the next IO redirection */

View file

@ -881,7 +881,7 @@ static void read_try( job_t *j )
} }
else else
{ {
b_append( buff->param2.out_buffer, b, l ); b_append( buff->out_buffer, b, l );
} }
} }
} }

View file

@ -1174,7 +1174,7 @@ static void run_pager( wchar_t *prefix, int is_quoted, const std::vector<complet
free( escaped_separator ); free( escaped_separator );
foo = wcs2str(msg.c_str()); foo = wcs2str(msg.c_str());
b_append( in->param2.out_buffer, foo, strlen(foo) ); b_append( in->out_buffer, foo, strlen(foo) );
free( foo ); free( foo );
term_donate(); term_donate();
@ -1190,10 +1190,10 @@ static void run_pager( wchar_t *prefix, int is_quoted, const std::vector<complet
io_buffer_read( out ); io_buffer_read( out );
int nil=0; int nil=0;
b_append( out->param2.out_buffer, &nil, 1 ); b_append( out->out_buffer, &nil, 1 );
wchar_t *tmp; wchar_t *tmp;
wchar_t *str = str2wcs((char *)out->param2.out_buffer->buff); wchar_t *str = str2wcs((char *)out->out_buffer->buff);
if( str ) if( str )
{ {