Index: src/backend/postmaster/pgstat.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v retrieving revision 1.118 diff -c -c -r1.118 pgstat.c *** src/backend/postmaster/pgstat.c 3 Jan 2006 19:54:08 -0000 1.118 --- src/backend/postmaster/pgstat.c 4 Jan 2006 23:22:44 -0000 *************** *** 1839,1845 **** int msg_recv = 0; /* next receive index */ int msg_have = 0; /* number of bytes stored */ bool overflow = false; ! /* * Identify myself via ps */ --- 1839,1847 ---- int msg_recv = 0; /* next receive index */ int msg_have = 0; /* number of bytes stored */ bool overflow = false; ! bool is_block_mode = false; ! int cnt = 0, bloops = 0, nbloops = 0; ! /* * Identify myself via ps */ *************** *** 1870,1875 **** --- 1872,1921 ---- */ msgbuffer = (char *) palloc(PGSTAT_RECVBUFFERSZ); + + while (1) + { + #if 0 + FD_ZERO(&rfds); + FD_ZERO(&wfds); + maxfd = -1; + FD_SET(pgStatSock, &rfds); + maxfd = pgStatSock; + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + select(maxfd + 1, &rfds, &wfds, NULL, &timeout); + #endif + + if (is_block_mode) + bloops++; + else + nbloops++; + + len = recv(pgStatSock, (char *) &input_buffer, + sizeof(PgStat_Msg), 0); + if (len > 0) + cnt += len; + + //fprintf(stderr, "len = %d, errno = %d\n", len, errno); + + if (len > 0 && is_block_mode) + { + pg_set_noblock(pgStatSock); + is_block_mode = false; + } + else if (len < 0 && errno == EAGAIN && !is_block_mode) + { + pg_set_block(pgStatSock); + is_block_mode = true; + } + // if ((bloops + nbloops) % 1000 == 0) + // fprintf(stderr, "cnt = %d, len = %d, bloops = %d, nbloops = %d\n", cnt, len, bloops, nbloops); + } + + exit(1); + /* * Loop forever */