<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -115,23 +115,16 @@ extern &quot;C&quot; {
                              const rel_time_t exptime, const int nbytes);
 
       /**
-       * Free / destroy an item structure.
-       *
-       * @param handle Pointer to the instance
-       * @param item Pointer to the item to be deleted
-       */
-      void (*item_free)(struct engine_handle* handle, item* item);
-
-      /**
-       * Free / destroy an item structure some time in the future
+       * Delete an item. Note that this function will release your
+       * handle to the item)
        *
        * @param handle Pointer to the instance
        * @param item Pointer to the item to be deleted
        * @param exptime When the item should be deleted
        */
-      ENGINE_ERROR_CODE (*item_defer_delete)(struct engine_handle* handle,
-                                             item* item,
-                                             const rel_time_t exptime);
+      ENGINE_ERROR_CODE (*item_delete)(struct engine_handle* handle,
+                                       item* item,
+                                       const rel_time_t exptime);
 
       /**
        * Release the the &quot;refcount&quot; to an object (so that the engine may modify</diff>
      <filename>engine.h</filename>
    </modified>
    <modified>
      <diff>@@ -1438,18 +1438,11 @@ static void process_bin_delete(conn *c) {
     if (it) {
         uint64_t cas=swap64(req-&gt;message.header.request.cas);
         if (cas == 0 || cas == it-&gt;cas_id) {
-            if (exptime == 0) {
-                settings.engine-&gt;item_free(settings.engine, it);
-                /* release our reference */
-                settings.engine-&gt;item_release(settings.engine, it);
+            if (settings.engine-&gt;item_delete(settings.engine,
+                                             it, realtime(exptime)) == ENGINE_SUCCESS) {
                 write_bin_response(c, NULL, 0, 0, 0);
             } else {
-                if (settings.engine-&gt;item_defer_delete(settings.engine,
-                                                       it, realtime(exptime)) == ENGINE_SUCCESS) {
-                    write_bin_response(c, NULL, 0, 0, 0);
-                } else {
-                    write_bin_error(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0);
-                }
+                write_bin_error(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0);
             }
         } else {
             write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS, 0);
