diff --git a/src/afsmonitor/Makefile.in b/src/afsmonitor/Makefile.in index 73ef4d2263..ea9ab15e08 100644 --- a/src/afsmonitor/Makefile.in +++ b/src/afsmonitor/Makefile.in @@ -7,7 +7,7 @@ srcdir=@srcdir@ include @TOP_OBJDIR@/src/config/Makefile.config -include @TOP_OBJDIR@/src/config/Makefile.lwp +include @TOP_OBJDIR@/src/config/Makefile.pthread INCLS=${TOP_INCDIR}/afs/gtxobjects.h \ @@ -26,17 +26,19 @@ INCLS=${TOP_INCDIR}/afs/gtxobjects.h \ ${TOP_INCDIR}/afs/xstat_cm.h \ afsmonitor.h \ afsmon-labels.h -LIBS=${TOP_LIBDIR}/libxstat_fs.a \ - ${TOP_LIBDIR}/libxstat_cm.a \ - ${TOP_LIBDIR}/libgtx.a \ - ${TOP_LIBDIR}/libafsint.a \ - ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/libafshcrypto_lwp.a \ - ${TOP_LIBDIR}/liblwp.a \ - ${TOP_LIBDIR}/libsys.a \ - $(TOP_LIBDIR)/libopr.a \ - ${TOP_LIBDIR}/util.a + +LT_deps=\ + $(top_builddir)/src/xstat/liboafs_xstat_fs.la \ + $(top_builddir)/src/xstat/liboafs_xstat_cm.la \ + $(top_builddir)/src/gtx/liboafs_gtx.la \ + $(top_builddir)/src/rxkad/liboafs_rxkad.la \ + $(top_builddir)/src/fsint/liboafs_fsint.la \ + $(top_builddir)/src/cmd/liboafs_cmd.la \ + $(top_builddir)/src/util/liboafs_util.la \ + $(top_builddir)/src/opr/liboafs_opr.la \ + $(top_builddir)/src/lwp/liboafs_lwpcompat.la \ + $(top_builddir)/src/volser/liboafs_volser.la \ + EXTRA_LIBS=${LIB_curses} ${XLIBS} @@ -46,13 +48,13 @@ afsmon-output.o: afsmon-output.c ${INCLS} afsmon-win.o: afsmon-win.c ${INCLS} afsmonitor.o: afsmonitor.c ${INCLS} AFS_component_version_number.c -afsmonitor: afsmonitor.o afsmon-win.o afsmon-output.o ${LIBS} - $(AFS_LDRULE) afsmonitor.o afsmon-win.o afsmon-output.o \ - ${LIBS} $(LIB_roken) ${EXTRA_LIBS} +afsmonitor: afsmonitor.o afsmon-win.o afsmon-output.o ${LT_deps} + $(LT_LDRULE_static) afsmonitor.o afsmon-win.o afsmon-output.o \ + ${LT_deps} $(LIB_roken) ${EXTRA_LIBS} -afsmon-parselog: afsmon-parselog.o ${LIBS} - $(AFS_LDRULE) afsmon-parselog.c \ - ${LIBS} $(LIB_roken) ${EXTRA_LIBS} +afsmon-parselog: afsmon-parselog.o ${LT_deps} + $(LT_LDRULE_static) afsmon-parselog.c \ + ${LT_deps} $(LIB_roken) ${EXTRA_LIBS} install: afsmonitor ${INSTALL} -d ${DESTDIR}${bindir} @@ -63,6 +65,7 @@ dest: afsmonitor ${INSTALL_PROGRAM} afsmonitor ${DEST}/bin/afsmonitor clean: + $(LT_CLEAN) $(RM) -f *.o afsmonitor AFS_component_version_number.c include ../config/Makefile.version diff --git a/src/fsprobe/.gitignore b/src/fsprobe/.gitignore index bf549b4dd0..72f58f19e5 100644 --- a/src/fsprobe/.gitignore +++ b/src/fsprobe/.gitignore @@ -2,4 +2,6 @@ # git ls-files -i --exclude-standard # to check that you haven't inadvertently ignored any tracked files. +/afscbint.h +/afscbint.ss.c /fsprobe_test diff --git a/src/fsprobe/Makefile.in b/src/fsprobe/Makefile.in index 3056500e78..fa9cb26195 100644 --- a/src/fsprobe/Makefile.in +++ b/src/fsprobe/Makefile.in @@ -7,29 +7,30 @@ srcdir=@srcdir@ include @TOP_OBJDIR@/src/config/Makefile.config -include @TOP_OBJDIR@/src/config/Makefile.lwp +include @TOP_OBJDIR@/src/config/Makefile.pthread +include @TOP_OBJDIR@/src/config/Makefile.libtool +INCLS=fsprobe.h ${TOP_INCDIR}/rx/rx.h -RPCINCLS=${TOP_INCDIR}/lwp.h ${TOP_INCDIR}/rx/rx.h +LT_deps = \ + $(top_builddir)/src/rxkad/liboafs_rxkad.la \ + $(top_builddir)/src/fsint/liboafs_fsint.la \ + $(top_builddir)/src/cmd/liboafs_cmd.la \ + $(top_builddir)/src/util/liboafs_util.la \ + $(top_builddir)/src/opr/liboafs_opr.la \ + $(top_builddir)/src/volser/liboafs_volser.la -INCLS=fsprobe.h ${RPCINCLS} +LT_objs = \ + fsprobe.lo \ + fsprobe_callback.lo \ + afscbint.ss.lo \ + AFS_component_version_number.lo -LIBS=${TOP_LIBDIR}/libvolser.a ${TOP_LIBDIR}/vlib.a ${TOP_LIBDIR}/libacl.a \ - ${TOP_LIBDIR}/libsys.a ${TOP_LIBDIR}/libvldb.a \ - ${TOP_LIBDIR}/libubik.a \ - ${TOP_LIBDIR}/libauth.a ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libcmd.a ${TOP_LIBDIR}/librxkad.a \ - ${TOP_LIBDIR}/libafscom_err.a ${TOP_LIBDIR}/libkauth.a \ - ${TOP_LIBDIR}/libaudit.a \ - ${TOP_LIBDIR}/libafsint.a \ - ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/liblwp.a \ - ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/util.a ${TOP_LIBDIR}/libopr.a \ - ${TOP_LIBDIR}/libafsrfc3961.a \ - ${TOP_LIBDIR}/libafshcrypto_lwp.a - -all: ${TOP_INCDIR}/afs/fsprobe.h ${TOP_LIBDIR}/libfsprobe.a fsprobe_test +all: \ + liboafs_fsprobe.la \ + ${TOP_INCDIR}/afs/fsprobe.h \ + ${TOP_LIBDIR}/libfsprobe.a \ + fsprobe_test ${TOP_INCDIR}/afs/fsprobe.h: fsprobe.h ${INSTALL_DATA} $? $@ @@ -40,18 +41,29 @@ ${TOP_LIBDIR}/libfsprobe.a: libfsprobe.a # # Build targets # -libfsprobe.a: fsprobe.o fsprobe_callback.o AFS_component_version_number.o - -$(RM) -f $@ - $(AR) crv $@ fsprobe.o fsprobe_callback.o AFS_component_version_number.o - $(RANLIB) $@ +liboafs_fsprobe.la: liboafs_fsprobe.la.sym $(LT_objs) $(LT_deps) + $(LT_LDLIB_shlib) $(LT_objs) $(LT_deps) $(LT_libs) -fsprobe.o: fsprobe.c ${INCLS} AFS_component_version_number.c +libfsprobe.a: $(LT_objs) + $(LT_LDLIB_static) $(LT_objs) -fsprobe_callback.o: fsprobe_callback.c ${INCLS} +# afscbint.ss.c is required for RXAFSCB_ExecuteRequest. +afscbint.h: $(top_builddir)/src/fsint/afscbint.h + ${INSTALL_DATA} $? $@ -fsprobe_test: fsprobe_test.o libfsprobe.a ${LIBS} - $(AFS_LDRULE) fsprobe_test.o libfsprobe.a \ - ${LIBS} $(LIB_roken) ${XLIBS} +afscbint.ss.c: $(top_builddir)/src/fsint/afscbint.ss.c + ${INSTALL_DATA} $? $@ + +fsprobe.lo: fsprobe.c ${INCLS} AFS_component_version_number.c +fsprobe_callback.lo: fsprobe_callback.c ${INCLS} +afscbint.ss.lo: afscbint.ss.c afscbint.h + +# +# Test programs +# +fsprobe_test: fsprobe_test.o libfsprobe.a $(LT_deps) + $(LT_LDRULE_static) fsprobe_test.o libfsprobe.a \ + $(LT_deps) $(LIB_roken) ${XLIBS} # # Install targets @@ -72,6 +84,8 @@ dest: fsprobe.h libfsprobe.a # Misc others # clean: - $(RM) -f *.o fsprobe_test libfsprobe.a core AFS_component_version_number.c + $(LT_CLEAN) + $(RM) -f *.o afscbint.ss.c afscbint.h fsprobe_test libfsprobe.a \ + core AFS_component_version_number.c include ../config/Makefile.version diff --git a/src/fsprobe/fsprobe.c b/src/fsprobe/fsprobe.c index 8ddb320049..00ed854a1a 100644 --- a/src/fsprobe/fsprobe.c +++ b/src/fsprobe/fsprobe.c @@ -18,7 +18,7 @@ #include -#include /*Lightweight process package */ +#include #include #include #include @@ -29,8 +29,6 @@ #include "fsprobe.h" /*Interface for this module */ -#define LWP_STACK_SIZE (16 * 1024) - /* * Exported variables. */ @@ -45,9 +43,11 @@ int fsprobe_ProbeFreqInSecs; /*Probe freq. in seconds */ static int fsprobe_initflag = 0; /*Was init routine called? */ static int fsprobe_debug = 0; /*Debugging output enabled? */ static int (*fsprobe_Handler) (void); /*Probe handler routine */ -static PROCESS probeLWP_ID; /*Probe LWP process ID */ +static pthread_t fsprobe_thread; /*Probe thread */ static int fsprobe_statsBytes; /*Num bytes in stats block */ static int fsprobe_probeOKBytes; /*Num bytes in probeOK block */ +static opr_mutex_t fsprobe_force_lock; /*Lock to force probe */ +static opr_cv_t fsprobe_force_cv; /*Condvar to force probe */ /*------------------------------------------------------------------------ * [private] fsprobe_CleanupInit @@ -194,7 +194,7 @@ fsprobe_Cleanup(int a_releaseMem) * [private] fsprobe_LWP * * Description: - * This LWP iterates over the server connections and gathers up + * This thread iterates over the server connections and gathers up * the desired statistics from each one on a regular basis. When * the sweep is done, the associated handler function is called * to process the new data. @@ -218,6 +218,7 @@ fsprobe_LWP(void *unused) static char rn[] = "fsprobe_LWP"; /*Routine name */ afs_int32 code; /*Results of calls */ struct timeval tv; /*Time structure */ + struct timespec wait; /*Time to wait */ int conn_idx; /*Connection index */ struct fsprobe_ConnectionInfo *curr_conn; /*Current connection */ struct ProbeViceStatistics *curr_stats; /*Current stats region */ @@ -352,20 +353,16 @@ fsprobe_LWP(void *unused) rn, code); /* - * Fall asleep for the prescribed number of seconds. + * Fall asleep for the prescribed number of seconds or wakeup + * sooner if forced. */ - tv.tv_sec = fsprobe_ProbeFreqInSecs; - tv.tv_usec = 0; - if (fsprobe_debug) - fprintf(stderr, "[%s] Falling asleep for %d seconds\n", rn, - fsprobe_ProbeFreqInSecs); - code = IOMGR_Select(0, /*Num fids */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors w/exceptional conditions */ - &tv); /*Ptr to timeout structure */ - if (code) - fprintf(stderr, "[%s] IOMGR_Select returned code %d\n", rn, code); + gettimeofday(&tv, NULL); + wait.tv_sec = tv.tv_sec + fsprobe_ProbeFreqInSecs; + wait.tv_nsec = tv.tv_usec * 1000; + opr_mutex_enter(&fsprobe_force_lock); + code = opr_cv_timedwait(&fsprobe_force_cv, &fsprobe_force_lock, &wait); + opr_Assert(code == 0 || code == ETIMEDOUT); + opr_mutex_exit(&fsprobe_force_lock); } /*Service loop */ AFS_UNREACHED(free(stats64.ViceStatistics64_val)); AFS_UNREACHED(return(NULL)); @@ -439,7 +436,7 @@ XListPartitions(struct rx_connection *aconn, struct partList *ptrPartList, * * Description: * Initialize the fsprobe module: set up Rx connections to the - * given set of servers, start up the probe and callback LWPs, + * given set of servers, start up the probe and callback threads, * and associate the routine to be called when a probe completes. * * Arguments: @@ -452,7 +449,7 @@ XListPartitions(struct rx_connection *aconn, struct partList *ptrPartList, * Returns: * 0 on success, * -2 for (at least one) connection error, - * LWP process creation code, if it failed, + * thread process creation code, if it failed, * -1 for other fatal errors. * * Environment: @@ -491,6 +488,9 @@ fsprobe_Init(int a_numServers, struct sockaddr_in *a_socketArray, } else fsprobe_initflag = 1; + opr_mutex_init(&fsprobe_force_lock); + opr_cv_init(&fsprobe_force_cv); + /* * Check the parameters for bogosities. */ @@ -543,11 +543,6 @@ fsprobe_Init(int a_numServers, struct sockaddr_in *a_socketArray, (a_numServers * sizeof(struct fsprobe_ConnectionInfo))); return (-1); /*No cleanup needs to be done yet */ } -#if 0 - else - fprintf(stderr, "[%s] fsprobe_ConnInfo allocated (%d bytes)\n", rn, - a_numServers * sizeof(struct fsprobe_ConnectionInfo)); -#endif /* 0 */ fsprobe_statsBytes = a_numServers * sizeof(struct ProbeViceStatistics); fsprobe_Results.stats = (struct ProbeViceStatistics *) @@ -609,18 +604,18 @@ fsprobe_Init(int a_numServers, struct sockaddr_in *a_socketArray, /* * Create a null Rx client security object, to be used by the - * probe LWP. + * probe thread. */ secobj = rxnull_NewClientSecurityObject(); if (secobj == (struct rx_securityClass *)0) { fprintf(stderr, - "[%s] Can't create client security object for probe LWP.\n", + "[%s] Can't create client security object for probe thread.\n", rn); fsprobe_Cleanup(1); /*Delete already-malloc'ed areas */ return (-1); } if (fsprobe_debug) - fprintf(stderr, "[%s] Probe LWP client security object created\n", + fprintf(stderr, "[%s] Probe thread client security object created\n", rn); curr_conn = fsprobe_ConnInfo; @@ -743,37 +738,20 @@ fsprobe_Init(int a_numServers, struct sockaddr_in *a_socketArray, */ if (fsprobe_debug) fprintf(stderr, "[%s] Starting up callback listener.\n", rn); - rx_StartServer(0 /*Don't donate yourself to LWP pool */ ); + rx_StartServer(0 /*Don't donate yourself to thread pool */ ); /* - * Start up the probe LWP. + * Start up the probe thread. */ if (fsprobe_debug) - fprintf(stderr, "[%s] Creating the probe LWP\n", rn); - code = LWP_CreateProcess(fsprobe_LWP, /*Function to start up */ - LWP_STACK_SIZE, /*Stack size in bytes */ - 1, /*Priority */ - (void *)0, /*Parameters */ - "fsprobe Worker", /*Name to use */ - &probeLWP_ID); /*Returned LWP process ID */ + fprintf(stderr, "[%s] Creating the probe thread\n", rn); + code = pthread_create(&fsprobe_thread, NULL, fsprobe_LWP, NULL); if (code) { - fprintf(stderr, "[%s] Can't create fsprobe LWP! Error is %d\n", rn, + fprintf(stderr, "[%s] Can't create fsprobe thread! Error is %d\n", rn, code); fsprobe_Cleanup(1); /*Delete already-malloc'ed areas */ return (code); } - if (fsprobe_debug) - fprintf(stderr, "[%s] Probe LWP process structure located at %p\n", - rn, probeLWP_ID); - -#if 0 - /* - * Do I need to do this? - */ - if (fsprobe_debug) - fprintf(stderr, "[%s] Calling osi_Wakeup()\n", rn); - osi_Wakeup(&rxsrv_afsserver); /*Wake up anyone waiting for it */ -#endif /* 0 */ /* * Return the final results. @@ -790,7 +768,7 @@ fsprobe_Init(int a_numServers, struct sockaddr_in *a_socketArray, * [exported] fsprobe_ForceProbeNow * * Description: - * Wake up the probe LWP, forcing it to execute a probe immediately. + * Wake up the probe thread, forcing it to execute a probe immediately. * * Arguments: * None. @@ -823,7 +801,9 @@ fsprobe_ForceProbeNow(void) /* * Kick the sucker in the side. */ - IOMGR_Cancel(probeLWP_ID); + opr_mutex_enter(&fsprobe_force_lock); + opr_cv_signal(&fsprobe_force_cv); + opr_mutex_exit(&fsprobe_force_lock); /* * We did it, so report the happy news. @@ -861,14 +841,14 @@ fsprobe_Wait(int sleep_secs) while (1) { tv.tv_sec = 30; tv.tv_usec = 0; - code = IOMGR_Select(0, 0, 0, 0, &tv); - if (code != 0) + code = select(0, 0, 0, 0, &tv); + if (code < 0) break; } } else { tv.tv_sec = sleep_secs; tv.tv_usec = 0; - code = IOMGR_Select(0, 0, 0, 0, &tv); + code = select(0, 0, 0, 0, &tv); } return code; } diff --git a/src/fsprobe/liboafs_fsprobe.la.sym b/src/fsprobe/liboafs_fsprobe.la.sym new file mode 100644 index 0000000000..8178f234c4 --- /dev/null +++ b/src/fsprobe/liboafs_fsprobe.la.sym @@ -0,0 +1,4 @@ +fsprobe_Cleanup +fsprobe_ForceProbeNow +fsprobe_Init +fsprobe_Wait diff --git a/src/gtx/Makefile.in b/src/gtx/Makefile.in index 1688e6f5ef..31a25a395f 100644 --- a/src/gtx/Makefile.in +++ b/src/gtx/Makefile.in @@ -9,10 +9,11 @@ srcdir=@srcdir@ include @TOP_OBJDIR@/src/config/Makefile.config -include @TOP_OBJDIR@/src/config/Makefile.lwp +include @TOP_OBJDIR@/src/config/Makefile.pthread +include @TOP_OBJDIR@/src/config/Makefile.libtool - -INCLS=gtxobjects.h \ +INCLS = \ + gtxobjects.h \ gtxwindows.h \ gtxcurseswin.h \ gtxinput.h \ @@ -28,50 +29,31 @@ INCLS=gtxobjects.h \ ${TOP_INCDIR}/afs/cellconfig.h \ ${TOP_INCDIR}/afs/cmd.h -LIBS=\ - ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/liblwp.a \ - ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/libkauth.a \ - ${TOP_LIBDIR}/libauth.a \ - ${TOP_LIBDIR}/librxkad.a \ - ${TOP_LIBDIR}/libafsrfc3961.a \ - ${TOP_LIBDIR}/libafscom_err.a \ - ${TOP_LIBDIR}/libopr.a \ - ${TOP_LIBDIR}/util.a +LT_objs = \ + AFS_component_version_number.lo \ + keymap.lo \ + input.lo \ + frame.lo \ + curseswindows.lo \ + dumbwindows.lo \ + X11windows.lo \ + windows.lo \ + objects.lo \ + lightobject.lo \ + textobject.lo \ + objdict.lo \ + textcb.lo -EXTRA_LIBS=${LIB_curses} ${XLIBS} +LT_libs = \ + $(top_builddir)/src/rxkad/liboafs_rxkad.la \ + $(top_builddir)/src/fsint/liboafs_fsint.la \ + $(top_builddir)/src/cmd/liboafs_cmd.la \ + $(top_builddir)/src/util/liboafs_util.la \ + $(top_builddir)/src/opr/liboafs_opr.la \ + $(top_builddir)/src/lwp/liboafs_lwpcompat.la -KEYMAP_SRCS=keymap.c input.c frame.c - -KEYMAP_OBJS=keymap.o input.o frame.o - -WINDOW_SRCS=curseswindows.c \ - dumbwindows.c \ - X11windows.c \ - windows.c - -WINDOW_OBJS=curseswindows.o \ - dumbwindows.o \ - X11windows.o \ - windows.o - -OBJECT_SRCS=objects.c \ - lightobject.c \ - textobject.c - -OBJECT_OBJS=objects.o \ - lightobject.o \ - textobject.o - -DICT_SRCS=objdict.c -DICT_OBJS=objdict.o - -CB_SRCS=textcb.c -CB_OBJS=textcb.o - -all: gtxtest \ +all: \ + liboafs_gtx.la \ ${TOP_LIBDIR}/libgtx.a \ ${TOP_INCDIR}/afs/gtxcurseswin.h \ ${TOP_INCDIR}/afs/gtxdumbwin.h \ @@ -125,72 +107,50 @@ ${TOP_INCDIR}/afs/gtxwindows.h: gtxwindows.h ${TOP_INCDIR}/afs/gtxX11win.h: gtxX11win.h ${INSTALL_DATA} $? $@ +# +# Build targets +# +liboafs_gtx.la: liboafs_gtx.la.sym $(LT_objs) $(LT_deps) + $(LT_LDLIB_shlib) $(LT_objs) $(LT_deps) $(LT_libs) + +libgtx.a: $(LT_objs) + $(LT_LDLIB_static) $(LT_objs) + +keymap.lo: keymap.c ${INCLS} +frame.lo: frame.c $(INCLS) +input.lo: input.c ${INCLS} +curseswindows.lo: curseswindows.c ${INCLS} +dumbwindows.lo: dumbwindows.c ${INCLS} +X11windows.lo: X11windows.c ${INCLS} +windows.lo: windows.c ${INCLS} +lightobject.lo: lightobject.c ${INCLS} +textobject.lo: textobject.c ${INCLS} +objdict.lo: objdict.c ${INCLS} +textcb.lo: textcb.c ${INCLS} + +# +# Test programs +# tests: object_test screen_test curses_test cb_test gtxtest -# All objects in the library -LIBSRCS = ${KEYMAP_SRCS} ${WINDOW_SRCS} ${OBJECT_SRCS} ${DICT_SRCS} ${CB_SRCS} -LIBOBJS = $(KEYMAP_OBJS) ${WINDOW_OBJS} ${OBJECT_OBJS} ${DICT_OBJS} ${CB_OBJS} +object_test: object_test.o liboafs_gtx.la + $(LT_LDRULE_static) object_test.o liboafs_gtx.la ${LIB_curses} ${XLIBS} -${LIBSRCS}: ${INCLS} -$(LIBOBJS): ${INCLS} +screen_test: screen_test.o liboafs_gtx.la + $(LT_LDRULE_static) screen_test.o liboafs_gtx.la ${LIB_curses} ${XLIBS} -keymap.o: keymap.c ${INCLS} +curses_test: curses_test.o liboafs_gtx.la + $(LT_LDRULE_static) curses_test.o liboafs_gtx.la ${LIB_curses} ${XLIBS} -frame.o: frame.c $(INCLS) +cb_test: cb_test.o liboafs_gtx.la + $(LT_LDRULE_static) cb_test.o liboafs_gtx.la ${LIB_curses} ${XLIBS} -input.o: input.c ${INCLS} - -curseswindows.o: curseswindows.c ${INCLS} - -dumbwindows.o: dumbwindows.c ${INCLS} - -X11windows.o: X11windows.c ${INCLS} - -windows.o: windows.c ${INCLS} - -lightobject.o: lightobject.c ${INCLS} - -textobject.o: textobject.c ${INCLS} - -textcb.o: textcb.c ${INCLS} - -# -# Test programs. -# -curses_test.o: curses_test.c ${INCLS} AFS_component_version_number.o - -curses_test: curses_test.o $(LIBS) - $(AFS_LDRULE) curses_test.o $(LIBS) ${EXTRA_LIBS} - -screen_test.o: screen_test.c ${INCLS} AFS_component_version_number.o - -screen_test: screen_test.o ${WINDOW_OBJS} ${LIBS} - $(AFS_LDRULE) screen_test.o ${WINDOW_OBJS} ${LIBS} ${EXTRA_LIBS} - -cb_test.o: cb_test.c ${INCLS} AFS_component_version_number.o - -cb_test: cb_test.o ${CB_OBJS} ${LIBS} - $(AFS_LDRULE) cb_test.o ${CB_OBJS} ${LIBS} ${EXTRA_LIBS} - -gtxtest.o: gtxtest.c ${INCLS} AFS_component_version_number.o - -gtxtest: gtxtest.o libgtx.a ${LIBS} - $(AFS_LDRULE) gtxtest.o libgtx.a ${LIBS} ${EXTRA_LIBS} - -object_test.o: object_test.c ${INCLS} AFS_component_version_number.o - -object_test: object_test.o ${WINDOW_OBJS} ${DICT_OBJS} ${OBJECT_OBJS} ${CB_OBJS} ${LIBS} - $(AFS_LDRULE) object_test.o ${WINDOW_OBJS} ${DICT_OBJS} \ - ${OBJECT_OBJS} ${CB_OBJS} ${LIBS} ${EXTRA_LIBS} +gtxtest: gtxtest.o liboafs_gtx.la + $(LT_LDRULE_static) gtxtest.o liboafs_gtx.la ${LIB_curses} ${XLIBS} # # Installation targets # -libgtx.a: ${LIBOBJS} AFS_component_version_number.o - -$(RM) -f $@ - $(AR) crv $@ ${LIBOBJS} AFS_component_version_number.o - ${RANLIB} $@ - install: libgtx.a ${INSTALL} -d ${DESTDIR}${libdir}/afs ${INSTALL} -d ${DESTDIR}${includedir}/afs @@ -229,6 +189,7 @@ dest: libgtx.a # Misc targets # clean: + $(LT_CLEAN) $(RM) -f *.o *.a *.ln object_test screen_test curses_test core cb_test gtxtest AFS_component_version_number.c include ../config/Makefile.version diff --git a/src/gtx/input.c b/src/gtx/input.c index f7303f6aa4..c1f1c479fd 100644 --- a/src/gtx/input.c +++ b/src/gtx/input.c @@ -12,7 +12,7 @@ #include -#include +#include #include "gtxobjects.h" #include "gtxwindows.h" @@ -21,6 +21,7 @@ #include "gtxkeymap.h" #include "gtxframe.h" #include +#include /* process input */ @@ -65,7 +66,7 @@ struct gwin * gtx_Init(int astartInput, int atype) /* type of window to create */ { - PROCESS junk; + pthread_t thread_id; struct onode_initparams oi_params; /* object init params */ struct gwin_initparams wi_params; /* window initialization params */ struct gwin *twin; @@ -91,12 +92,8 @@ gtx_Init(int astartInput, return NULL; /* if we start input thread */ - IOMGR_Initialize(); /* input thread uses it */ if (astartInput) { - code = LWP_CreateProcess(gtx_InputServer, 8192, LWP_NORMAL_PRIORITY, - NULL, "gx-listener", &junk); - if (code) - return NULL; + opr_Verify(pthread_create(&thread_id, NULL, gtx_InputServer, NULL) == 0); } /* all done */ diff --git a/src/gtx/liboafs_gtx.la.sym b/src/gtx/liboafs_gtx.la.sym new file mode 100644 index 0000000000..e84d031b1d --- /dev/null +++ b/src/gtx/liboafs_gtx.la.sym @@ -0,0 +1,99 @@ +gator_cursesgwin_box +gator_cursesgwin_cleanup +gator_cursesgwin_clear +gator_cursesgwin_create +gator_cursesgwin_destroy +gator_cursesgwin_display +gator_cursesgwin_drawchar +gator_cursesgwin_drawline +gator_cursesgwin_drawrectangle +gator_cursesgwin_drawstring +gator_cursesgwin_getchar +gator_cursesgwin_getdimensions +gator_cursesgwin_init +gator_cursesgwin_invert +gator_cursesgwin_wait +gator_dumbgwin_box +gator_dumbgwin_cleanup +gator_dumbgwin_clear +gator_dumbgwin_create +gator_dumbgwin_destroy +gator_dumbgwin_display +gator_dumbgwin_drawchar +gator_dumbgwin_drawline +gator_dumbgwin_drawrectangle +gator_dumbgwin_drawstring +gator_dumbgwin_getchar +gator_dumbgwin_getdimensions +gator_dumbgwin_init +gator_dumbgwin_invert +gator_dumbgwin_wait +gator_light_create +gator_light_destroy +gator_light_display +gator_light_release +gator_light_set +gator_objdict_add +gator_objdict_delete +gator_objdict_init +gator_objdict_lookup +gator_objects_create +gator_objects_init +gator_objects_lookup +gator_text_BlankLine +gator_textcb_BlankLine +gator_textcb_Create +gator_textcb_Delete +gator_textcb_Init +gator_textcb_Write +gator_text_create +gator_text_destroy +gator_text_display +gator_text_release +gator_text_Scroll +gator_text_Write +gator_X11gwin_box +gator_X11gwin_cleanup +gator_X11gwin_clear +gator_X11gwin_create +gator_X11gwin_destroy +gator_X11gwin_display +gator_X11gwin_drawchar +gator_X11gwin_drawline +gator_X11gwin_drawrectangle +gator_X11gwin_drawstring +gator_X11gwin_getchar +gator_X11gwin_getdimensions +gator_X11gwin_init +gator_X11gwin_invert +gator_X11gwin_wait +gtx_CopyString +gtxframe_AddMenu +gtxframe_AddToList +gtxframe_AskForString +gtxframe_ClearList +gtxframe_ClearMenus +gtxframe_ClearMessageLine +gtxframe_Create +gtxframe_CtrlHCmd +gtxframe_CtrlUCmd +gtxframe_Delete +gtxframe_DeleteMenu +gtxframe_Display +gtxframe_DisplayString +gtxframe_ExitCmd +gtxframe_GetFrame +gtxframe_RecursiveEndCmd +gtxframe_RecursiveErrCmd +gtxframe_RemoveFromList +gtxframe_SelfInsertCmd +gtxframe_SetFrame +gtx_Init +gtx_InputServer +gw_init +keymap_BindToString +keymap_Create +keymap_Delete +keymap_InitState +keymap_ProcessKey +keymap_ResetState diff --git a/src/scout/Makefile.in b/src/scout/Makefile.in index db0f1613a1..47d18754bb 100644 --- a/src/scout/Makefile.in +++ b/src/scout/Makefile.in @@ -7,7 +7,7 @@ srcdir=@srcdir@ include @TOP_OBJDIR@/src/config/Makefile.config -include @TOP_OBJDIR@/src/config/Makefile.lwp +include @TOP_OBJDIR@/src/config/Makefile.pthread INCLS=${TOP_INCDIR}/afs/gtxobjects.h \ @@ -23,28 +23,16 @@ INCLS=${TOP_INCDIR}/afs/gtxobjects.h \ ${TOP_INCDIR}/afs/cellconfig.h \ ${TOP_INCDIR}/afs/cmd.h -LIBS=${TOP_LIBDIR}/libgtx.a \ - ${TOP_LIBDIR}/libfsprobe.a \ - ${TOP_LIBDIR}/libvolser.a \ - ${TOP_LIBDIR}/libubik.a \ - ${TOP_LIBDIR}/libkauth.a \ - ${TOP_LIBDIR}/libauth.a \ - ${TOP_LIBDIR}/librxkad.a \ - ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/vlib.a \ - ${TOP_LIBDIR}/libacl.a \ - ${TOP_LIBDIR}/libvldb.a \ - ${TOP_LIBDIR}/libafsint.a \ - ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libaudit.a \ - ${TOP_LIBDIR}/libafscom_err.a \ - ${TOP_LIBDIR}/liblwp.a \ - ${TOP_LIBDIR}/util.a \ - ${TOP_LIBDIR}/libopr.a \ - ${TOP_LIBDIR}/libafsrfc3961.a \ - ${TOP_LIBDIR}/libafshcrypto_lwp.a +LIBS=\ + $(top_builddir)/src/fsprobe/liboafs_fsprobe.la \ + $(top_builddir)/src/gtx/liboafs_gtx.la \ + $(top_builddir)/src/rxkad/liboafs_rxkad.la \ + $(top_builddir)/src/fsint/liboafs_fsint.la \ + $(top_builddir)/src/cmd/liboafs_cmd.la \ + $(top_builddir)/src/util/liboafs_util.la \ + $(top_builddir)/src/opr/liboafs_opr.la \ + $(top_builddir)/src/lwp/liboafs_lwpcompat.la \ + $(top_builddir)/src/volser/liboafs_volser.la \ all: scout @@ -54,7 +42,7 @@ all: scout scout.o: scout.c ${INCLS} AFS_component_version_number.c scout: scout.o $(LIBS) - $(AFS_LDRULE) scout.o $(LIBS) $(LIB_roken) ${LIB_curses} ${XLIBS} + $(LT_LDRULE_static) scout.o $(LIBS) $(LIB_roken) ${LIB_curses} ${XLIBS} # # Installation targets diff --git a/src/scout/scout.c b/src/scout/scout.c index 4a38b47e76..0194e3497d 100644 --- a/src/scout/scout.c +++ b/src/scout/scout.c @@ -1636,10 +1636,6 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg) int i; /*Generic loop variable */ int mini_line_bytes; /*Num bytes in mini_lines */ int linenum; /*Current mini-line number */ -#if 0 - PROCESS pid; /*Main LWP process ID */ - PROCESS gxlistener_ID; /*Input Server LWP process ID */ -#endif /* 0 */ struct gator_lightobj *lightdata; /*Private light data */ if (scout_debug) { @@ -1648,16 +1644,10 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg) } /* - * We have to initialize LWP support before we start up any of + * We have to initialize thread support before we start up any of * our packages. */ -#if 0 - code = LWP_InitializeProcessSupport(LWP_NORMAL_PRIORITY, &pid); - if (code) { - fprintf(stderr, "[%s:%s] Can't initialize LWP\n", pn, rn); - scout_CleanExit(code); - } -#endif /* 0 */ + opr_softsig_Init(); /* * Initialize the gtx package. @@ -1944,19 +1934,6 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg) return (-1); } - - /* - * Start up the input server LWP for our window. - */ -#if 0 - code = LWP_CreateProcess(gtx_InputServer, /*Fcn to start up */ - 8192, /*Stack size in bytes */ - LWP_NORMAL_PRIORITY, /*Priority */ - (void *)scout_gwin, /*Params: Ptr to window */ - "gx-listener", /*Name to use */ - &gxlistener_ID); /*Returned LWP process ID */ -#endif /* 0 */ - code = (int)(intptr_t)gtx_InputServer(scout_gwin); if (code) { fprintf(stderr, @@ -1966,16 +1943,6 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg) } fsprobe_Wait(0); /* sleep forever */ - -#if 0 - /* - * How did we get here? Oh, well, clean up our windows and - * return sweetness and light anyway. - */ - WOP_CLEANUP(&scout_gwin); - return (0); -#endif /* 0 */ - return 0; } /*execute_scout */ diff --git a/src/xstat/.gitignore b/src/xstat/.gitignore index 9688fc37b8..be40652e32 100644 --- a/src/xstat/.gitignore +++ b/src/xstat/.gitignore @@ -2,5 +2,7 @@ # git ls-files -i --exclude-standard # to check that you haven't inadvertently ignored any tracked files. +/afscbint.h +/afscbint.ss.c /xstat_cm_test /xstat_fs_test diff --git a/src/xstat/Makefile.in b/src/xstat/Makefile.in index fcd0a426a1..596807b752 100644 --- a/src/xstat/Makefile.in +++ b/src/xstat/Makefile.in @@ -10,21 +10,19 @@ srcdir=@srcdir@ include @TOP_OBJDIR@/src/config/Makefile.config -include @TOP_OBJDIR@/src/config/Makefile.lwp +include @TOP_OBJDIR@/src/config/Makefile.pthread +include @TOP_OBJDIR@/src/config/Makefile.libtool - -RPCINCLS=${TOP_INCDIR}/lwp.h ${TOP_INCDIR}/rx/rx.h - -LIBS=${TOP_LIBDIR}/libafsint.a \ - ${TOP_LIBDIR}/libcmd.a \ - ${TOP_LIBDIR}/librx.a \ - ${TOP_LIBDIR}/libafshcrypto_lwp.a \ - ${TOP_LIBDIR}/liblwp.a \ - ${TOP_LIBDIR}/libsys.a \ - ${TOP_LIBDIR}/libopr.a \ - ${TOP_LIBDIR}/util.a +LT_deps = \ + $(top_builddir)/src/rxkad/liboafs_rxkad.la \ + $(top_builddir)/src/fsint/liboafs_fsint.la \ + $(top_builddir)/src/cmd/liboafs_cmd.la \ + $(top_builddir)/src/util/liboafs_util.la \ + $(top_builddir)/src/opr/liboafs_opr.la all: \ + liboafs_xstat_fs.la \ + liboafs_xstat_cm.la \ ${TOP_INCDIR}/afs/xstat_fs.h \ ${TOP_INCDIR}/afs/xstat_cm.h \ ${TOP_LIBDIR}/libxstat_fs.a \ @@ -47,40 +45,61 @@ ${TOP_LIBDIR}/libxstat_cm.a: libxstat_cm.a # # File Server data collection # -FSINCLS=xstat_fs.h ${RPCINCLS} +FSINCLS = \ + xstat_fs.h \ + ${TOP_INCDIR}/rx/rx.h -libxstat_fs.a: xstat_fs.o xstat_fs_callback.o AFS_component_version_number.o - -$(RM) -f $@ - $(AR) crv $@ xstat_fs.o xstat_fs_callback.o AFS_component_version_number.o - $(RANLIB) $@ +LT_objs_fs = \ + xstat_fs.lo \ + xstat_fs_callback.lo \ + afscbint.ss.lo \ + AFS_component_version_number.lo -xstat_fs.o: xstat_fs.c ${FSINCLS} +liboafs_xstat_fs.la: liboafs_xstat_fs.la.sym $(LT_objs_fs) $(LT_deps) + $(LT_LDLIB_shlib) $(LT_objs_fs) $(LT_deps) $(LT_libs) -xstat_fs_callback.o: xstat_fs_callback.c ${FSINCLS} +libxstat_fs.a: $(LT_objs_fs) + $(LT_LDLIB_static) $(LT_objs_fs) -xstat_fs_test.o: xstat_fs_test.c ${FSINCLS} AFS_component_version_number.c +# afscbint.ss.c is required for RXAFSCB_ExecuteRequest. +afscbint.h: $(top_builddir)/src/fsint/afscbint.h + ${INSTALL_DATA} $? $@ -xstat_fs_test: xstat_fs_test.o libxstat_fs.a ${LIBS} - $(AFS_LDRULE) xstat_fs_test.o libxstat_fs.a \ - ${LIBS} $(LIB_roken) ${XLIBS} +afscbint.ss.c: $(top_builddir)/src/fsint/afscbint.ss.c + ${INSTALL_DATA} $? $@ + +xstat_fs.lo: xstat_fs.c ${FSINCLS} +xstat_fs_callback.lo: xstat_fs_callback.c ${FSINCLS} +xstat_fs_test.lo: xstat_fs_test.c ${FSINCLS} AFS_component_version_number.c +afscbint.ss.lo: afscbint.ss.c afscbint.h + +xstat_fs_test: xstat_fs_test.o liboafs_xstat_fs.la $(LT_deps) + $(LT_LDRULE_static) xstat_fs_test.o liboafs_xstat_fs.la \ + $(LT_deps) $(LIB_roken) ${XLIBS} # # Cache Manager data collection # -CMINCLS=xstat_cm.h ${RPCINCLS} +CMINCLS = \ + xstat_cm.h \ + ${TOP_INCDIR}/rx/rx.h -libxstat_cm.a: xstat_cm.o AFS_component_version_number.o - -$(RM) -f libxstat_cm.a - $(AR) crv libxstat_cm.a xstat_cm.o AFS_component_version_number.o - $(RANLIB) libxstat_cm.a +LT_objs_cm = \ + xstat_cm.lo \ + AFS_component_version_number.lo -xstat_cm.o: xstat_cm.c ${CMINCLS} +liboafs_xstat_cm.la: liboafs_xstat_cm.la.sym $(LT_objs_cm) $(LT_deps) + $(LT_LDLIB_shlib) $(LT_objs_cm) $(LT_deps) $(LT_libs) +libxstat_cm.a: $(LT_objs_cm) + $(LT_LDLIB_static) $(LT_objs_cm) + +xstat_cm.lo: xstat_cm.c ${CMINCLS} xstat_cm_test.o: xstat_cm_test.c ${CMINCLS} AFS_component_version_number.c -xstat_cm_test: xstat_cm_test.o libxstat_cm.a ${LIBS} - $(AFS_LDRULE) xstat_cm_test.o libxstat_cm.a \ - ${LIBS} $(LIB_roken) ${XLIBS} +xstat_cm_test: xstat_cm_test.o liboafs_xstat_cm.la $(LT_deps) + $(LT_LDRULE_static) xstat_cm_test.o liboafs_xstat_cm.la \ + $(LT_deps) $(LIB_roken) ${XLIBS} # # Installation targets @@ -113,6 +132,8 @@ dest: xstat_fs.h xstat_cm.h libxstat_fs.a libxstat_cm.a xstat_fs_test \ # Misc targets # clean: - $(RM) -f *.o *.a xstat_fs_test xstat_cm_test core AFS_component_version_number.c + $(LT_CLEAN) + $(RM) -f *.o *.a afscbint.ss.c afscbint.h xstat_fs_test xstat_cm_test \ + core AFS_component_version_number.c include ../config/Makefile.version diff --git a/src/xstat/NTMakefile b/src/xstat/NTMakefile index a0c4cd523f..587aaf9dc2 100644 --- a/src/xstat/NTMakefile +++ b/src/xstat/NTMakefile @@ -16,21 +16,20 @@ LIBDIR = $(DESTDIR)\lib INCDIR = $(DESTDIR)\include BINDIR = $(DESTDIR)\bin -RPCINCLS=$(INCDIR)\lwp.h $(INCDIR)\rx\rx.h +RPCINCLS=$(INCDIR)\rx\rx.h LIBS= \ - $(LIBDIR)\afs\afsint.lib \ + $(LIBDIR)\afs\mtafsint.lib \ $(LIBDIR)\afs\afscmd.lib \ - $(LIBDIR)\afsrx.lib \ + $(LIBDIR)\afsrpc.lib \ $(LIBDIR)\afshcrypto.lib \ - $(LIBDIR)\afslwp.lib \ + $(LIBDIR)\afspthread.lib \ $(LIBDIR)\afs\afspioctl.lib \ - $(LIBDIR)\afs\afsutil.lib \ + $(LIBDIR)\afs\mtafsutil.lib \ $(LIBDIR)\afs\afsreg.lib \ $(LIBDIR)\afsroken.lib \ $(LIBDIR)\opr.lib - install: \ $(INCDIR)\afs\xstat_fs.h \ $(INCDIR)\afs\xstat_cm.h \ diff --git a/src/xstat/liboafs_xstat_cm.la.sym b/src/xstat/liboafs_xstat_cm.la.sym new file mode 100644 index 0000000000..00acbd817d --- /dev/null +++ b/src/xstat/liboafs_xstat_cm.la.sym @@ -0,0 +1,5 @@ +xstat_cm_Cleanup +xstat_cm_ForceProbeNow +xstat_cm_Init +xstat_cm_Results +xstat_cm_Wait diff --git a/src/xstat/liboafs_xstat_fs.la.sym b/src/xstat/liboafs_xstat_fs.la.sym new file mode 100644 index 0000000000..8f5fef69e2 --- /dev/null +++ b/src/xstat/liboafs_xstat_fs.la.sym @@ -0,0 +1,5 @@ +xstat_fs_Cleanup +xstat_fs_DecodeFullPerfStats +xstat_fs_ForceProbeNow +xstat_fs_Init +xstat_fs_Wait diff --git a/src/xstat/xstat_cm.c b/src/xstat/xstat_cm.c index 34fe72c2ce..171aa735fc 100644 --- a/src/xstat/xstat_cm.c +++ b/src/xstat/xstat_cm.c @@ -18,14 +18,13 @@ #include #include +#include #include "xstat_cm.h" /*Interface for this module */ -#include /*Lightweight process package */ +#include #include -#define LWP_STACK_SIZE (16 * 1024) - /* * Exported variables. */ @@ -46,9 +45,11 @@ static int xstat_cm_initflag = 0; /*Was init routine called? */ static int xstat_cm_debug = 0; /*Debugging output enabled? */ static int xstat_cm_oneShot = 0; /*One-shot operation? */ static int (*xstat_cm_Handler) (void); /*Probe handler routine */ -static PROCESS probeLWP_ID; /*Probe LWP process ID */ +static pthread_t xstat_cm_thread; /*Probe thread */ static int xstat_cm_numCollections; /*Number of desired collections */ static afs_int32 *xstat_cm_collIDP; /*Ptr to collection IDs desired */ +static opr_mutex_t xstat_cm_force_lock; /*Lock to wakeup probe */ +static opr_cv_t xstat_cm_force_cv; /*Condvar to wakeup probe */ /*------------------------------------------------------------------------ @@ -173,7 +174,7 @@ xstat_cm_Cleanup(int a_releaseMem) * [private] xstat_cm_LWP * * Description: - * This LWP iterates over the server connections and gathers up + * This thread iterates over the server connections and gathers up * the desired statistics from each one on a regular basis, for * all known data collections. The associated handler function * is called each time a new data collection is received. @@ -198,6 +199,7 @@ xstat_cm_LWP(void *unused) afs_int32 code; /*Results of calls */ int oneShotCode; /*Result of one-shot signal */ struct timeval tv; /*Time structure */ + struct timespec wait; /*Time to wait */ int conn_idx; /*Connection index */ struct xstat_cm_ConnectionInfo *curr_conn; /*Current connection */ afs_int32 srvVersionNumber; /*Xstat version # */ @@ -310,36 +312,25 @@ xstat_cm_LWP(void *unused) if (xstat_cm_oneShot) { /* - * One-shot execution desired. Signal our main procedure - * that we've finished our collection round. + * One-shot execution desired. */ - if (xstat_cm_debug) - printf("[%s] Signalling main process at %" AFS_PTR_FMT "\n", rn, - &terminationEvent); - oneShotCode = LWP_SignalProcess(&terminationEvent); - if (oneShotCode) - fprintf(stderr, "[%s] Error %d from LWP_SignalProcess()", rn, - oneShotCode); break; /*from the perpetual while loop */ } /*One-shot execution */ else { /* * Continuous execution desired. Sleep for the required - * number of seconds. + * number of seconds or wakeup sooner if forced. */ - tv.tv_sec = xstat_cm_ProbeFreqInSecs; - tv.tv_usec = 0; if (xstat_cm_debug) printf("[%s] Falling asleep for %d seconds\n", rn, xstat_cm_ProbeFreqInSecs); - code = IOMGR_Select(0, /*Num fids */ - 0, /*Descs ready for reading */ - 0, /*Descs ready for writing */ - 0, /*Descs w/exceptional conditions */ - &tv); /*Ptr to timeout structure */ - if (code) - fprintf(stderr, "[%s] IOMGR_Select returned code %d\n", rn, - code); + gettimeofday(&tv, NULL); + wait.tv_sec = tv.tv_sec + xstat_cm_ProbeFreqInSecs; + wait.tv_nsec = tv.tv_usec * 1000; + opr_mutex_enter(&xstat_cm_force_lock); + code = opr_cv_timedwait(&xstat_cm_force_cv, &xstat_cm_force_lock, &wait); + opr_Assert(code == 0 || code == ETIMEDOUT); + opr_mutex_exit(&xstat_cm_force_lock); } /*Continuous execution */ } /*Service loop */ return NULL; @@ -351,7 +342,7 @@ xstat_cm_LWP(void *unused) * * Description: * Initialize the xstat_cm module: set up Rx connections to the - * given set of Cache Managers, start up the probe LWP, and + * given set of Cache Managers, start up the probe thread, and * associate the routine to be called when a probe completes. * Also, let it know which collections you're interested in. * @@ -367,7 +358,7 @@ xstat_cm_LWP(void *unused) * Returns: * 0 on success, * -2 for (at least one) connection error, - * LWP process creation code, if it failed, + * thread process creation code, if it failed, * -1 for other fatal errors. * * Environment: @@ -404,6 +395,9 @@ xstat_cm_Init(int a_numServers, struct sockaddr_in *a_socketArray, } else xstat_cm_initflag = 1; + opr_mutex_init(&xstat_cm_force_lock); + opr_cv_init(&xstat_cm_force_cv); + /* * Check the parameters for bogosities. */ @@ -497,17 +491,17 @@ xstat_cm_Init(int a_numServers, struct sockaddr_in *a_socketArray, /* * Create a null Rx client security object, to be used by the - * probe LWP. + * probe thread. */ secobj = rxnull_NewClientSecurityObject(); if (secobj == (struct rx_securityClass *)0) { fprintf(stderr, - "[%s] Can't create probe LWP client security object.\n", rn); + "[%s] Can't create probe thread client security object.\n", rn); xstat_cm_Cleanup(1); /*Delete already-malloc'ed areas */ return (-1); } if (xstat_cm_debug) - printf("[%s] Probe LWP client security object created\n", rn); + printf("[%s] Probe thread client security object created\n", rn); curr_conn = xstat_cm_ConnInfo; conn_err = 0; @@ -569,25 +563,17 @@ xstat_cm_Init(int a_numServers, struct sockaddr_in *a_socketArray, } /*for curr_srv */ /* - * Start up the probe LWP. + * Start up the probe thread. */ if (xstat_cm_debug) - printf("[%s] Creating the probe LWP\n", rn); - code = LWP_CreateProcess(xstat_cm_LWP, /*Function to start up */ - LWP_STACK_SIZE, /*Stack size in bytes */ - 1, /*Priority */ - (void *)0, /*Parameters */ - "xstat_cm Worker", /*Name to use */ - &probeLWP_ID); /*Returned LWP process ID */ + printf("[%s] Creating the probe thread\n", rn); + code = pthread_create(&xstat_cm_thread, NULL, xstat_cm_LWP, NULL); if (code) { - fprintf(stderr, "[%s] Can't create xstat_cm LWP! Error is %d\n", rn, + fprintf(stderr, "[%s] Can't create xstat_cm thread! Error is %d\n", rn, code); xstat_cm_Cleanup(1); /*Delete already-malloc'ed areas */ return (code); } - if (xstat_cm_debug) - printf("[%s] Probe LWP process structure located at %" AFS_PTR_FMT "\n", rn, - probeLWP_ID); /* * Return the final results. @@ -603,7 +589,7 @@ xstat_cm_Init(int a_numServers, struct sockaddr_in *a_socketArray, * [exported] xstat_cm_ForceProbeNow * * Description: - * Wake up the probe LWP, forcing it to execute a probe immediately. + * Wake up the probe thread, forcing it to execute a probe immediately. * * Arguments: * None. @@ -635,7 +621,9 @@ xstat_cm_ForceProbeNow(void) /* * Kick the sucker in the side. */ - IOMGR_Cancel(probeLWP_ID); + opr_mutex_enter(&xstat_cm_force_lock); + opr_cv_signal(&xstat_cm_force_cv); + opr_mutex_exit(&xstat_cm_force_lock); /* * We did it, so report the happy news. @@ -666,14 +654,13 @@ xstat_cm_Wait(int sleep_secs) * One-shot operation; just wait for the collection to be done. */ if (xstat_cm_debug) - printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT - "\n", rn, &terminationEvent); - code = LWP_WaitProcess(&terminationEvent); + printf("[%s] Calling pthread_join()\n", rn); + code = pthread_join(xstat_cm_thread, NULL); if (xstat_cm_debug) - printf("[%s] Returned from LWP_WaitProcess()\n", rn); + printf("[%s] Returned from pthread_join()\n", rn); if (code) { fprintf(stderr, - "[%s] Error %d encountered by LWP_WaitProcess()\n", + "[%s] Error %d encountered by pthread_join()\n", rn, code); } } else if (sleep_secs == 0) { @@ -681,17 +668,15 @@ xstat_cm_Wait(int sleep_secs) tv.tv_sec = 24 * 60; tv.tv_usec = 0; if (xstat_cm_debug) - fprintf(stderr, "[ %s ] going to sleep ...\n", rn); + fprintf(stderr, "[%s] going to sleep ...\n", rn); while (1) { - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) { - fprintf(stderr, - "[ %s ] IOMGR_Select() returned non-zero value %d\n", - rn, code); + code = select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code < 0) { + fprintf(stderr, "[%s] select() error %d\n", rn, errno); break; } } @@ -703,15 +688,13 @@ xstat_cm_Wait(int sleep_secs) sleep_secs); tv.tv_sec = sleep_secs; tv.tv_usec = 0; - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) - fprintf(stderr, - "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, - code); + code = select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code < 0) + fprintf(stderr, "[%s] select() error: %d\n", rn, errno); } return code; } diff --git a/src/xstat/xstat_cm_test.c b/src/xstat/xstat_cm_test.c index c146172390..e65177c55d 100644 --- a/src/xstat/xstat_cm_test.c +++ b/src/xstat/xstat_cm_test.c @@ -21,6 +21,7 @@ #include "xstat_cm.h" /*Interface for xstat_cm module */ #include /*Command line interpreter */ #include +#include /* * Command line parameter indices. @@ -751,6 +752,8 @@ RunTheTest(struct cmd_syndesc *a_s, void *arock) int freq; /*Frequency of polls */ int period; /*Time in minutes of data collection */ + opr_softsig_Init(); + /* * Are we doing one-shot measurements? */ diff --git a/src/xstat/xstat_fs.c b/src/xstat/xstat_fs.c index e4f72b8346..ba2066e561 100644 --- a/src/xstat/xstat_fs.c +++ b/src/xstat/xstat_fs.c @@ -18,15 +18,14 @@ #include #include +#include #include "xstat_fs.h" /*Interface for this module */ -#include /*Lightweight process package */ +#include #include #include -#define LWP_STACK_SIZE (16 * 1024) - /* * Exported variables. */ @@ -47,9 +46,11 @@ static int xstat_fs_initflag = 0; /*Was init routine called? */ static int xstat_fs_debug = 0; /*Debugging output enabled? */ static int xstat_fs_oneShot = 0; /*One-shot operation? */ static int (*xstat_fs_Handler) (void); /*Probe handler routine */ -static PROCESS probeLWP_ID; /*Probe LWP process ID */ +static pthread_t xstat_fs_thread; /*Probe thread */ static int xstat_fs_numCollections; /*Number of desired collections */ static afs_int32 *xstat_fs_collIDP; /*Ptr to collection IDs desired */ +static opr_mutex_t xstat_fs_force_lock; /*Lock to wakeup probe */ +static opr_cv_t xstat_fs_force_cv; /*Condvar to wakeup probe */ /*------------------------------------------------------------------------ @@ -194,7 +195,7 @@ xstat_fs_Cleanup(int a_releaseMem) * [private] xstat_fs_LWP * * Description: - * This LWP iterates over the server connections and gathers up + * This thread iterates over the server connections and gathers up * the desired statistics from each one on a regular basis. When * the sweep is done, the associated handler function is called * to process the new data. @@ -216,10 +217,10 @@ xstat_fs_Cleanup(int a_releaseMem) static void * xstat_fs_LWP(void *unused) { - static char rn[] = "xstat_fs_LWP"; /*Routine name */ + static char rn[] = "xstat_fs_thread"; /*Routine name */ afs_int32 code; /*Results of calls */ - int oneShotCode; /*Result of one-shot signal */ struct timeval tv; /*Time structure */ + struct timespec wait; /*Time to wait */ int conn_idx; /*Connection index */ struct xstat_fs_ConnectionInfo *curr_conn; /*Current connection */ afs_int32 srvVersionNumber; /*Xstat version # */ @@ -329,36 +330,21 @@ xstat_fs_LWP(void *unused) if (xstat_fs_oneShot) { /* - * One-shot execution desired. Signal our main procedure - * that we've finished our collection round. + * One-shot execution desired. */ - if (xstat_fs_debug) - printf("[%s] Signalling main process at %" AFS_PTR_FMT "\n", rn, - &terminationEvent); - oneShotCode = LWP_SignalProcess(&terminationEvent); - if (oneShotCode) - fprintf(stderr, "[%s] Error %d from LWP_SignalProcess()", rn, - oneShotCode); - break; /*from the perpetual while loop */ - } /*One-shot execution */ - else { + break; + } else { /* * Continuous execution desired. Sleep for the required - * number of seconds. + * number of seconds or wakeup sooner if forced. */ - tv.tv_sec = xstat_fs_ProbeFreqInSecs; - tv.tv_usec = 0; - if (xstat_fs_debug) - printf("[%s] Falling asleep for %d seconds\n", rn, - xstat_fs_ProbeFreqInSecs); - code = IOMGR_Select(0, /*Num fids */ - 0, /*Descs ready for reading */ - 0, /*Descs ready for writing */ - 0, /*Descs w/exceptional conditions */ - &tv); /*Ptr to timeout structure */ - if (code) - fprintf(stderr, "[%s] IOMGR_Select returned code %d\n", rn, - code); + gettimeofday(&tv, NULL); + wait.tv_sec = tv.tv_sec + xstat_fs_ProbeFreqInSecs; + wait.tv_nsec = tv.tv_usec * 1000; + opr_mutex_enter(&xstat_fs_force_lock); + code = opr_cv_timedwait(&xstat_fs_force_cv, &xstat_fs_force_lock, &wait); + opr_Verify(code == 0 || code == ETIMEDOUT); + opr_mutex_exit(&xstat_fs_force_lock); } /*Continuous execution */ } /*Service loop */ return NULL; @@ -369,7 +355,7 @@ xstat_fs_LWP(void *unused) * * Description: * Initialize the xstat_fs module: set up Rx connections to the - * given set of File Servers, start up the probe and callback LWPs, + * given set of File Servers, start up the probe and callback threads, * and associate the routine to be called when a probe completes. * Also, let it know which collections you're interested in. * @@ -425,6 +411,9 @@ xstat_fs_Init(int a_numServers, struct sockaddr_in *a_socketArray, } else xstat_fs_initflag = 1; + opr_mutex_init(&xstat_fs_force_lock); + opr_cv_init(&xstat_fs_force_cv); + /* * Check the parameters for bogosities. */ @@ -532,17 +521,17 @@ xstat_fs_Init(int a_numServers, struct sockaddr_in *a_socketArray, /* * Create a null Rx client security object, to be used by the - * probe LWP. + * probe thread. */ secobj = rxnull_NewClientSecurityObject(); if (secobj == (struct rx_securityClass *)0) { fprintf(stderr, - "[%s] Can't create probe LWP client security object.\n", rn); + "[%s] Can't create probe thread client security object.\n", rn); xstat_fs_Cleanup(1); /*Delete already-malloc'ed areas */ return (-1); } if (xstat_fs_debug) - printf("[%s] Probe LWP client security object created\n", rn); + printf("[%s] Probe thread client security object created\n", rn); curr_conn = xstat_fs_ConnInfo; conn_err = 0; @@ -636,22 +625,14 @@ xstat_fs_Init(int a_numServers, struct sockaddr_in *a_socketArray, * Start up the probe LWP. */ if (xstat_fs_debug) - printf("[%s] Creating the probe LWP\n", rn); - code = LWP_CreateProcess(xstat_fs_LWP, /*Function to start up */ - LWP_STACK_SIZE, /*Stack size in bytes */ - 1, /*Priority */ - (void *)0, /*Parameters */ - "xstat_fs Worker", /*Name to use */ - &probeLWP_ID); /*Returned LWP process ID */ + printf("[%s] Creating the probe thread\n", rn); + code = pthread_create(&xstat_fs_thread, NULL, xstat_fs_LWP, NULL); if (code) { - fprintf(stderr, "[%s] Can't create xstat_fs LWP! Error is %d\n", rn, + fprintf(stderr, "[%s] Can't create xstat_fs thread! Error is %d\n", rn, code); xstat_fs_Cleanup(1); /*Delete already-malloc'ed areas */ return (code); } - if (xstat_fs_debug) - printf("[%s] Probe LWP process structure located at %" AFS_PTR_FMT "\n", rn, - probeLWP_ID); /* * Return the final results. @@ -667,7 +648,7 @@ xstat_fs_Init(int a_numServers, struct sockaddr_in *a_socketArray, * [exported] xstat_fs_ForceProbeNow * * Description: - * Wake up the probe LWP, forcing it to execute a probe immediately. + * Wake up the probe thread, forcing it to execute a probe immediately. * * Arguments: * None. @@ -699,7 +680,9 @@ xstat_fs_ForceProbeNow(void) /* * Kick the sucker in the side. */ - IOMGR_Cancel(probeLWP_ID); + opr_mutex_enter(&xstat_fs_force_lock); + opr_cv_signal(&xstat_fs_force_cv); + opr_mutex_exit(&xstat_fs_force_lock); /* * We did it, so report the happy news. @@ -864,14 +847,13 @@ xstat_fs_Wait(int sleep_secs) * One-shot operation; just wait for the collection to be done. */ if (xstat_fs_debug) - printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT - "\n", rn, &terminationEvent); - code = LWP_WaitProcess(&terminationEvent); + printf("[%s] Calling pthread_join\n", rn); + code = pthread_join(xstat_fs_thread, NULL); if (xstat_fs_debug) - printf("[%s] Returned from LWP_WaitProcess()\n", rn); + printf("[%s] Returned from pthread_join()\n", rn); if (code) { fprintf(stderr, - "[%s] Error %d encountered by LWP_WaitProcess()\n", + "[%s] Error %d encountered by pthread_join()\n", rn, code); } } else if (sleep_secs == 0) { @@ -881,15 +863,13 @@ xstat_fs_Wait(int sleep_secs) if (xstat_fs_debug) fprintf(stderr, "[ %s ] going to sleep ...\n", rn); while (1) { - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) { - fprintf(stderr, - "[ %s ] IOMGR_Select() returned non-zero value %d\n", - rn, code); + code = select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code < 0) { + fprintf(stderr, "[%s] select() error %d\n", rn, errno); break; } } @@ -901,15 +881,13 @@ xstat_fs_Wait(int sleep_secs) sleep_secs); tv.tv_sec = sleep_secs; tv.tv_usec = 0; - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) - fprintf(stderr, - "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, - code); + code = select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code < 0) + fprintf(stderr, "[%s] select() error %d\n", rn, errno); } return code; } diff --git a/src/xstat/xstat_fs_test.c b/src/xstat/xstat_fs_test.c index 59ec162a40..a066e8b6f3 100644 --- a/src/xstat/xstat_fs_test.c +++ b/src/xstat/xstat_fs_test.c @@ -21,6 +21,7 @@ #include "xstat_fs.h" /*Interface for xstat_fs module */ #include /*Command line interpreter */ #include +#include /* * Command line parameter indices. @@ -664,6 +665,8 @@ RunTheTest(struct cmd_syndesc *a_s, void *dummy) int freq; /*Frequency of polls */ int period; /*Time in minutes of data collection */ + opr_softsig_Init(); + /* * Are we doing one-shot measurements? */