1570af302Sopenharmony_ci#include "stdio_impl.h" 2570af302Sopenharmony_ci#include "lock.h" 3570af302Sopenharmony_ci#include "fork_impl.h" 4570af302Sopenharmony_ci#include <stdlib.h> 5570af302Sopenharmony_ci 6570af302Sopenharmony_ci#define DEFAULT_ALLOC_FILE (8) 7570af302Sopenharmony_ci 8570af302Sopenharmony_cistatic FILE *ofl_head = NULL; 9570af302Sopenharmony_cistatic FILE *ofl_free = NULL; 10570af302Sopenharmony_ci 11570af302Sopenharmony_cistatic volatile int ofl_lock[1]; 12570af302Sopenharmony_civolatile int *const __stdio_ofl_lockptr = ofl_lock; 13570af302Sopenharmony_ci 14570af302Sopenharmony_ciFILE **__ofl_lock() 15570af302Sopenharmony_ci{ 16570af302Sopenharmony_ci LOCK(ofl_lock); 17570af302Sopenharmony_ci return &FILE_LIST_HEAD(ofl_head); 18570af302Sopenharmony_ci} 19570af302Sopenharmony_ci 20570af302Sopenharmony_civoid __ofl_unlock() 21570af302Sopenharmony_ci{ 22570af302Sopenharmony_ci UNLOCK(ofl_lock); 23570af302Sopenharmony_ci} 24570af302Sopenharmony_ci 25570af302Sopenharmony_ciFILE *__ofl_alloc() 26570af302Sopenharmony_ci{ 27570af302Sopenharmony_ci FILE *fsb = NULL; 28570af302Sopenharmony_ci size_t cnt = 0; 29570af302Sopenharmony_ci FILE *f = NULL; 30570af302Sopenharmony_ci 31570af302Sopenharmony_ci LOCK(ofl_lock); 32570af302Sopenharmony_ci if (!FILE_LIST_EMPTY(ofl_free)) { 33570af302Sopenharmony_ci f = FILE_LIST_HEAD(ofl_free); 34570af302Sopenharmony_ci FILE_LIST_REMOVE(ofl_free); 35570af302Sopenharmony_ci UNLOCK(ofl_lock); 36570af302Sopenharmony_ci 37570af302Sopenharmony_ci return f; 38570af302Sopenharmony_ci } 39570af302Sopenharmony_ci UNLOCK(ofl_lock); 40570af302Sopenharmony_ci 41570af302Sopenharmony_ci /* alloc new FILEs(8) */ 42570af302Sopenharmony_ci fsb = (FILE *)malloc(DEFAULT_ALLOC_FILE * sizeof(FILE)); 43570af302Sopenharmony_ci if (!fsb) { 44570af302Sopenharmony_ci return NULL; 45570af302Sopenharmony_ci } 46570af302Sopenharmony_ci 47570af302Sopenharmony_ci LOCK(ofl_lock); 48570af302Sopenharmony_ci 49570af302Sopenharmony_ci for (cnt = 0; cnt < DEFAULT_ALLOC_FILE; cnt++) { 50570af302Sopenharmony_ci FILE_LIST_INSERT_HEAD(ofl_free, &fsb[cnt]); 51570af302Sopenharmony_ci } 52570af302Sopenharmony_ci 53570af302Sopenharmony_ci /* retrieve fist and move to next free FILE */ 54570af302Sopenharmony_ci f = FILE_LIST_HEAD(ofl_free); 55570af302Sopenharmony_ci FILE_LIST_REMOVE(ofl_free); 56570af302Sopenharmony_ci 57570af302Sopenharmony_ci UNLOCK(ofl_lock); 58570af302Sopenharmony_ci return f; 59570af302Sopenharmony_ci} 60570af302Sopenharmony_ci 61570af302Sopenharmony_civoid __ofl_free(FILE *f) 62570af302Sopenharmony_ci{ 63570af302Sopenharmony_ci LOCK(ofl_lock); 64570af302Sopenharmony_ci if (!f) { 65570af302Sopenharmony_ci UNLOCK(ofl_lock); 66570af302Sopenharmony_ci return; 67570af302Sopenharmony_ci } 68570af302Sopenharmony_ci 69570af302Sopenharmony_ci /* remove from head list */ 70570af302Sopenharmony_ci FILE_LIST_REMOVE(f); 71570af302Sopenharmony_ci 72570af302Sopenharmony_ci /* push to free list */ 73570af302Sopenharmony_ci FILE_LIST_INSERT_HEAD(ofl_free, f); 74570af302Sopenharmony_ci 75570af302Sopenharmony_ci UNLOCK(ofl_lock); 76570af302Sopenharmony_ci} 77