[Patch] bproc_pidghostnode()
Jag
agrajag@linuxpower.org
Thu, 15 Feb 2001 19:31:31 -0800
--ynll37MX3Fmyj3VY
Content-Type: multipart/mixed; boundary="NqXz6hVRMdSFrLFa"
Content-Disposition: inline
--NqXz6hVRMdSFrLFa
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
This patch adds the function bproc_pidghostnode() to libbproc. With the
addition of this function, bpstat no longer needs to directly mmap
/var/run/bproc_status and can instead just use libbproc's functionality
for that. This patch also modifies bpstat so that it does use libbproc
instead of directly mmaping /var/run/bproc_status.
You need to apply the patch for bproc_pidlist() and bproc_pidnode() I
sent this morning in order for this patch to work.
Jag
--NqXz6hVRMdSFrLFa
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="bproc-2.2-ghostnode.patch"
Content-Transfer-Encoding: quoted-printable
diff -ur bproc-2.2.fixpids/clients/bproc.c bproc-2.2.ghostnode/clients/bpro=
c.c
--- bproc-2.2.fixpids/clients/bproc.c Thu Feb 15 18:38:38 2001
+++ bproc-2.2.ghostnode/clients/bproc.c Thu Feb 15 18:41:12 2001
@@ -292,6 +292,17 @@
}
}
=20
+int bproc_pidghostnode(int pid) {
+ if (pid < 0 || pid >=3D MAXPID) return -1;
+ if (!status) map_process_state();
+ if (!status) return BPROC_NODE_NONE;
+ if (status[pid].proc || status[pid].ghost) {
+ return node_number(status[pid].ghost);
+ } else {
+ return BPROC_NODE_NONE;
+ }
+}
+
int *bproc_pidlist(void) {
int *list;
int i, j;
diff -ur bproc-2.2.fixpids/clients/bpstat.c bproc-2.2.ghostnode/clients/bps=
tat.c
--- bproc-2.2.fixpids/clients/bpstat.c Fri Dec 1 11:41:50 2000
+++ bproc-2.2.ghostnode/clients/bpstat.c Thu Feb 15 19:01:39 2001
@@ -32,24 +32,6 @@
#include <errno.h>
#include <netinet/in.h>
=20
-/* This stuff should really be in a shared header file somewhere. */
-#define MAXPID 32768
-struct assoc_t {
- void *move_req_id; /* Request ID of move in progress */
-
- /* Other locations */
- struct node_t *proc; /* Where a process exists */
- struct node_t *movingto; /* Where a process is in the process of movin=
g to */
- struct node_t *last_loc; /* Where a process was located last */
- struct node_t *ghost; /* Where a process has a ghost */
-};
-
-#define PROCESS_STATUS_FILE "/var/run/bproc_status"
-
-unsigned long node_offset;
-unsigned long node_size;
-struct assoc_t *status;
-
char *node_state_strings[] =3D BPROC_NODE_STATE_STRINGS;
char *ip2str(struct sockaddr_in *addr) {
static char buf[30];
@@ -61,28 +43,6 @@
return buf;
}
=20
-void mmap_status_file(void) {
- int fd;
- unsigned long *ptr;
- fd =3D open(PROCESS_STATUS_FILE, O_RDONLY);
- if (fd =3D=3D -1) {
- perror(PROCESS_STATUS_FILE);
- exit(1);
- }
- =20
- status =3D mmap(0, sizeof(struct assoc_t) * MAXPID + sizeof(long)*2,
- PROT_READ, MAP_SHARED, fd, 0);
- if (status =3D=3D MAP_FAILED) {
- perror("mmap");
- exit(1);
- }
- close(fd);
-
- ptr =3D (unsigned long *) &status[MAXPID];
- node_offset =3D ptr[0];
- node_size =3D ptr[1];
-}
-
/* Print general machine state */
void print_machine_state(void) {
int i, stat, num;
@@ -148,22 +108,20 @@
=20
=20
=20
-int node_number(struct node_t *node) {
- if (node =3D=3D 0) return -1;
- return (((long)node)-node_offset)/node_size;
-}
-
void print_process_state(void) {
int i;
- mmap_status_file();
+ int *pidlist;
+
printf("PID\tNode\tGhost\n");
- for (i=3D0; i < MAXPID; i++) {
- if (status[i].proc =3D=3D 0 && status[i].ghost =3D=3D 0) continue;
+ pidlist =3D bproc_pidlist();
+ if (!pidlist)
+ return;
+ for (i=3D0; pidlist[i]; i++) {
printf("%d\t%d\t%d\n", i,
- node_number(status[i].proc),
- node_number(status[i].ghost));
+ bproc_pidnode(pidlist[i]),
+ bproc_pidghostnode(pidlist[i]));
}
- munmap(status, sizeof(struct assoc_t) * MAXPID + sizeof(long)*2);
+ free(pidlist);
}
=20
void print_node_address(char *_arg) {
@@ -206,8 +164,8 @@
int pid;
char line[10000], *check;
int pidoffset;
+ int pidnode;
=20
- mmap_status_file();
=20
if (!fgets(line, 10000, stdin)) return;
/* This is the header line... we need to find "PID" */
@@ -232,8 +190,9 @@
fprintf(stderr, "punting on: %s", line);
continue;
}
- if (status[pid].proc)
- printf("%d\t", node_number(status[pid].proc));
+ pidnode =3D bproc_pidnode(pid);
+ if (pidnode >=3D 0)
+ printf("%d\t", pidnode);
else
fputs("\t",stdout);
fputs(line,stdout);
diff -ur bproc-2.2.fixpids/clients/sys/bproc.h bproc-2.2.ghostnode/clients/=
sys/bproc.h
--- bproc-2.2.fixpids/clients/sys/bproc.h Fri Dec 1 11:41:50 2000
+++ bproc-2.2.ghostnode/clients/sys/bproc.h Thu Feb 15 18:41:24 2001
@@ -83,6 +83,7 @@
=20
/* Process information functions */
int bproc_pidnode(int pid);
+int bproc_pidghostnode(int pid);
int *bproc_pidlist(void);
=20
int bproc_rexec (int node, const char *cmd, char * const argv[],
--NqXz6hVRMdSFrLFa--
--ynll37MX3Fmyj3VY
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iD8DBQE6jJ8T+pq97aGGtXARAqoOAKCDYUs3D9VU5IPJH77aucUznjeNuwCffECU
sLYwO18ss8TnZhn5RZynyvw=
=0vjx
-----END PGP SIGNATURE-----
--ynll37MX3Fmyj3VY--