Index: memcache-session.inc
===================================================================
--- memcache-session.inc	(revision 2978)
+++ memcache-session.inc	(working copy)
@@ -151,6 +151,19 @@
       dmemcache_set($user->uid, $user, ini_get('session.gc_maxlifetime'), 'users');
     }
   }
+  
+  /* BEGIN PIPA HACK - sess_count() */
+  if(!$user->uid) {
+    $anonymous_count = dmemcache_get('anonymous_count', 'session');
+    $anonymous_count[$user->sid] = $session->timestamp;
+    dmemcache_set('anonymous_count', $anonymous_count, 0, 'session');
+  } else {
+    $authenticated_count = dmemcache_get('authenticated_count', 'session');
+    $authenticated_count[$user->sid] = $session->timestamp;
+    dmemcache_set('authenticated_count', $authenticated_count, 0, 'session');
+  }
+  unset($anonymous_count); unset($authenticated_count);
+  /* END PIPA HACK - sess_count() */
 
   return TRUE;
 }
@@ -183,6 +196,9 @@
 
   // Clear the old data from the cache.
   dmemcache_delete($old_session_id, 'session');
+  /* BEGIN PIPA HACK - sess_count() */
+  sess_cleanup_counter($old_session_id);
+  /* END PIPA HACK - sess_count() */
 }
 
 /**
@@ -191,6 +207,15 @@
  * Not implemented.
  */
 function sess_count($timestamp = 0, $anonymous = true) {
+  /* BEGIN PIPA HACK - sess_count() */
+  if($anonymous) {
+    $anonymous_count = dmemcache_get('anonymous_count', 'session');
+    return count($anonymous_count);
+  } else {
+    $authenticated_count = dmemcache_get('authenticated_count', 'session');
+    return count($authenticated_count);
+  }
+  /* END PIPA HACK - sess_count() */
 }
 
 /**
@@ -201,6 +226,9 @@
  */
 function sess_destroy_sid($sid) {
   dmemcache_delete($sid, 'session');
+  /* BEGIN PIPA HACK - sess_count() */
+  sess_cleanup_counter($sid);
+  /* END PIPA HACK - sess_count() */
 
   // If the session ID being destroyed is the one of the current user,
   // clean-up his/her session data and cookie.
@@ -234,6 +262,9 @@
   $user = dmemcache_get($uid, 'users');
   if (is_object($user) && isset($user->sid)) {
     dmemcache_delete($user->sid, 'session');
+    /* BEGIN PIPA HACK - sess_count() */
+    sess_cleanup_counter($user->sid);
+    /* END PIPA HACK - sess_count() */
   }
   dmemcache_delete($uid, 'users');
 }
@@ -245,6 +276,21 @@
   // for three weeks before deleting them, you need to set gc_maxlifetime
   // to '1814400'. At that value, only after a user doesn't log in after
   // three weeks (1814400 seconds) will his/her session be removed.
+  
+  /* BEGIN PIPA HACK - sess_count() */
+  $anonymous_count = dmemcache_get('anonymous_count', 'session');
+  foreach($anonymous_count as $sid => $time) {
+    if($time < time() - $lifetime) {
+      sess_cleanup_counter($sid);
+	}
+  }
+  $authenticated_count = dmemcache_get('authenticated_count', 'session');
+  foreach($authenticated_count as $sid => $time) {
+    if($time < time() - $lifetime) {
+      sess_cleanup_counter($sid);
+    }
+  }
+  /* END PIPA HACK - sess_count() */
   return TRUE;
 }
 
@@ -338,3 +384,25 @@
 
   return $user;
 }
+
+/* BEGIN PIPA HACK - sess_count() */
+/**
+ * This function is a custom PIPA function. As we are storing all sessions in a seperate array (which is stored in memcache),
+ * we need to have a possiblity to unstore the sessions too.
+ * 
+ * When this function is called, the sid in the array will be unset
+ * 
+ * @param $sid	the sid that needs to be unset
+ */ 
+function sess_cleanup_counter($sid) {
+  if ($sid) {
+    $anonymous_count = dmemcache_get('anonymous_count', 'session');
+    unset($anonymous_count[$sid]);
+    dmemcache_set('anonymous_count', $anonymous_count, 0, 'session');
+	
+    $authenticated_count = dmemcache_get('authenticated_count', 'session');
+    unset($authenticated_count[$sid]);
+    dmemcache_set('authenticated_count', $authenticated_count, 0, 'session');
+  }
+}
+/* END PIPA HACK - sess_count() */
