diff options
Diffstat (limited to 'libglusterfs/src/fd.c')
| -rw-r--r-- | libglusterfs/src/fd.c | 92 | 
1 files changed, 92 insertions, 0 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 50a564ee6..62a70c457 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -905,3 +905,95 @@ out:          return;  } + +void +fdentry_dump_to_dict (fdentry_t *fdentry, char *prefix, dict_t *dict, +                      int *openfds) +{ +        char    key[GF_DUMP_MAX_BUF_LEN] = {0,}; +        int     ret = -1; + +        if (!fdentry) +                return; +        if (!dict) +                return; + +        if (GF_FDENTRY_ALLOCATED != fdentry->next_free) +                return; + +        if (fdentry->fd) { +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "%s.pid", prefix); +                ret = dict_set_int32 (dict, key, fdentry->fd->pid); +                if (ret) +                        return; + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "%s.refcount", prefix); +                ret = dict_set_int32 (dict, key, fdentry->fd->refcount); +                if (ret) +                        return; + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "%s.flags", prefix); +                ret = dict_set_int32 (dict, key, fdentry->fd->flags); + +                (*openfds)++; +        } +        return; +} + +void +fdtable_dump_to_dict (fdtable_t *fdtable, char *prefix, dict_t *dict) +{ +        char    key[GF_DUMP_MAX_BUF_LEN] = {0,}; +        int     i = 0; +        int     openfds = 0; +        int     ret = -1; + +        if (!fdtable) +                return; +        if (!dict) +                return; + +        ret = pthread_mutex_trylock (&fdtable->lock); +        if (ret) +                goto out; + +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "%s.fdtable.refcount", prefix); +        ret = dict_set_int32 (dict, key, fdtable->refcount); +        if (ret) +                goto out; + +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "%s.fdtable.maxfds", prefix); +        ret = dict_set_uint32 (dict, key, fdtable->max_fds); +        if (ret) +                goto out; + +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "%s.fdtable.firstfree", prefix); +        ret = dict_set_int32 (dict, key, fdtable->first_free); +        if (ret) +                goto out; + +        for (i = 0; i < fdtable->max_fds; i++) { +                if (GF_FDENTRY_ALLOCATED == +                    fdtable->fdentries[i].next_free) { +                        memset (key, 0, sizeof (key)); +                        snprintf (key, sizeof (key), "%s.fdtable.fdentry%d", +                                  prefix, i); +                        fdentry_dump_to_dict (&fdtable->fdentries[i], key, +                                              dict, &openfds); +                } +        } + +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "%s.fdtable.openfds", prefix); +        ret = dict_set_int32 (dict, key, openfds); + +out: +        pthread_mutex_unlock (&fdtable->lock); +        return; +}  | 
