-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools lib api: Adopt fdarray class from perf's evlist
The extensible file description array that grew in the perf_evlist class can be useful for other tools, as it is not something that only evlists need, so move it to tools/lib/api/fd to ease sharing it. v2: Don't use {} like in: libapi_dirs: $(QUIET_MKDIR)mkdir -p $(OUTPUT){fs,fd}/ in Makefiles, as it will not work in some systems, as in ubuntu13.10. v3: Add fd/*.[ch] to LIBAPIKFS_SOURCES (Fix from Jiri Olsa) v4: Leave the fcntl(fd, O_NONBLOCK) in the evlist layer, remains to be checked if it is really needed there, but has no place in the fdarray class (Fix from Jiri Olsa) v5: Remove evlist details from fdarray grow/filter tests. Improve it a bit doing more tests about expected internal state. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Borislav Petkov <bp@suse.de> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jean Pihet <jean.pihet@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-kleuni3hckbc3s0lu6yb9x40@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Arnaldo Carvalho de Melo
committed
Sep 25, 2014
1 parent
f66a889
commit 1b85337
Showing
12 changed files
with
342 additions
and
278 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
/* | ||
* Copyright (C) 2014, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> | ||
* | ||
* Released under the GPL v2. (and only v2, not any later version) | ||
*/ | ||
#include "array.h" | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <poll.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
|
||
void fdarray__init(struct fdarray *fda, int nr_autogrow) | ||
{ | ||
fda->entries = NULL; | ||
fda->nr = fda->nr_alloc = 0; | ||
fda->nr_autogrow = nr_autogrow; | ||
} | ||
|
||
int fdarray__grow(struct fdarray *fda, int nr) | ||
{ | ||
int nr_alloc = fda->nr_alloc + nr; | ||
size_t size = sizeof(struct pollfd) * nr_alloc; | ||
struct pollfd *entries = realloc(fda->entries, size); | ||
|
||
if (entries == NULL) | ||
return -ENOMEM; | ||
|
||
fda->nr_alloc = nr_alloc; | ||
fda->entries = entries; | ||
return 0; | ||
} | ||
|
||
struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow) | ||
{ | ||
struct fdarray *fda = calloc(1, sizeof(*fda)); | ||
|
||
if (fda != NULL) { | ||
if (fdarray__grow(fda, nr_alloc)) { | ||
free(fda); | ||
fda = NULL; | ||
} else { | ||
fda->nr_autogrow = nr_autogrow; | ||
} | ||
} | ||
|
||
return fda; | ||
} | ||
|
||
void fdarray__exit(struct fdarray *fda) | ||
{ | ||
free(fda->entries); | ||
fdarray__init(fda, 0); | ||
} | ||
|
||
void fdarray__delete(struct fdarray *fda) | ||
{ | ||
fdarray__exit(fda); | ||
free(fda); | ||
} | ||
|
||
int fdarray__add(struct fdarray *fda, int fd, short revents) | ||
{ | ||
if (fda->nr == fda->nr_alloc && | ||
fdarray__grow(fda, fda->nr_autogrow) < 0) | ||
return -ENOMEM; | ||
|
||
fda->entries[fda->nr].fd = fd; | ||
fda->entries[fda->nr].events = revents; | ||
fda->nr++; | ||
return 0; | ||
} | ||
|
||
int fdarray__filter(struct fdarray *fda, short revents) | ||
{ | ||
int fd, nr = 0; | ||
|
||
if (fda->nr == 0) | ||
return 0; | ||
|
||
for (fd = 0; fd < fda->nr; ++fd) { | ||
if (fda->entries[fd].revents & revents) | ||
continue; | ||
|
||
if (fd != nr) | ||
fda->entries[nr] = fda->entries[fd]; | ||
|
||
++nr; | ||
} | ||
|
||
return fda->nr = nr; | ||
} | ||
|
||
int fdarray__poll(struct fdarray *fda, int timeout) | ||
{ | ||
return poll(fda->entries, fda->nr, timeout); | ||
} | ||
|
||
int fdarray__fprintf(struct fdarray *fda, FILE *fp) | ||
{ | ||
int fd, printed = fprintf(fp, "%d [ ", fda->nr); | ||
|
||
for (fd = 0; fd < fda->nr; ++fd) | ||
printed += fprintf(fp, "%s%d", fd ? ", " : "", fda->entries[fd].fd); | ||
|
||
return printed + fprintf(fp, " ]"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#ifndef __API_FD_ARRAY__ | ||
#define __API_FD_ARRAY__ | ||
|
||
#include <stdio.h> | ||
|
||
struct pollfd; | ||
|
||
struct fdarray { | ||
int nr; | ||
int nr_alloc; | ||
int nr_autogrow; | ||
struct pollfd *entries; | ||
}; | ||
|
||
void fdarray__init(struct fdarray *fda, int nr_autogrow); | ||
void fdarray__exit(struct fdarray *fda); | ||
|
||
struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow); | ||
void fdarray__delete(struct fdarray *fda); | ||
|
||
int fdarray__add(struct fdarray *fda, int fd, short revents); | ||
int fdarray__poll(struct fdarray *fda, int timeout); | ||
int fdarray__filter(struct fdarray *fda, short revents); | ||
int fdarray__grow(struct fdarray *fda, int extra); | ||
int fdarray__fprintf(struct fdarray *fda, FILE *fp); | ||
|
||
static inline int fdarray__available_entries(struct fdarray *fda) | ||
{ | ||
return fda->nr_alloc - fda->nr; | ||
} | ||
|
||
#endif /* __API_FD_ARRAY__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.