> Fine, but I'm not sure whether I suggested a suitable solution or only a
> workaround which introduces a new bug: a real set limit of zero can't be
> ouptut any longer. Well, a real limit for h_vmem or h_rt being 0 isn't
> reasonable at all...
>
> You would have to test against 0 and output 0 as a string in this case to
> get the correct output.
>
> I think the original author tried to avoid several if-then-else tests
> there, but maybe such an implementation is the only one being correct.
>
> -- Reuti
You mean something like this, which does away with the macros
altogether.
------8<-------------8<-------------8<-------------8<-------------8<-------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#if defined(DARWIN) || defined(FREEBSD) || defined(NETBSD)
# include <sys/time.h>
#endif
#if defined(CRAY)
# include <sys/param.h>
# include <sys/unistd.h>
# include <sys/category.h>
#endif
#include <sys/resource.h>
#if defined(IRIX)
# define RLIMIT_STRUCT_TAG rlimit64
# define RLIMIT_INFINITY RLIM64_INFINITY
#else
# define RLIMIT_STRUCT_TAG rlimit
# define RLIMIT_INFINITY RLIM_INFINITY
#endif
int main( void ) {
/* int resource = RLIMIT_CORE ; */
int resource = RLIMIT_FSIZE ;
char trace_str[1024];
char trace_str2[1024];
#if defined(NECSX4) || defined(NECSX5) || defined(NETBSD_ALPHA) ||
defined(NETBSD_X86_64) || defined(NETBSD_SPARC64)
char *limit_fmt = "%ld" ;
#elif defined(IRIX) || defined(HPUX) || defined(DARWIN) ||
defined(FREEBSD) || defined(NETBSD) || defined(INTERIX)
char *limit_fmt = "%lld" ;
#elif (defined(LINUX) && defined(TARGET_32BIT))
char *limit_fmt = "%llu";
#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
char *limit_fmt = "%lu" ;
#else
char *limit_fmt = "%d" ;
#endif
struct RLIMIT_STRUCT_TAG dlp;
#if defined(IRIX)
getrlimit64(resource,&dlp);
#else
getrlimit(resource,&dlp);
#endif
dlp.rlim_max = RLIMIT_INFINITY ;
strcpy(trace_str, "soft ") ;
if( dlp.rlim_cur == RLIMIT_INFINITY ) {
sprintf(trace_str2, "%sINFINITY", trace_str ) ;
}
else {
strcat(trace_str, limit_fmt) ;
sprintf(trace_str2, trace_str, dlp.rlim_cur ) ;
}
strcat(trace_str2, " hard ") ;
if( dlp.rlim_max == RLIMIT_INFINITY ) {
sprintf(trace_str, "%sINFINITY", trace_str2 ) ;
}
else {
strcat(trace_str2, limit_fmt) ;
sprintf(trace_str, trace_str2, dlp.rlim_max ) ;
}
printf( "%s\n", trace_str );
return(0);
}
------8<-------------8<-------------8<-------------8<-------------8<-------
and just keep adding parts of the string required for the
shepherd trace, whilst swapping trace_str and trace_str2.
Either that or steal the formatting code from some shell's
ulimit builtin?
--
Kevin M. Buckley Room: CO327
School of Engineering and Phone: +64 4 463 5971
Computer Science
Victoria University of Wellington
New Zealand
_______________________________________________
users mailing list
[email protected]
https://gridengine.org/mailman/listinfo/users