diff options
author | Martin Baulig <martin@home-of-linux.org> | 1999-11-28 16:21:51 +0000 |
---|---|---|
committer | Martin Baulig <martin@src.gnome.org> | 1999-11-28 16:21:51 +0000 |
commit | aeeef43f4547b5ae14e1b798f37ea2e81f757376 (patch) | |
tree | 92818233b5c1843503e431286731f941e010366a /lib/lib.pl | |
parent | b60b7fd20199cf72ce23e638d50d9d6f90662023 (diff) | |
download | libgtop-aeeef43f4547b5ae14e1b798f37ea2e81f757376.tar.gz |
We now have a new, more extensible client/server communication model.
1999-11-28 Martin Baulig <martin@home-of-linux.org>
* lib/lib.pl: We now have a new, more extensible client/server
communication model. Include `$(top_srcdir)/scripts/c_types.pl' here.
Diffstat (limited to 'lib/lib.pl')
-rwxr-xr-x | lib/lib.pl | 271 |
1 files changed, 151 insertions, 120 deletions
@@ -1,9 +1,13 @@ #!/usr/bin/perl +require 'c_types.pl'; + $[ = 1; # set array base to 1 $, = ' '; # set output field separator $\ = "\n"; # set output record separator +$always_use_temp_storage = 1; + sub toupper { local($_) = @_; tr/a-z/A-Z/; @@ -22,6 +26,7 @@ print ''; print '#include <glibtop.h>'; print '#include <glibtop/open.h>'; +print '#include <glibtop/xmalloc.h>'; print ''; print '#include <glibtop/sysdeps.h>'; print '#include <glibtop/union.h>'; @@ -64,15 +69,6 @@ print ''; print '/* Library functions. */'; print ''; -$convert{'long'} = 'int64_t'; -$convert{'ulong'} = 'u_int64_t'; -$convert{'pid_t'} = 'pid_t'; -$convert{'int'} = 'int'; -$convert{'retval'} = 'int'; -$convert{'ushort'} = 'unsigned short'; -$convert{'unsigned'} = 'unsigned'; -$convert{'string'} = 'const char *'; - while (<>) { chop; # strip record separator @@ -116,149 +112,184 @@ sub output { $prefix_space = ''; } - print $retval; - - if ($param_def eq 'string') { - $call_param = ', ' . $line_fields[5]; - $param_decl = ",\n " . $space . ' const char *' . - - $line_fields[5]; - $send_ptr = "\n\tconst void *send_ptr = " . $line_fields[5] . ';'; - $send_size = "\n\tconst size_t send_size =\n\t\tstrlen (" . + $check_server_code = "\n"; + $check_server_code .= + "\t/* If neccessary, we ask the server for the requested\n" . + "\t * feature. If not, we call the sysdeps function. */\n\n" . + "\tif ((server->flags & _GLIBTOP_INIT_STATE_SERVER) &&\n" . + "\t (server->features & (1 << GLIBTOP_SYSDEPS_" . + &toupper($feature) . ")))\n" . + "\t\tgoto call_server;\n\telse\n" . + "\t\tgoto call_sysdeps;\n\n"; + + $need_temp_storage = $always_use_temp_storage; + $size_code = "\t_LIBGTOP_SEND_len = 0;\n"; + $marshal_code = "\t_LIBGTOP_SEND_offset = 0;\n"; + $marshal_code .= "\tmemset (_LIBGTOP_SEND_buf, 0, _LIBGTOP_SEND_len);\n"; + $first_param_name = ''; + + $call_param = ''; + $param_decl = ''; + $need_temp_len = 0; + $nr_params = (@params = split(/:/, $param_def, 9999)); + for ($param = 1; $param <= $nr_params; $param++) { + $list = $params[$param]; + $type = $params[$param]; + $type =~ s/\(.*//; + $list =~ s/^.*\(//; + $list =~ s/\)$//; + $count = (@fields = split(/,/, $list, 9999)); + for ($field = 1; $field <= $count; $field++) { + my $c_type = $typeinfo->{$type}->[1]; + + if ($first_param_name eq '') { + $first_param_name = $fields[$field]; + } - $line_fields[5] . ') + 1;'; - } - else { - $call_param = ''; - $param_decl = ''; - $send_size = ''; - $send_ptr = ''; - $nr_params = (@params = split(/:/, $param_def, 9999)); - for ($param = 1; $param <= $nr_params; $param++) { - $list = $params[$param]; - $type = $params[$param]; - $type =~ s/\(.*//; - $list =~ s/^.*\(//; - $list =~ s/\)$//; - $count = (@fields = split(/,/, $list, 9999)); - for ($field = 1; $field <= $count; $field++) { - if ($param_decl eq '') { - $param_decl = ",\n " . $space . ' '; - } - else { - $param_decl = $param_decl . ', '; - } - $param_decl = $param_decl . '' . $convert{$type} . ' ' . - - $fields[$field]; - $call_param = $call_param . ', ' . $fields[$field]; - if ($send_ptr eq '') { - $send_ptr = "\n\tconst void *send_ptr = &" . - - $fields[$field] . ';'; - } - if ($send_size eq '') { - $send_size = "\n\tconst size_t send_size =\n\t\t"; - } - else { - $send_size = $send_size . ' + '; - } - $send_size = $send_size . 'sizeof (' . $fields[$field] . ')'; - } + if ($typeinfo->{$type}->[2]) { + $need_temp_storage = 1; } - if ($send_size ne '') { - $send_size = $send_size . ';'; + + if ($param_decl eq '') { + $param_decl = ",\n " . $space . ' '; } else { - $send_size = "\n\tconst size_t send_size = 0;"; + $param_decl = $param_decl . ', '; } - if ($send_ptr eq '') { - $send_ptr = "\n\tconst void *send_ptr = NULL;"; + $param_decl = $param_decl . $c_type . ' ' . $fields[$field]; + $call_param = $call_param . ', ' . $fields[$field]; + + $size_code .= "\t_LIBGTOP_SEND_len += "; + if (defined $sizeof_funcs->{$type}) { + $size_code .= $sizeof_funcs->{$type}->($fields[$field]); + } else { + $size_code .= sprintf ("sizeof (%s)", $c_type); } - } + $size_code .= ";\n"; - if ($line_fields[3] eq '') { - print 'glibtop_get_' . $feature . '_l (glibtop *server' . $param_decl . ')'; - } else { - print 'glibtop_get_' . $feature . '_l (glibtop *server, glibtop_' . - $feature . ' *buf' . $param_decl . ')'; + $marshal_code .= "\t_LIBGTOP_SEND_ptr = ". + "(char *) _LIBGTOP_SEND_buf + _LIBGTOP_SEND_offset;\n"; + + if (defined $marshal_funcs->{$type}) { + $marshal_code .= $marshal_funcs->{$type}->($c_type, $fields[$field], "\t"); + } else { + $marshal_code .= sprintf ("\tmemcpy (_LIBGTOP_SEND_ptr, %s, %s);\n", + '&'.$fields[$field], "sizeof ($c_type)"); + } + + $marshal_code .= "\t_LIBGTOP_SEND_offset += "; + if (defined $sizeof_funcs->{$type}) { + $marshal_code .= $sizeof_funcs->{$type}->($fields[$field]); + } else { + $marshal_code .= sprintf ("sizeof (%s)", $c_type); + } + $marshal_code .= ";\n"; + } } - print '{' . $send_ptr . '' . $send_size; + $local_var_code = ""; + $local_var_code .= "\tunsigned _LIBGTOP_SEND_offset, _LIBGTOP_SEND_len;\n"; + if ($need_temp_len) { + $local_var_code .= "\tunsigned _LIBGTOP_SEND_temp_len;\n"; + } + $local_var_code .= "\tvoid *_LIBGTOP_SEND_buf;\n"; + $local_var_code .= "\tchar *_LIBGTOP_SEND_ptr;\n"; if ($retval !~ /^void$/) { - print "\t" . $retval . ' retval = (' . $retval . ') 0;'; + $local_var_code .= sprintf ("\t%s retval = (%s) 0;\n", + $retval, $retval); } - print ''; - - print "\tglibtop_init_r (&server, (1 << GLIBTOP_SYSDEPS_" . - - &toupper($feature) . '), 0);'; - - print ''; - print "\t/* If neccessary, we ask the server for the requested"; - print "\t * feature. If not, we call the sysdeps function. */"; - print ''; - - print "\tif ((server->flags & _GLIBTOP_INIT_STATE_SERVER) &&"; - print "\t (server->features & (1 << GLIBTOP_SYSDEPS_" . - &toupper($feature) . ')))'; - print "\t{"; - - print "\t\t" . $call_prefix . 'glibtop_call_l (server, GLIBTOP_CMND_' . + $sysdeps_code = "call_sysdeps:\n"; + if ($orig !~ /^@/) { + $sysdeps_code .= sprintf ("#if (!GLIBTOP_SUID_%s)\n", &toupper($feature)); + } - &toupper($feature) . ','; - print "\t\t\t\t" . $call_prefix_space . 'send_size, send_ptr,'; if ($line_fields[3] eq '') { - print "\t\t\t\t". $call_prefix_space . "0, NULL,"; + $sysdeps_code .= sprintf ("\t%sglibtop_get_%s_s (server%s);\n", + $prefix, $feature, $call_param); } else { - print "\t\t\t\t" . $call_prefix_space . 'sizeof (glibtop_' . $feature . - '), buf,'; + $sysdeps_code .= sprintf ("\t%sglibtop_get_%s_s (server, buf%s);\n", + $prefix, $feature, $call_param); } - print "\t\t\t\t" . $call_prefix_space . $retval_param . ');'; - - print "\t} else {"; + $sysdeps_code .= "\tgoto check_missing;\n"; if ($orig !~ /^@/) { - print '#if (!GLIBTOP_SUID_' . &toupper($feature) . ')'; + $sysdeps_code .= "#else\n\terrno = ENOSYS;\n"; + $sysdeps_code .= sprintf ("\tglibtop_error_io_r (server, \"%s\");\n", + "glibtop_get_" . $feature); + $sysdeps_code .= "\tgoto do_return;\n"; + $sysdeps_code .= "#endif\n"; } - if ($line_fields[3] eq '') { - print "\t\t" . $prefix . 'glibtop_get_' . $feature . '_s (server' . - $call_param . ');'; + $total_code = sprintf ("%s%s%s\n", $init_code, $check_server_code, + $sysdeps_code); + + $send_buf_code = "\t_LIBGTOP_SEND_buf = "; + if ($need_temp_storage) { + $send_buf_code .= "glibtop_malloc_r (server, _LIBGTOP_SEND_len+1)"; } else { - print "\t\t" . $prefix . 'glibtop_get_' . $feature . '_s (server, buf' . - $call_param . ');'; + $send_buf_code .= '(void *) &'.$first_param_name; } + $send_buf_code .= ";\n"; - if ($orig !~ /^@/) { - print '#else'; - print "\t\terrno = ENOSYS;"; - print "\t\tglibtop_error_io_r (server, \"glibtop_get_" . $feature . + $call_code = ''; + $call_code .= sprintf ("\t%sglibtop_call_l (server, GLIBTOP_CMND_%s,\n", + $call_prefix, &toupper($feature)); + $call_code .= sprintf ("\t\t\t%s%s, %s,\n", $call_prefix_space, + "_LIBGTOP_SEND_len", "_LIBGTOP_SEND_ptr"); + if ($line_fields[3] eq '') { + $call_code .= sprintf ("\t\t\t%s0, NULL,\n", $call_prefix_space); + } else { + $call_code .= sprintf ("\t\t\t%ssizeof (glibtop_%s), buf,\n", + $call_prefix_space, $feature); + } + $call_code .= sprintf ("\t\t\t%s%s);\n", $call_prefix_space, $retval_param); - "\");"; - print '#endif'; + if ($need_temp_storage) { + $send_buf_free_code = "\tglibtop_free_r (server, _LIBGTOP_SEND_buf);\n"; + } else { + $send_buf_free_code = ""; } - print "\t}"; + $total_code .= sprintf ("call_server:\n%s\n%s\n%s\n%s\n%s\n", + $size_code, $send_buf_code, $marshal_code, + $call_code, $send_buf_free_code); - print ''; + $total_code .= "\tgoto check_missing;\n\n"; + $check_code = "check_missing:\n"; + $check_code .= "\t/* Make sure that all required fields are present. */\n"; if (!($line_fields[3] eq '')) { - print "\t/* Make sure that all required fields are present. */"; - print ''; - - print "\tif (buf->flags & server->required." . $feature . ')'; - print "\t\t_glibtop_missing_feature (server, \"" . $feature . - "\", buf->flags,"; - print "\t\t\t\t\t &server->required." . $feature . ');'; + $check_code .= "\tif (buf->flags & server->required." . $feature . ")\n"; + $check_code .= "\t\t_glibtop_missing_feature (server, \"" . $feature . + "\", buf->flags,\n\t\t\t\t\t &server->required." . $feature . ");\n"; } + $total_code .= $check_code."\tgoto do_return;\n\n"; + + $return_code = "do_return:\n"; if ($retval !~ /^void$/) { - print "\n\t/* Now we can return. */"; - print "\n\treturn retval;"; + $return_code .= "\treturn retval;\n"; + } else { + $return_code .= "\treturn;\n"; + } + + $total_code .= $return_code; + + $func_decl = $retval."\n"; + if ($line_fields[3] eq '') { + $func_decl .= sprintf ("glibtop_get_%s_l (glibtop *server%s)\n", + $feature, $param_decl); + } else { + $func_decl .= sprintf ("glibtop_get_%s_l (glibtop *server, %s *buf%s)\n", + $feature, 'glibtop_'.$feature, $param_decl); } - print '}'; - print ''; + $init_code = sprintf ("\tglibtop_init_r (&server, (1 << %s), 0);\n", + "GLIBTOP_SYSDEPS_".&toupper($feature)); + + $total_code = sprintf ("%s{\n%s\n%s\n%s}\n", $func_decl, + $local_var_code, $total_code); + + print $total_code; } |