refactor libproc.so fu to be used elsewhere
This commit is contained in:
		
							parent
							
								
									91e2bce6dc
								
							
						
					
					
						commit
						f3705ac25d
					
				@ -399,6 +399,46 @@ int sigar_loadavg_get(sigar_t *sigar,
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LIBPROC "/usr/lib/libproc.so"
 | 
			
		||||
 | 
			
		||||
#define CHECK_PSYM(s) \
 | 
			
		||||
    if (!sigar->s) { \
 | 
			
		||||
        sigar_log_printf(sigar, SIGAR_LOG_WARN, \
 | 
			
		||||
                         "[%s] Symbol not found: %s", \
 | 
			
		||||
                         SIGAR_FUNC, #s); \
 | 
			
		||||
        dlclose(sigar->plib); \
 | 
			
		||||
        sigar->plib = NULL; \
 | 
			
		||||
        return SIGAR_ENOTIMPL; \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
static int sigar_init_libproc(sigar_t *sigar)
 | 
			
		||||
{
 | 
			
		||||
    if (sigar->plib) {
 | 
			
		||||
        return SIGAR_OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* libproc.so ships with 5.8+ */
 | 
			
		||||
    /* interface is undocumented, see libproc.h in the sun jdk sources */
 | 
			
		||||
    sigar->plib = dlopen(LIBPROC, RTLD_LAZY);
 | 
			
		||||
 | 
			
		||||
    if (!sigar->plib) {
 | 
			
		||||
        sigar_log_printf(sigar, SIGAR_LOG_WARN,
 | 
			
		||||
                         "[%s] dlopen(%s) = %s",
 | 
			
		||||
                         SIGAR_FUNC, LIBPROC, dlerror());
 | 
			
		||||
        return SIGAR_ENOTIMPL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sigar->pgrab    = (proc_grab_func_t)dlsym(sigar->plib, "Pgrab");
 | 
			
		||||
    sigar->pfree    = (proc_free_func_t)dlsym(sigar->plib, "Pfree");
 | 
			
		||||
    sigar->pobjname = (proc_objname_func_t)dlsym(sigar->plib, "Pobjname");
 | 
			
		||||
 | 
			
		||||
    CHECK_PSYM(pgrab);
 | 
			
		||||
    CHECK_PSYM(pfree);
 | 
			
		||||
    CHECK_PSYM(pobjname);
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_proc_list_get(sigar_t *sigar,
 | 
			
		||||
                        sigar_proc_list_t *proclist)
 | 
			
		||||
{
 | 
			
		||||
@ -716,18 +756,6 @@ static int sigar_read_xmaps(sigar_t *sigar,
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LIBPROC "/usr/lib/libproc.so"
 | 
			
		||||
 | 
			
		||||
#define CHECK_PSYM(s) \
 | 
			
		||||
    if (!sigar->s) { \
 | 
			
		||||
        sigar_log_printf(sigar, SIGAR_LOG_WARN, \
 | 
			
		||||
                         "[%s] Symbol not found: %s", \
 | 
			
		||||
                         SIGAR_FUNC, #s); \
 | 
			
		||||
        dlclose(sigar->plib); \
 | 
			
		||||
        sigar->plib = NULL; \
 | 
			
		||||
        return SIGAR_ENOTIMPL; \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
static int sigar_pgrab_modules(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                               sigar_proc_modules_t *procmods)
 | 
			
		||||
{
 | 
			
		||||
@ -739,25 +767,8 @@ static int sigar_pgrab_modules(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
    struct stat statbuf;
 | 
			
		||||
    char buffer[BUFSIZ];
 | 
			
		||||
 | 
			
		||||
    if (!sigar->plib) {
 | 
			
		||||
        /* libproc.so ships with 5.8+ */
 | 
			
		||||
        /* interface is undocumented, see libproc.h in the sun jdk sources */
 | 
			
		||||
        sigar->plib = dlopen(LIBPROC, RTLD_LAZY);
 | 
			
		||||
 | 
			
		||||
        if (!sigar->plib) {
 | 
			
		||||
            sigar_log_printf(sigar, SIGAR_LOG_WARN,
 | 
			
		||||
                             "[%s] dlopen(%s) = %s",
 | 
			
		||||
                             SIGAR_FUNC, LIBPROC, dlerror());
 | 
			
		||||
            return SIGAR_ENOTIMPL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sigar->pgrab    = (proc_grab_func_t)dlsym(sigar->plib, "Pgrab");
 | 
			
		||||
        sigar->pfree    = (proc_free_func_t)dlsym(sigar->plib, "Pfree");
 | 
			
		||||
        sigar->pobjname = (proc_objname_func_t)dlsym(sigar->plib, "Pobjname");
 | 
			
		||||
 | 
			
		||||
        CHECK_PSYM(pgrab);
 | 
			
		||||
        CHECK_PSYM(pfree);
 | 
			
		||||
        CHECK_PSYM(pobjname);
 | 
			
		||||
    if ((pstatus = sigar_init_libproc(sigar)) != SIGAR_OK) {
 | 
			
		||||
        return pstatus;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(phandle = sigar->pgrab(pid, 0x01, &pstatus))) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user