コード例 #1
0
ファイル: ulExcl.c プロジェクト: angelovescio/open-vm-tools
Bool
MXUser_TryAcquireExclLock(MXUserExclLock *lock)  // IN/OUT:
{
   Bool success;

   ASSERT(lock);
   MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL);

   if (MXUserTryAcquireFail(lock->header.name)) {
      return FALSE;
   }

   success = MXRecLockTryAcquire(&lock->recursiveLock);

   if (success) {
      MXUserAcquisitionTracking(&lock->header, FALSE);

      if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) {
         MXUserDumpAndPanic(&lock->header,
                            "%s: Acquire on an acquired exclusive lock\n",
                            __FUNCTION__);
      }
   }

   if (vmx86_stats) {
      MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);

      if (LIKELY(stats != NULL)) {
         MXUserAcquisitionSample(&stats->acquisitionStats, success, !success,
                                 0ULL);
      }
   }

   return success;
}
コード例 #2
0
ファイル: ulRec.c プロジェクト: AlissonGiron/open-vm-tools
Bool
MXUser_TryAcquireRecLock(MXUserRecLock *lock)  // IN/OUT:
{
   Bool success;

   ASSERT(lock);
   MXUserValidateHeader(&lock->header, MXUSER_TYPE_REC);
   ASSERT(Atomic_Read(&lock->refCount) > 0);

   if (UNLIKELY(lock->vmmLock != NULL)) {
      ASSERT(MXUserMX_TryLockRec);
      success = (*MXUserMX_TryLockRec)(lock->vmmLock);
   } else {
      if (MXUserTryAcquireFail(lock->header.name)) {
         success = FALSE;
         goto bail;
      }

      success = MXRecLockTryAcquire(&lock->recursiveLock);

      if (success) {
         MXUserAcquisitionTracking(&lock->header, FALSE);
      }

      if (vmx86_stats) {
         MXUserAcquireStats *acquireStats;

         acquireStats = Atomic_ReadPtr(&lock->acquireStatsMem);

         if (LIKELY(acquireStats != NULL)) {
            MXUserAcquisitionSample(&acquireStats->data, success, !success,
                                    0ULL);
         }
      }
   }

bail:
   return success;
}
コード例 #3
0
void
MXUser_PerLockData(void)
{
    MXRecLock *listLock = MXUserInternalSingleton(&mxLockMemPtr);

    if (mxUserStatsFunc == NULL) {
        return;
    }

    if (listLock && MXRecLockTryAcquire(listLock)) {
        ListItem *entry;
        uint32 highestSerialNumber;
        static uint32 lastReportedSerialNumber = 0;

        highestSerialNumber = lastReportedSerialNumber;

        LIST_SCAN(entry, mxUserLockList) {
            MXUserHeader *header = LIST_CONTAINER(entry, MXUserHeader, item);

            /* Log the ID information for a lock that did exist previously */
            if (header->bits.serialNumber > lastReportedSerialNumber) {
                MXUserStatsLog("MXUser: n n=%s l=%d r=0x%x\n", header->name,
                               header->bits.serialNumber, header->rank);

                if (header->bits.serialNumber > highestSerialNumber) {
                    highestSerialNumber = header->bits.serialNumber;
                }
            }

            /*
             * Perform the statistics action for any lock that has one.
             */

            if (header->statsFunc) {
                (*header->statsFunc)(header);
            }
        }