@@ -2119,19 +2112,11 @@ static void process_delete_command(conn *c, token_t *tokens, const size_t ntoken
 
     it = settings.engine-&gt;get(settings.engine, key, nkey);
     if (it) {
-        if (exptime == 0) {
-            settings.engine-&gt;item_free(settings.engine, it);
-            /* release our reference */
-            settings.engine-&gt;item_release(settings.engine, it);
+        if (settings.engine-&gt;item_delete(settings.engine, it,
+                                         realtime(exptime))== ENGINE_SUCCESS) {
             out_string(c, &quot;DELETED&quot;);
         } else {
-            /* our reference will be transfered to the delete queue */
-            if (settings.engine-&gt;item_defer_delete(settings.engine, it,
-                                                   realtime(exptime)) == ENGINE_SUCCESS) {
-                out_string(c, &quot;DELETED&quot;);
-            } else {
-                out_string(c, &quot;SERVER_ERROR out of memory expanding delete queue&quot;);
-            }
+            out_string(c, &quot;SERVER_ERROR out of memory expanding delete queue&quot;);
         }
     } else {
         out_string(c, &quot;NOT_FOUND&quot;);</diff>
      <filename>memcached.c</filename>
    </modified>
    <modified>
      <diff>@@ -52,7 +52,6 @@ static void slabber_destroy(struct engine_handle* handle);
 static item* slabber_item_allocate(struct engine_handle* handle, const void* key,
         const size_t nkey, const int flags, const rel_time_t exptime,
         const int nbytes);
-static void slabber_item_free(struct engine_handle* handle, item* item);
 static void slabber_item_release(struct engine_handle* handle, item* item);
 static item* slabber_get(struct engine_handle* handle, const void* key, const int nkey);
 static item* slabber_get_not_deleted(struct engine_handle* handle, const void* key, const int nkey, bool* delete_locked);
@@ -60,7 +59,7 @@ static char* slabber_get_stats(struct engine_handle* handle, const char* what_to
 static void slabber_update_lru_time(struct engine_handle* handle, item *item, const rel_time_t newtime);
 static ENGINE_ERROR_CODE slabber_store(struct engine_handle* handle, item* item, enum operation operation);
 static void slabber_flush(struct engine_handle* handle, time_t when);
-static ENGINE_ERROR_CODE slabber_item_defer_delete(struct engine_handle* handle, item* item, const rel_time_t exptime);
+static ENGINE_ERROR_CODE slabber_item_delete(struct engine_handle* handle, item* item, const rel_time_t exptime);
 static ENGINE_ERROR_CODE slabber_arithmetic(struct engine_handle* handle,
                                           const void* key,
                                           const int nkey,
@@ -98,8 +97,7 @@ ENGINE_HANDLE* create_instance(int version, ENGINE_ERROR_CODE* error) {
    handle-&gt;engine.destroy = slabber_destroy;
    handle-&gt;engine.item_size_ok = item_size_ok;
    handle-&gt;engine.item_allocate = slabber_item_allocate;
-   handle-&gt;engine.item_free = slabber_item_free;
-   handle-&gt;engine.item_defer_delete = slabber_item_defer_delete;
+   handle-&gt;engine.item_delete = slabber_item_delete;
    handle-&gt;engine.item_release = slabber_item_release;
    handle-&gt;engine.get = slabber_get;
    handle-&gt;engine.get_not_deleted = slabber_get_not_deleted;
@@ -248,16 +246,6 @@ static void slabber_item_release(struct engine_handle* handle, item* item) {
 }
 
 /*
- * Unlinks an item from the LRU and hashtable.
- */
-static void slabber_item_free(struct engine_handle* handle, item* item) {
-    struct slabber_engine* engine = get_handle(handle);
-    pthread_mutex_lock(&amp;engine-&gt;cache_lock);
-    do_item_unlink(engine, item);
-    pthread_mutex_unlock(&amp;engine-&gt;cache_lock);
-}
-
-/*
  * Moves an item to the back of the LRU queue.
  */
 static void slabber_update_lru_time(struct engine_handle* handle,
@@ -271,7 +259,7 @@ static void slabber_update_lru_time(struct engine_handle* handle,
 /*
  * Adds an item to the deferred-delete list so it can be reaped later.
  */
-static ENGINE_ERROR_CODE slabber_item_defer_delete(struct engine_handle* handle,
+static ENGINE_ERROR_CODE slabber_item_delete(struct engine_handle* handle,
                                                    item* it,
                                                    const rel_time_t exptime) {
 
@@ -280,28 +268,33 @@ static ENGINE_ERROR_CODE slabber_item_defer_delete(struct engine_handle* handle,
 
    pthread_mutex_lock(&amp;se-&gt;cache_lock);
 
-   if (se-&gt;delcurr &gt;= se-&gt;deltotal) {
-      item **new_delete = realloc(se-&gt;todelete,
-                                  sizeof(item *) * se-&gt;deltotal * 2);
-      if (new_delete) {
-         se-&gt;todelete = new_delete;
-         se-&gt;deltotal *= 2;
-      } else {
-         /*
-          * can't delete it immediately, user wants a delay,
-          * but we ran out of memory for the delete queue
-          */
-         /* release reference */
-         handle-&gt;item_release(handle, it);
-         ret = ENGINE_ENOMEM;
+   if (exptime == 0) {
+      do_item_unlink(se, it);
+      do_item_remove(se, it);
+   } else {
+      if (se-&gt;delcurr &gt;= se-&gt;deltotal) {
+         item **new_delete = realloc(se-&gt;todelete,
+                                     sizeof(item *) * se-&gt;deltotal * 2);
+         if (new_delete) {
+            se-&gt;todelete = new_delete;
+            se-&gt;deltotal *= 2;
+         } else {
+            /*
+             * can't delete it immediately, user wants a delay,
+             * but we ran out of memory for the delete queue
+             */
+            /* release reference */
+            do_item_remove(se, it);
+            ret = ENGINE_ENOMEM;
+         }
       }
-   }
 
-   if (ret == ENGINE_SUCCESS) {
-      /* use its expiration time as its deletion time now */
-      it-&gt;exptime = exptime;
-      it-&gt;it_flags |= ITEM_DELETED;
-      se-&gt;todelete[se-&gt;delcurr++] = it;
+      if (ret == ENGINE_SUCCESS) {
+         /* use its expiration time as its deletion time now */
+         it-&gt;exptime = exptime;
+         it-&gt;it_flags |= ITEM_DELETED;
+         se-&gt;todelete[se-&gt;delcurr++] = it;
+      }
    }
 
    pthread_mutex_unlock(&amp;se-&gt;cache_lock);</diff>
      <filename>slab_engine.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>80de6d802157229598cb9c5fd899582d36dead39</id>
    </parent>
  </parents>
  <author>
    <name>Trond Norbye</name>
    <email>tn202803@khepri38.(none)</email>
  </author>
  <url>http://github.com/tmaesaka/memcached/commit/f644256da6beae99c3b097c8b565270512453bd9</url>
  <id>f644256da6beae99c3b097c8b565270512453bd9</id>
  <committed-date>2008-05-22T03:09:05-07:00</committed-date>
  <authored-date>2008-05-22T03:09:05-07:00</authored-date>
  <message>Removed item_free from the engine API, and renamed item_defer_delete to item_delete</message>
  <tree>d237d8cfb62cf8eb6ec384b2ae8686c8ef4973fe</tree>
  <committer>
    <name>Trond Norbye</name>
    <email>tn202803@khepri38.(none)</email>
  </committer>
</commit>
