2 Copyright © 2012, The AROS Development Team. All rights reserved.
6 #include <aros/debug.h>
8 #include <exec/nodes.h>
9 #include <exec/lists.h>
11 #include "exec_intern.h"
12 #include "taskstorage.h"
14 /*****************************************************************************
17 #include <proto/exec.h>
19 AROS_LH2(BOOL
, SetTaskStorageSlot
,
22 AROS_LHA(LONG
, id
, D0
),
23 AROS_LHA(IPTR
, value
, D1
),
24 struct ExecBase
*, SysBase
, 184, Exec
)
27 The will remember the current state of the task storage slots
33 An id will be returned whit which the current state can be restored
34 using RestoreTaskStorageSlots().
35 NULL is returned when not enough memory was available.
44 AllocTaskStorageSlot()/FreeTaskStorageSlot()/GetTaskStorageSlot()
48 ******************************************************************************/
52 struct ETask
*et
= GetETask(FindTask(NULL
));
55 D(bug("SetTaskStorage: %p: Set TaskStorageSlot %d to %p\n", et
, id
, (APTR
)value
));
58 /* Only ETasks can do this */
59 D(bug("SetTaskStorage: Not an ETask!\n"));
65 D(bug("SetTaskStorage: Invalid ID %d\n", id
));
69 ts
= et
->et_TaskStorage
;
71 /* No TaskStorage? Allocate some. */
72 ULONG slots
= ((id
+ TASKSTORAGEPUDDLE
) / TASKSTORAGEPUDDLE
) * TASKSTORAGEPUDDLE
;
73 ts
= AllocMem(slots
* sizeof(ts
[0]), MEMF_ANY
| MEMF_CLEAR
);
75 D(bug("SetTaskStorage: Can't allocate %d slots\n", slots
));
79 ts
[__TS_FIRSTSLOT
] = slots
;
81 et
->et_TaskStorage
= ts
;
82 } else if (ts
[__TS_FIRSTSLOT
] <= id
) {
84 ULONG newslots
= ((id
+ TASKSTORAGEPUDDLE
) / TASKSTORAGEPUDDLE
) * TASKSTORAGEPUDDLE
;
85 size_t oldslots
= ts
[__TS_FIRSTSLOT
];
87 newts
= AllocMem(newslots
* sizeof(ts
[0]), MEMF_ANY
);
89 D(bug("SetTaskStorage: Can't allocate %d new slots\n", newslots
));
93 newts
[__TS_FIRSTSLOT
] = newslots
;
95 CopyMem(&ts
[__TS_FIRSTSLOT
+1], &newts
[__TS_FIRSTSLOT
+1],
96 (oldslots
-1) * sizeof(ts
[0]));
97 memset(&newts
[oldslots
], 0, (newslots
- oldslots
) * sizeof(ts
[0]));
99 et
->et_TaskStorage
= newts
;
100 FreeMem(ts
, oldslots
* sizeof(ts
[0]));
103 et
->et_TaskStorage
[id
] = value
;