* Local functions (prototypes)
*/
- static int HgfsKReqZCtor(void *mem, int size, void *arg, int flags);
- static void HgfsKReqZDtor(void *mem, int size, void *arg);
- static int HgfsKReqZInit(void *mem, int size, int flags);
- static void HgfsKReqZFini(void *mem, int size);
+static int HgfsKReqZCtor(void *mem, int size, void *arg, int flags);
+static void HgfsKReqZDtor(void *mem, int size, void *arg);
+static int HgfsKReqZInit(void *mem, int size, int flags);
+static void HgfsKReqZFini(void *mem, int size);
/*
* Global functions (definitions)
HgfsKReqObject *req = (HgfsKReqObject *)mem;
ASSERT(size == sizeof *req);
- /*
- * Zero out the object. (Do NOT pass UMA_ZEROINIT to uma_zcreate, as
- * that will override this routine and zero everything -after- us.)
- */
+ /* Zero out the object. */
bzero(req, sizeof *req);
/*
/* Clear packet of request before allocating to clients. */
bzero(&req->__rpc_packet, sizeof req->__rpc_packet);
- bcopy(HGFS_SYNC_REQREP_CLIENT_CMD, req->__rpc_packet._command,
- HGFS_SYNC_REQREP_CLIENT_CMD_LEN);
return 0;
}
/* Initialize state & reference count. */
req->state = HGFS_REQ_ALLOCATED;
req->refcnt = 1;
-
- ASSERT(!strncmp(req->__rpc_packet._command, HGFS_SYNC_REQREP_CLIENT_CMD, HGFS_SYNC_REQREP_CLIENT_CMD_LEN));
-
return 0;
}
#include "request.h"
#include "requestInt.h"
#include "os.h"
-
-#include "hgfsBd.h"
+#include "channel.h"
/*
* See requestInt.h.
*/
HgfsKReqWState hgfsKReqWorkerState;
+HgfsTransportChannel *gHgfsChannel;
/*
DblLnkLst_Links *currNode, *nextNode;
HgfsKReqWState *ws = (HgfsKReqWState *)arg;
HgfsKReqObject *req;
- RpcOut *hgfsRpcOut = NULL;
- char const *replyPacket;
int ret = 0;
ws->running = TRUE;
+ gHgfsChannel = HgfsGetBdChannel();
+
for (;;) {
/*
* This loop spends most of its time sleeping until signalled by another
os_mutex_lock(hgfsKReqWorkItemLock);
while (!ws->exit && !DblLnkLst_IsLinked(&hgfsKReqWorkItemList)) {
- os_cv_wait(&hgfsKReqWorkItemCv, hgfsKReqWorkItemLock);
+ os_cv_wait(&hgfsKReqWorkItemCv, hgfsKReqWorkItemLock);
}
if (ws->exit) {
os_mutex_lock(req->stateLock);
switch (req->state) {
case HGFS_REQ_SUBMITTED:
- if (!HgfsBd_OpenBackdoor(&hgfsRpcOut)) {
- req->state = HGFS_REQ_ERROR;
- os_cv_signal(&req->stateCv);
- os_mutex_unlock(req->stateLock);
- os_mutex_unlock(hgfsKReqWorkItemLock);
- goto done;
+ if (gHgfsChannel->status != HGFS_CHANNEL_CONNECTED) {
+ if (!gHgfsChannel->ops.open(gHgfsChannel)) {
+ req->state = HGFS_REQ_ERROR;
+ os_cv_signal(&req->stateCv);
+ os_mutex_unlock(req->stateLock);
+ os_mutex_unlock(hgfsKReqWorkItemLock);
+ goto done;
+ }
}
break;
case HGFS_REQ_ABANDONED:
*/
os_mutex_unlock(hgfsKReqWorkItemLock);
- ret = HgfsBd_Dispatch(hgfsRpcOut, req->payload, &req->payloadSize,
- &replyPacket);
-
- /*
- * We have a response. (Maybe.) Re-lock the request, update its state,
- * etc.
- */
-
- os_mutex_lock(req->stateLock);
-
- if ((ret == 0) && (req->state == HGFS_REQ_SUBMITTED)) {
- bcopy(replyPacket, req->payload, req->payloadSize);
- req->state = HGFS_REQ_COMPLETED;
- } else {
- req->state = HGFS_REQ_ERROR;
- }
-
- os_cv_signal(&req->stateCv);
- os_mutex_unlock(req->stateLock);
+ ret = gHgfsChannel->ops.send(gHgfsChannel, req);
if (ret != 0) {
/*
* now. We do this because subsequent requests deserve a chance to
* reopen it.
*/
- HgfsBd_CloseBackdoor(&hgfsRpcOut);
+ gHgfsChannel->ops.close(gHgfsChannel);
}
done:
ws->running = FALSE;
- if (hgfsRpcOut != NULL ) {
- HgfsBd_CloseBackdoor(&hgfsRpcOut);
- }
-
+ gHgfsChannel->ops.close(gHgfsChannel);
os_thread_exit(0);
}