--- /datas2/moodles/moodle3.0.8/moodle/mod/forum/lib.php	2017-01-08 11:04:22.000000000 +0100
+++ /datas2/gitworkspace/moodle27/moodle2_version/mod/forum/lib.php	2017-01-20 10:35:25.436351418 +0100
@@ -449,7 +449,6 @@
  */
 function forum_cron() {
     global $CFG, $USER, $DB, $PAGE;
-
     $site = get_site();
 
     // The main renderers.
@@ -590,7 +589,9 @@
             $errorcount[$pid] = 0;
         }
     }
-
+    // UNISTRA DEV : prevent allowed memory size error.
+		$usercount=0;
+    // END UNISTRA DEV : prevent allowed memory size error.
     if ($users && $posts) {
 
         $urlinfo = parse_url($CFG->wwwroot);
@@ -599,7 +600,10 @@
         foreach ($users as $userto) {
             // Terminate if processing of any account takes longer than 2 minutes.
             core_php_time_limit::raise(120);
-
+            // UNISTRA DEV : prevent allowed memory size error.
+            //empty $ACCESSLIB_PRIVATE
+            $usercount++;
+            // END UNISTRA DEV : prevent allowed memory size error.
             mtrace('Processing user ' . $userto->id);
 
             // Init user caches - we keep the cache for one cycle only, otherwise it could consume too much memory.
@@ -882,6 +886,59 @@
             // Mark processed posts as read.
             forum_tp_mark_posts_read($userto, $userto->markposts);
             unset($userto);
+            // UNISTRA DEV : prevent allowed memory size error.
+            //empty $ACCESSLIB_PRIVATE
+            mtrace('memory usage $usercount '.$usercount.' = '.number_format(memory_get_usage(), 0, '.', ','));
+			if (property_exists($CFG,'forum_empty_acceslib_private_mod') && $CFG->forum_empty_acceslib_private_mod == 1 && $usercount>= ( (property_exists($CFG, 'forum_empty_acceslib_private_maxusercount') && !empty($CFG->forum_empty_acceslib_private_maxusercount))?$CFG->forum_empty_acceslib_private_maxusercount:100) ){
+				$usercount = 0;
+				//unset
+				mtrace('forum message sending : reaching '.(!empty($CFG->forum_empty_acceslib_private_maxusercount)?$CFG->forum_empty_acceslib_private_maxusercount:100).' user limit. Unsetting $ACCESSLIB_PRIVATE');
+				mtrace('memory usage before emptying '.number_format(memory_get_usage(), 0, '.', ','));
+				mtrace('time before '.date('Y-m-d H:i:s'));
+				// UNISTRA DEV : prevent allowed memory size error.
+				global $ACCESSLIB_PRIVATE;
+				// END UNISTRA DEV : prevent allowed memory size error.
+				unset($ACCESSLIB_PRIVATE->dirtycontexts);
+				foreach ($ACCESSLIB_PRIVATE->accessdatabyuser as $indexuser => $currentaccessdata){
+					foreach($currentaccessdata['ra'] as $indexra => $ra){
+						foreach($ra as $ira => $cra){
+							$ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['ra'][$indexra][$ira]=null;
+						}
+						unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['ra'][$indexra]);
+					}
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['ra']);
+					foreach($currentaccessdata['rdef'] as $indexrdef => $rdef){
+						unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['rdef'][$indexrdef]);
+					}
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['rdef']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['rdef_count']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['rdef_lcc']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['loaded']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['time']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]['rsw']);
+					unset($ACCESSLIB_PRIVATE->accessdatabyuser[$indexuser]);
+				}
+				foreach ($ACCESSLIB_PRIVATE->rolepermissions as $indexctx =>$permissionspercontext_array){
+					foreach ($permissionspercontext_array as $indexp => $permission){
+						unset($ACCESSLIB_PRIVATE->rolepermissions[$indexctx][$indexp]);
+					}
+					unset($ACCESSLIB_PRIVATE->rolepermissions[$indexctx]);
+				}
+
+				unset($ACCESSLIB_PRIVATE->accessdatabyuser);
+				unset($ACCESSLIB_PRIVATE->rolepermissions);
+				unset($ACCESSLIB_PRIVATE);
+				mtrace('time before collect'.date('Y-m-d H:i:s'));
+				mtrace('memory usage before gc '.number_format(memory_get_usage(), 0, '.', ','));
+				$cycles = gc_collect_cycles();
+				mtrace('time after collect '.date('Y-m-d H:i:s'));
+				$ACCESSLIB_PRIVATE = new stdClass();
+				$ACCESSLIB_PRIVATE->dirtycontexts    = null;    // Dirty contexts cache, loaded from DB once per page
+				$ACCESSLIB_PRIVATE->accessdatabyuser = array(); // Holds the cache of $accessdata structure for users (including $USER)
+				$ACCESSLIB_PRIVATE->rolepermissions  = array(); // role permissions cache - helps a lot with mem usage
+				mtrace('memory usage after emptying '.number_format(memory_get_usage(), 0, '.', ','));
+			}
+            // END UNISTRA DEV : prevent allowed memory size error.
         }
     }
 
