#include <kernel/kernel.h> #include <kernel/obj.h> #include <kernel/proc.h> #include <kernel/handle.h> #include <malloc.h> #include <errno.h> #include <wchar.h> #include <string.h> /*! * \ingroup obj * @{ */ //! Creates a marshalling handle for the specified object. /*! * \param proc The process which will use the marshalled object * \param ptr The interface to marshal * \return A marshalling handle to the interface provided, or NULL on * error. */ marshal_t objMarshal(process_t* proc, void* ptr) { int i; if (proc->marshal_map == NULL) { proc->marshal_map = (marshal_map_t*) hndAlloc(sizeof(marshal_t) * 256, proc); if (proc->marshal_map == NULL) return 0; memset(proc->marshal_map, NULL, sizeof(marshal_t) * 256); } for (i = 0; i < 255; i++) if (proc->marshal_map[i].ptr == ptr) return i; i = proc->last_marshal + 1; do { if (i > 255) { errno = EMFILE; return NULL; } i++; } while (proc->marshal_map[i].ptr != NULL); proc->last_marshal = i; proc->marshal_map[i].ptr = ptr; return i; } //! Retrieves the object referred to by the specified marshalling handle. /*! * \param proc The process which will uses the marshalled object * \param mshl The marshalling handle obtained from objMarshal() * \return The interface referred to by the specified marshalling handle, * or NULL on error. */ void* objUnmarshal(process_t* proc, marshal_t mshl) { if (proc->marshal_map && proc->marshal_map[mshl].ptr) return proc->marshal_map[mshl].ptr; else { errno = ENOTFOUND; return NULL; } } //! Notifies the kernel that the specified object has been deleted. /*! * Marshal handles to objects become invalid once the object they refer to * has been deleted. The kernel must be notified of any object deletions. * \param proc The process which used the marshalled object * \param mshl The marshalling handle obtained from objMarshal() */ void objNotifyDelete(process_t* proc, marshal_t mshl) { if (proc->marshal_map) proc->marshal_map[mshl].ptr = NULL; } //@}