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