You are viewing a plain text version of this content. The canonical link for it is here.
Posted to site-cvs@tcl.apache.org by mx...@apache.org on 2015/12/21 15:15:59 UTC

svn commit: r1721165 - /tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c

Author: mxmanghi
Date: Mon Dec 21 14:15:58 2015
New Revision: 1721165

URL: http://svn.apache.org/viewvc?rev=1721165&view=rev
Log:
2 conditions model of communication with Apache and Tcl worker threads

Modified:
    tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c

Modified: tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c
URL: http://svn.apache.org/viewvc/tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c?rev=1721165&r1=1721164&r2=1721165&view=diff
==============================================================================
--- tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c (original)
+++ tcl/rivet/trunk/src/mod_rivet/rivet_lazy_mpm.c Mon Dec 21 14:15:58 2015
@@ -1,4 +1,4 @@
-/* rivet_aprthread_mpm.c: dynamically loaded MPM aware functions for threaded MPM */
+/* rivet_lazy_mpm.c: dynamically loaded MPM aware functions for threaded MPM */
 
 /*
     Licensed to the Apache Software Foundation (ASF) under one
@@ -52,8 +52,10 @@ enum
 };
 
 typedef struct lazy_tcl_worker {
-    apr_thread_mutex_t* mutex;
-    apr_thread_cond_t*  condition;
+    apr_thread_mutex_t* mutex1;
+    apr_thread_mutex_t* mutex2;
+    apr_thread_cond_t*  condition1;
+    apr_thread_cond_t*  condition2;
     int                 status;
     apr_thread_t*       thread_id;
     int                 idx;
@@ -89,14 +91,14 @@ static void* APR_THREAD_FUNC request_pro
     {
         apr_queue_push(module_globals->mpm->vhosts[w->idx].queue,w);
         apr_atomic_inc32(module_globals->mpm->vhosts[w->idx].idle_threads_cnt);
-        apr_thread_mutex_lock(w->mutex);
+        apr_thread_mutex_lock(w->mutex1);
         do {
-            apr_thread_cond_wait(w->condition,w->mutex);
+            apr_thread_cond_wait(w->condition1,w->mutex1);
         } while (w->status != init);
 
         apr_atomic_dec32(module_globals->mpm->vhosts[w->idx].idle_threads_cnt);
         w->status = processing;
-        apr_thread_mutex_unlock(w->mutex);
+        apr_thread_mutex_unlock(w->mutex1);
 
         /* Content generation */
 
@@ -105,20 +107,18 @@ static void* APR_THREAD_FUNC request_pro
         ap_rwrite(apr_pstrdup(w->r->pool,BASIC_PAGE),strlen(BASIC_PAGE),w->r);
         ap_rflush(w->r);
 
-        apr_thread_mutex_lock(w->mutex);
+        apr_thread_mutex_lock(w->mutex2);
         w->status = done;
         w->ap_sts = OK;
-        apr_thread_cond_signal(w->condition);
-        apr_thread_mutex_unlock(w->mutex);
+        apr_thread_cond_signal(w->condition2);
+        apr_thread_mutex_unlock(w->mutex2);
 
-        apr_thread_mutex_lock(w->mutex);
+        apr_thread_mutex_lock(w->mutex1);
         do {
-            apr_thread_cond_wait(w->condition,w->mutex);
+            apr_thread_cond_wait(w->condition1,w->mutex1);
         } while (w->status == done);
 
-        w->status = idle;
-        w->r      = NULL;
-        apr_thread_mutex_unlock(w->mutex);
+        apr_thread_mutex_unlock(w->mutex1);
 
     } while (1);
 
@@ -133,8 +133,10 @@ static lazy_tcl_worker* create_worker (a
 
     w->status = idle;
     w->idx = idx;
-    ap_assert(apr_thread_mutex_create(&w->mutex,APR_THREAD_MUTEX_UNNESTED,pool) == APR_SUCCESS);
-    ap_assert(apr_thread_cond_create(&w->condition, pool) == APR_SUCCESS); 
+    ap_assert(apr_thread_mutex_create(&w->mutex1,APR_THREAD_MUTEX_UNNESTED,pool) == APR_SUCCESS);
+    ap_assert(apr_thread_cond_create(&w->condition1, pool) == APR_SUCCESS); 
+    ap_assert(apr_thread_mutex_create(&w->mutex2,APR_THREAD_MUTEX_UNNESTED,pool) == APR_SUCCESS);
+    ap_assert(apr_thread_cond_create(&w->condition2, pool) == APR_SUCCESS); 
     apr_thread_create(&w->thread_id, NULL, request_processor, w, module_globals->pool);
 
     return w;
@@ -157,6 +159,8 @@ void Lazy_MPM_ChildInit (apr_pool_t* poo
     apr_atomic_set32(module_globals->mpm->first_available,0);
     */
 
+    module_globals->mpm->vhosts = (vhost *) apr_pcalloc(pool,module_globals->vhosts_count * sizeof(vhost));
+
     for (vh = 0; vh < module_globals->vhosts_count; vh++)
     {
         module_globals->mpm->vhosts[vh].idle_threads_cnt = 
@@ -164,7 +168,7 @@ void Lazy_MPM_ChildInit (apr_pool_t* poo
 
         apr_atomic_set32(module_globals->mpm->vhosts[vh].idle_threads_cnt,0);
         ap_assert (apr_queue_create(&module_globals->mpm->vhosts[vh].queue,
-                    MOD_RIVET_QUEUE_SIZE,module_globals->pool) != APR_SUCCESS);
+                    MOD_RIVET_QUEUE_SIZE,module_globals->pool) == APR_SUCCESS);
         
         create_worker(pool,vh);
     }
@@ -174,24 +178,35 @@ int Lazy_MPM_Request (request_rec* r,riv
 {
     lazy_tcl_worker*    w;
     apr_status_t        rv;
+    int                 ap_sts;
+    rivet_server_conf*  conf = RIVET_SERVER_CONF(r->server->module_config);
 
     do {
-        rv = apr_queue_pop(module_globals->mpm->vhosts[w->idx].queue, (void *)&w);
-
+        rv = apr_queue_pop(module_globals->mpm->vhosts[conf->idx].queue, (void *)&w);
     } while (rv == APR_EINTR);
 
-    apr_thread_mutex_lock(w->mutex);
+    apr_thread_mutex_lock(w->mutex1);
     w->r        = r;
     w->ctype    = ctype;
     w->status   = init;
-    apr_thread_cond_signal(w->condition);
+    w->idx      = conf->idx;
+    apr_thread_cond_signal(w->condition1);
+    apr_thread_mutex_unlock(w->mutex1);
 
+    apr_thread_mutex_lock(w->mutex2);
     do {
-        apr_thread_cond_wait(w->condition,w->mutex);
+        apr_thread_cond_wait(w->condition2,w->mutex2);
     } while (w->status != done);
 
-    apr_thread_mutex_unlock(w->mutex);
-    return w->ap_sts;
+    ap_sts = w->ap_sts;
+    apr_thread_mutex_unlock(w->mutex2);
+
+    apr_thread_mutex_lock(w->mutex1);
+    w->status = idle;
+    w->r      = NULL;
+    apr_thread_cond_signal(w->condition1);
+    apr_thread_mutex_unlock(w->mutex1);
+    return ap_sts;
 }
 
 rivet_thread_interp* Lazy_MPM_MasterInterp(void)



---------------------------------------------------------------------
To unsubscribe, e-mail: site-cvs-unsubscribe@tcl.apache.org
For additional commands, e-mail: site-cvs-help@tcl.apache.org