diff options
Diffstat (limited to 'src/framework/mem/dmm_share.h')
-rw-r--r-- | src/framework/mem/dmm_share.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/framework/mem/dmm_share.h b/src/framework/mem/dmm_share.h new file mode 100644 index 0000000..0d0ff8f --- /dev/null +++ b/src/framework/mem/dmm_share.h @@ -0,0 +1,114 @@ +/* +* +* Copyright (c) 2018 Huawei Technologies Co.,Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef _DMM_SHARE_H_ +#define _DMM_SHARE_H_ + +#define DMM_SHARE_PATH_MAX 100 + +enum dmm_share_type +{ + DMM_SHARE_HEAP, + DMM_SHARE_FSHM, + DMM_SHARE_HUGE, + + DMM_SHARE_ANY = -1 +}; + +struct dmm_share +{ + int type; /* share type enum dmm_share_type */ + pid_t pid; /* owner/creator pid */ + void *base; /* base logical address */ + size_t size; /* memory size */ + char path[DMM_SHARE_PATH_MAX]; /* share path */ +}; + +int dmm_heap_create (struct dmm_share *share); +int dmm_heap_delete (struct dmm_share *share); +int dmm_heap_attach (struct dmm_share *share); +int dmm_heap_detach (struct dmm_share *share); + +int dmm_fshm_create (struct dmm_share *share); +int dmm_fshm_delete (struct dmm_share *share); +int dmm_fshm_attach (struct dmm_share *share); +int dmm_fshm_detach (struct dmm_share *share); + +int dmm_huge_create (struct dmm_share *share); +int dmm_huge_delete (struct dmm_share *share); +int dmm_huge_attach (struct dmm_share *share); +int dmm_huge_detach (struct dmm_share *share); + +#define DMM_SHARE_DISPATCH(share, action) \ +({ \ + int _r; \ + switch (share->type) \ + { \ + case DMM_SHARE_HEAP: \ + _r = dmm_heap_##action(share); \ + break; \ + case DMM_SHARE_FSHM: \ + _r = dmm_fshm_##action(share); \ + break; \ + case DMM_SHARE_HUGE: \ + _r = dmm_huge_##action(share); \ + break; \ + default: \ + _r = -1; \ + } \ + _r; \ +}) + +/* create share memory +input: share->type, share->size, share->pid +output: share->base, share->path +*/ +inline static int +dmm_share_create (struct dmm_share *share) +{ + return DMM_SHARE_DISPATCH (share, create); +} + +/* delete share memory +input: share->type, share->base, share->size, share->path +*/ +inline static int +dmm_share_delete (struct dmm_share *share) +{ + return DMM_SHARE_DISPATCH (share, delete); +} + +/* attach share memory +input: share->type share->path [share->size] [share->base] +output: share->base, share->size +*/ +inline static int +dmm_share_attach (struct dmm_share *share) +{ + return DMM_SHARE_DISPATCH (share, attach); +} + +/* attach share memory +input: share->type share->size share->base +*/ +inline static int +dmm_share_detach (struct dmm_share *share) +{ + return DMM_SHARE_DISPATCH (share, detach); +} + +#undef DMM_SHARE_DISPATCH + +#endif /* #ifndef _DMM_SHARE_H_ */ |