#include <rpmsw.h>
#include "debug.h"
+#if defined(__LCLINT__)
+/*@-exportheader@*/
+extern int nanosleep(const struct timespec *req, /*@out@*/ struct timespec *rem)
+ /*@modifies rem @*/;
+/*@=exportheader@*/
+#endif
+
/*@unchecked@*/
static rpmtime_t rpmsw_overhead = 0;
rpmsw rpmswNow(rpmsw sw)
{
+/*@-noeffect@*/
if (!rpmsw_initialized)
- rpmswInit();
+ (void) rpmswInit();
+/*@=noeffect@*/
if (sw == NULL)
return NULL;
switch (rpmsw_type) {
/*@null@*/ const struct timeval * btv)
/*@*/
{
- rpmtime_t secs, usecs;
+ time_t secs, usecs;
if (etv == NULL || btv == NULL) return 0;
secs = etv->tv_sec - btv->tv_sec;
for (usecs = etv->tv_usec - btv->tv_usec; usecs < 0; usecs += 1000000)
}
#if defined(HP_TIMING_NOW)
+/*@-type@*/
static rpmtime_t rpmswCalibrate(void)
- /*@*/
+ /*@globals internalState @*/
+ /*@modifies internalState @*/
{
struct rpmsw_s begin, end;
rpmtime_t ticks;
req.tv_sec = 0;
req.tv_nsec = 20 * 1000 * 1000;
for (i = 0; i < 100; i++) {
+/*@-compdef@*/
rc = nanosleep(&req, &rem);
+/*@=compdef@*/
if (rc == 0)
break;
if (rem.tv_sec == 0 && rem.tv_nsec == 0)
return ticks;
}
+/*@=type@*/
#endif
+/*@-incondefs@*/
rpmtime_t rpmswInit(void)
+ /*@globals rpmsw_cycles, rpmsw_initialized, rpmsw_overhead,
+ rpmsw_type @*/
+ /*@modifies rpmsw_cycles, rpmsw_initialized, rpmsw_overhead,
+ rpmsw_type @*/
{
struct rpmsw_s begin, end;
rpmtime_t cycles, usecs;
return rpmsw_overhead;
}
+/*@=incondefs@*/
+
+/*@-mods@*/
+int rpmswEnter(rpmop op)
+{
+ op->count++;
+ (void) rpmswNow(&op->begin);
+ return 0;
+}
+
+int rpmswExit(rpmop op, ssize_t rc)
+{
+ struct rpmsw_s end;
+
+ op->usecs += rpmswDiff(rpmswNow(&end), &op->begin);
+ if (rc > 0)
+ op->bytes += rc;
+ return 0;
+}
+/*@=mods@*/